12C/19C Oracle连接提示ORA-28040 没有匹配的验证协议

12C/19C Oracle连接提示ORA-28040 没有匹配的验证协议

  • 一、错误场景
  • 二、解决方法
    • 方法1.升级instantclient的版本,比如使用:
    • 方法2
    • 扩展

一、错误场景

数据库升级19C后,客户端使用sqlplus、PL/SQl Developer等连接数据库提示

 ERROR:
ORA-28040: 没有匹配的验证协议

二、解决方法

方法1.升级instantclient的版本,比如使用:

instantclient-basic-windows.x64-19.3.0.0.0dbru;-- x64 64位客户端
instantclient-basic-nt-19.12.0.0.0dbru; – x86 32位客户端
跟plsql developer没有关系的。

注意:
1、plsql连接oracle数据库,是通过instance-client作为连接驱动的,跟plsql没关系;
2、instance-client对Microsoft Visual C++有依赖
Instant Client 19.* 要求 Visual Studio 2015 - 2019 redistributable。
Instant Client 12.2 要求 Visual Studio 2013 redistributable。
Instant Client 12.1 要求 Visual Studio 2010 redistributable。
Instant Client 11.2 要求 Visual Studio 2005 redistributable。
3、plsql developer <-> instance-client <-> visual c++ 三者必须同时是32位或64位,不能混用

方法2

步骤一:Oracle 19c Server端进行配置,$ORACLE_HOME/network/admin/sqlnet.ora 增加如下配置:

$ vi sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
步骤二:重建需要访问用户密码(使用旧密码即可、必须sqlplus登录修改)

$ sqlplus / as sysdba
SQL> alter user 用户名 identified by 密码;
SQL> select username,password_versions from dba_users where username = ‘C##USER1’
USERNAME PASSWORD_VERSIONS
C##USER1 10G 11G 12C复制
通过客户端工具再次登录成功

扩展

方案二 >> 步骤一中,配置sqlnet.ora文件,其实如果只是解决plsql客户端连接Oracle服务器问题,只设置SQLNET.ALLOWED_LOGON_VERSION_SERVER=8即可。

SQLNET.ALLOWED_LOGON_VERSION_SERVER:连接到 Oracle 数据库实例时允许的最低身份验证协议。
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:客户端允许的最小认证协议,当服务器作为客户端连接Oracle数据库实例时,例如:数据库链。
这两个参数的默认值是:12a

方案二 >> 步骤二中,修改完sqlnet.ora的配置,不修改相应用户密码,直接用plsql9(使用高版本客户端不会有问题:原本就没问题)访问Oracle 19c,则会报另外一个错:
ORA-01017:用户名/密码错误
ORA-01017: invalid username/password; logon denied
这是因为SQLNET.ALLOWED_LOGON_VERSION_SERVE改为8,只是参数变化,并没有重建密码,因此该account的实际password_versions仍然为:11G,12C;只有手动执行alter user后才会创建新的PASSWORD_VERSIONS:10G 11G 12C

方案二 >> 步骤二中,修改完sqlnet.ora的配置,不能远程登录修改相应用户密码,需在Oracle服务器上通过sqlplus工具进行修改。否则,PASSWORD_VERSIONS不会重新生成。访问数据库时,仍会报ORA-01017错误。

12c及以前版本Oracle数据库上,可以配置如下参数SQLNET.ALLOWED_LOGON_VERSION=8。自12c起,SQLNET.ALLOWED_LOGON_VERSION已经被弃用,但是12c配置后仍有效;

但是,在19c上该参数彻底无效了。
所以,Oracle 12c+版本请使用SQLNET.ALLOWED_LOGON_VERSION_SERVER、SQLNET.ALLOWED_LOGON_VERSION_CLIENT。

SQLNET.ALLOWED_LOGON_VERSION_SERVER配置的值,指身份验证协议的版本,而不是 Oracle 数据库版本。

12C/19C Oracle连接提示ORA-28040 没有匹配的验证协议_第1张图片

你可能感兴趣的:(数据库学习,oracle,数据库,microsoft)