Oracle 低版本客户端连接19C报错ORA-28040: 没有匹配的验证协议
如使用Oracle11.2客户端连接Oracle 19c的时候,报错:
ORA-28040: No matching authentication protocol
ORA-28040: 没有匹配的验证协议
...
问题原因:
原因客户端与服务器段的密码生成版本(dba_users.password_versions)不一致导致
Effect of SQLNET.ALLOWED_LOGON_VERSION_SERVER on Password Version Generatio
...
解决方法:
在数据库服务器上的$ORACLE_HOME/network/admin/sqlnet.ora文件添加相应参数
注:单实例或RAC都是此目录的sqlnet.ora文件
Oracle12c以下版本
SQLNET.ALLOWED_LOGON_VERSION=##
Oracle12c及以上版本
SQLNET.ALLOWED_LOGON_VERSION_SERVER=##
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=##
两者区别
SQLNET.ALLOWED_LOGON_VERSION_SERVER:控制可以连接到12c数据库的客户端版本(client -->12c server )
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:控制12c数据库可以连到哪些版本的数据库(12c server -->其它版本dbserver),例如:控制通过DB LINK可连接到哪些版本的oracle库。
添加参数以后无需重启数据库或监听,但需要重置数据库用户密码,否则会报错
===
虽然在sqlnet.ora加以下参数可以解决,
SQLNET.ALLOWED_LOGON_VERSION=8
但由于这个参数在12c已经废弃了,如果继续使用,会在alert/log.xml无穷无尽的报“Using deprecated SQLNET.ALLOWED_LOGON_VERSION parameter.”
因此,正确的做法是在$ORACLE_HOME/network/admin/sqlnet.ora加
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
....
区别如下:
SQLNET.ALLOWED_LOGON_VERSION_SERVER:控制可以连接到12c数据库的客户端版本(client —>orace 12c db )
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:控制12c数据库可以连到哪些版本的数据库(orace 12c db —>其它版本的oracle db),例如:控制通过DB LINK可连接到哪些版本的oracle库。
...
特别需要注意:
如果是RAC,因为RAC是使用grid的监听器,因此很多人以为是在“/u02/app/12.1.0/grid/network/admin/sqlnet.ora” 加“SQLNET.ALLOWED_LOGON_VERSION_SERVER=8”,其实这是错的,而是仍然在$ORACLE_HOME/network/admin/sqlnet.ora加“SQLNET.ALLOWED_LOGON_VERSION_SERVER=8”
...
这样设置后,有时仍会提示错误:ORA-01017: 用户名/口令无效; 登录被拒绝
可以关闭密码大写敏感,然后重设用户密码。
--关闭密码大写敏感
show parameter sec_case_sensitive_logon
alter system set sec_case_sensitive_logon = false;
Tag: Oracle19c Oracle错误