客户端连接 12、18c 报ORA-28040和ORA-01017 的解决方法
问题描述
oracle18c 数据库已经发布,在安装Oracle 18c数据库之后,客户端目前一般还是停留在10G、11G,如果客户端工具的版本是toad、plsql在连接12c、18c就会报如下两个错误:
ORA-28040: No matching authentication protocol ORA-01017: invalid username/password; logon denied
复制
一、ORA-28040报错解析
按照官方说法在服务端sqlnet.ora下需要添加如下参数。
SQLNET.ALLOWED_LOGON_VERSION_CLIENT SQLNET.ALLOWED_LOGON_VERSION_SERVE
复制
注意:参数和等号之间不要有空格,否则有可能参数不生效。
二、处理ORA-28040错误
SQLNET.ALLOWED_LOGON_VERSION=8
或者使用更高版本的客户端。
这里的n默认为11. 第一个参数是客户端连接到服务器的时候启作用,第二个是做为客户端去连接其它数据库的时候启作用。
这里修改如下:
[oracle@host02 admin]$ pwd /u01/app/oracle/product/18.3.0/dbhome_1/network/admin [oracle@host02 admin]$ more sqlnet.ora #SQLNET.ALLOWED_LOGON_VERSION_SERVER=11 #SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10 SQLNET.ALLOWED_LOGON_VERSION=8 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 SQLNET.ALLOWED_LOGON_VERSION_SERVE=10
复制
修改后使用reload 监听
[oracle@host02 admin]$ lsnrctl LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 13-FEB-2019 15:56:45 Copyright (c) 1991, 2018, Oracle. All rights reserved. Welcome to LSNRCTL, type "help" for information. LSNRCTL> reload Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) The command completed successfull
复制
三、ORA-01017错误
从错误提示看是用户名或者密码错误,其实用户名和密码没有问题。 这里的问题是我们配置的sqlnet对之前已经存在的帐号并没有生效,他们还保持在之前的兼容性。
使用alter修改密码
注意这里虽然SYS并没有改变,但是SYSTEM的版本已经加上了10G。实际上,现在这2个用户都可以连接了:
据Oracle官方的说法,这里是bug,所以如果以低版本的客户端连接18c,需要特别留意这2个错误。
此时sysem及sys就可以连接了。
总结
应该是oracle密码版本写入的时候使用的时11g和12c配置的规则,导致正确密码也无法通过验证。
在sqlnet.ora文件新增了参数后密码虽然支持n以上版本,但是此时由于密码规则事先写入,导致低版本客户端无法识别。
此时只需要alter user_name identified by passwd ;修改一遍即可了。官方明确说了不支持10g以下客户端,虽然是个BUG,但是保险起见还是把低版本客户端升级比较好。
关于SQLNET.ORA中的参数SQLNET.ALLOWED_LOGON_VERSION
一生产库上,alert日志中一直抛出SQLNET.ALLOWED_LOGON_VERSION = 10 被废弃的信息。
该生产库是12c,由于该服务器上存在多个生产库,不敢随便修改此参数,于是在metalink上查找一番:
看到这篇文章:Doc ID 1957995.1
有这么一段话:
This issue is caused by the default setting for allowed logon version in the 12 database.
Note that the SQLNET.ALLOWED_LOGON_VERSION parameter has been deprecated in 12c.
That parameter has been replaced by these:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=n
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n
The default setting for the new parameters is 11. Any client that attempts to connect must
be at version 11 or higher unless these parameters are explicitly set in the server side sqlnet.ora file.
可以看出,该参数在12c中已经被废弃了,被另外两个参数所取代(SQLNET.ALLOWED_LOGON_SERVER,SQLNET.ALLOWED_LOGON_CLIENT)。
接着看下SQLNET.ALLOWED_LOGON_VERSION的作用:
看文章:Doc ID 402193.1
Use the sqlnet.ora parameter SQLNET.ALLOWED_LOGON_VERSION to specify which authentication protocols are allowed by the client or database. This parameter defines the minimum Client Oracle version that is allowed to connect to the database. This parameter has been introduced in 10g which replaces the init.ora parameter DB_ALLOWED_LOGON_VERSION.
即该参数用来限制可以连接到数据库服务器上的最小客户端版本,比如设置值为10,即10g,11g等以上客户端版本可以连接到数据库服务器上。
参考:
https://blog.csdn.net/u013456370/article/details/76994624