【一】环境说明
1.1 Oracle服务端版本:12.2.0.1
1.2 Oracle客户端版本:11.2.0.1
【二】问题说明
2.1 客户端连接服务端的时候报ORA-28040的错误。
2.2 客户端连接的时候报ORA-01017的错误。
【三】解决方法
3.1 ORA-28040错误的解决方法:
在数据库服务器上的oracle/network/admin/sqlnet.ora,增加如下
[oracle@rdb02 admin]$ cat sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
然后重启监听即可
lsnrctl
stop
lsnrctl start
lsnrctl start
3.2 客户端连接的时候报ORA-01017的错误的解决方法:
在上一步的基础上面,修改用户名密码即可;
SQL> ALTER USER system IDENTIFIED BY 12345678;
【四】原因分析
4.1 关于ORA-28040的错误原因,转发个链接:
http://blog.itpub.net/28612416/viewspace-2138896/
简单可以理解:sqlnet值没设定的情况下ORACLE 12C的服务端只运行12C的客户端进行连接,所以通过11版本的客户端连接的时候就会报ORA-28040的错误。通过增加以上参数就可以让ORACLE12C的服务端运行较低的客户端进行连接;
4.2 关于密码报ORA-01017错误的分析如下:
- 数据库的密码是经过加密的,数据库经过几个版本的更新每个版本的加密方法其实都是不一样的。
- dba_users有保存一个PASSWORD_VERSIONS的信息,PASSWORD_VERSIONS的信息说明数据库保留密码解析的版本种类。
- 用户登录的时候就会根据Client端的版本判断用哪种的解析方法进行解密
- 客户端的版本和PASSWORD_VERSIONS的版本匹配能解析,否则就解析不了;
SQL> select username,password,PASSWORD_VERSIONS from dba_users where username in ('SCOTT','SYSTEM')
USERNAME PASSWORD PASSWORD_VERSIONS
-------------------- -------------------- --------------------
SYSTEM 11G 12C #要求客户端的版本最低为11.2.0.3
SCOTT 10G 11G 12C #要求客户端的版本最低为10
4.3 PASSWORD_VERSIONS版本又是怎么产生的了?
PASSWORD_VERSIONS的生跟上面的sqlnet.ora的一个参数:SQLNET.ALLOWED_LOGON_VERSION_SERVER。SQLNET.ALLOWED_LOGON_VERSION_SERVER设置不同值,就产生对应的password_versions。
所以当SQLNET.ALLOWED_LOGON_VERSION_SERVER=8时,PASSWORD_VERSIONS对应的值就是10G 11G 12C
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8,PASSWORD_VERSIONS对应的值就是11G 12C
PASSWORD_VERSIONS的生跟上面的sqlnet.ora的一个参数:SQLNET.ALLOWED_LOGON_VERSION_SERVER。SQLNET.ALLOWED_LOGON_VERSION_SERVER设置不同值,就产生对应的password_versions。
所以当SQLNET.ALLOWED_LOGON_VERSION_SERVER=8时,PASSWORD_VERSIONS对应的值就是10G 11G 12C
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8,PASSWORD_VERSIONS对应的值就是11G 12C