问题背景

使用plsql9 连接Oracle 19c报错:
ORA-28040:没有匹配的验证协议
ORA-28040: No matching authentication protocol或ORA-03134: Connections to this server version are no longer supported错误

问题解决

方案一

升级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-clientMicrosoft 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位,不能混用。

方案二

步骤一: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

通过plsql9再次登录成功~

扩展

方案二 >> 步骤一中配置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 数据库版本。

ALLOWED_LOGON

_VERSION_SERVER 参数的值

生成的密码版本客户要求的能力对客户端的意义服务器以独占模式运行
12a12CO7L_MR只有 Oracle Database 12 c版本 112.1.0.2 或更高版本)客户端可以连接到服务器。是的,因为它不包括同时使用10G11G密码版本。
1211G12CO5L_NPOracle Database 11 g 2 版(11.2.0.3 或更高版本)客户端可以连接到服务器。是的,因为它不包括10G密码版本的使用。
较旧的客户端需要 CPUOct2012 或更高版本的关键补丁更新,以获得 O5L_NP 能力。
只有应用了关键补丁更新 CPUOct2012 或更高版本的旧客户端才能连接到服务器。
1110G11G,12CO5L使用 Oracle 数据库 10 g及更高版本的客户端可以连接到服务器。
使用早于 Oracle 数据库版本 11.2.0.3 且未应用关键补丁更新 CPUOct2012 或更高补丁的客户端必须使用10G密码版本。
1010G11G,12CO5L它与前一行具有相同的含义。
910G11G,12CO4L它与前一行具有相同的含义。
810G11G,12CO3L它与前一行具有相同的含义。

参考链接:Parameters for the sqlnet.ora File 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐