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

当数据库升级到19C后,使用sqlplus或PL/SQLDeveloper连接时可能遇到ORA-28040错误。解决方法包括升级instantclient到对应版本,确保与VisualC++运行库兼容,以及在sqlnet.ora文件中配置SQLNET.ALLOWED_LOGON_VERSION_CLIENT和SQLNET.ALLOWED_LOGON_VERSION_SERVER为8,同时可能需要更新用户密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、错误场景
数据库升级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 数据库版本。

在这里插入图片描述

<think>我们正在处理一个关于Kettle连接Oracle数据库时出现ORA-28040错误的用户查询。根据引用内容,这个错误通常发生在使用低版本客户端连接高版本数据库(如12c或19c)时。我们将结合引用内容提供解决方案。引用[1]和[2]提到,可以通过修改数据库端的sqlnet.ora文件来解决,具体是添加一行配置:SQLNET.ALLOWED_LOGON_VERSION=8。同时,引用[1]指出修改后需要重新修改用户密码生效(但引用[2]没有提到需要修改密码,实际中可能不需要,但为了确保,我们可以建议用户如果不行再修改密码)。引用[4]则针对Kettle环境,建议删除Kettle的lib目录下旧的ojdbc.jar,以避免冲突,并使用正确版本的JDBC驱动。因此,我们可以总结以下步骤:步骤1:在Oracle数据库服务器上修改sqlnet.ora文件,添加一行:SQLNET.ALLOWED_LOGON_VERSION=8然后重启数据库监听(或重启数据库)以使配置生效。步骤2:如果步骤1后问题仍然存在,可能需要重置相关用户的密码(因为引用[1]提到需要重新修改用户密码生效)。步骤3:在Kettle客户端,检查lib目录下的JDBC驱动(ojdbc.jar)版本。删除旧的驱动,下载与Oracle数据库版本匹配的JDBC驱动(如12c对应ojdbc8.jar,19c也推荐使用ojdbc8.jar),并放入lib目录。引用[3]提供了OracleJDBC驱动的下载地址:https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html注意:引用[4]特别强调了删除旧的ojdbc.jar的重要性,以避免冲突。因此,我们将按照这些步骤给出解答。同时,根据系统指令,我们需要在行内数学表达式(如果有的话)使用$...$,独立公式使用$$...$$,但本问题不涉及数学公式,所以主要注意格式和中文回答。另外,生成相关问题。</think>针对 Kettle 连接 Oracle 数据库时出现的 **ORA-28040: No matching authentication protocol** 错误,以下是综合解决方案: ### 错误原因 该错误通常发生在低版本客户端连接高版本 Oracle 数据库(如 12c/19c)时,身份验证协议不兼容导致。Kettle 使用的 JDBC 驱动版本过旧是常见原因。 --- ### 解决方案 #### 方法 1:修改数据库配置(推荐) 1. **在 Oracle 服务器端** 修改 `$ORACLE_HOME/network/admin/sqlnet.ora` 文件 添加配置(允许低版本协议): ```ini SQLNET.ALLOWED_LOGON_VERSION=8 ``` > 📌 注:`8` 对应 Oracle 11g 验证协议,`12` 对应 12c+ 协议[^2] 2. **重启数据库监听**: ```bash lsnrctl stop lsnrctl start ``` 3. **重置用户密码**(重要): ```sql ALTER USER <your_username> IDENTIFIED BY <new_password>; ``` > ⚠️ 引用[1]确认必须重置密码才能生效 #### 方法 2:更新 Kettle JDBC 驱动 1. **删除旧驱动**: 移除 Kettle `lib/` 目录下所有 `ojdbc*.jar` 文件(如 `ojdbc6.jar`)[^4] 2. **下载新驱动**: 从 [Oracle JDBC 下载页](https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html) 获取: - Oracle 12c/19c → 选择 `ojdbc8.jar`(JDK 8+) - Oracle 23c → 选择 `ojdbc11.jar` 3. **放入 Kettle**: 将新驱动复制到 `kettle/data-integration/lib/` 目录 #### 方法 3:客户端降级兼容(临时方案) 在 Kettle 启动脚本 `spoon.sh` 或 `Spoon.bat` 中添加 JVM 参数: ```bash -Doracle.jdbc.thinLogonCapability=o3 ``` > 💡 仅用于临时测试,长期使用推荐方法 1 或 2[^3] --- ### 验证步骤 1. 重启 Kettle 2. 测试 Oracle 连接: ```sql -- 使用 SQL 工具验证 SELECT * FROM v$version; ``` 3. 在 Kettle 中新建数据库连接,使用更新后的驱动 > ✅ **优先级建议**: > 生产环境 → **方法 1(服务器配置)** > 无服务器权限 → **方法 2(更新驱动)** --- ### 补充说明 - **驱动冲突**:确保 `lib/` 目录仅保留一个正确版本的 `ojdbc.jar`[^4] - **密码策略**:修改 `sqlnet.ora` 后**必须重置用户密码**才能生效[^1] - **协议版本**: - `SQLNET.ALLOWED_LOGON_VERSION=8` → 兼容 11g 客户端 - `SQLNET.ALLOWED_LOGON_VERSION=11` → 兼容 12c 客户端 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值