ORA-28040错误本质是客户端与数据库认证协议不匹配,需在数据库服务器端$ORACLE_HOME/network/admin/sqlnet.ora中配置SQLNET.ALLOWED_LOGON_VERSION_SERVER=10并重启监听器,而非修改客户端或驱动。
ora-28040 不是驱动没加对,也不是密码错了,而是客户端和数据库在“用哪套加密规则握手”这件事上彻底谈崩了。解决它,优先改服务端 sqlnet.ora 中的 sqlnet.allowed_logon_version_server,而不是重装客户端或硬降驱动。
确认你改的是数据库服务器上的 sqlnet.ora,不是客户端的
这个参数只在数据库服务端生效,客户端改了完全没用。常见误操作是:开发在自己电脑上改了本地 sqlnet.ora,然后抱怨“配置写了还是连不上”。必须登录数据库服务器,找到真实路径:
-
$ORACLE_HOME/network/admin/sqlnet.ora(单实例或 RAC 的 database 软件目录下) - 注意别进
$GRID_HOME或客户端安装目录 —— 那些路径下的文件对服务端连接无影响 - 如果
$TNS_ADMIN环境变量被设置,监听器会优先读那个路径,得一并检查
SQLNET.ALLOWED_LOGON_VERSION_SERVER 设多少才合适
值越小兼容性越强,但安全风险越高。Oracle 12c R2 及以后已废弃 SQLNET.ALLOWED_LOGON_VERSION(无后缀),继续用会刷屏告警日志。
-
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10:兼容 Oracle 10g/11g 客户端,包括 PL/SQL Developer、Toad、老版 JDBC(如 ojdbc6),是生产环境较稳妥的起点 -
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 11:仅允许 12c+ 客户端,安全性更高,但会直接拒绝 11g 客户端 -
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 8:理论上兼容最老系统,但 Oracle 12.2+ 已移除对该值的支持,设了也无效;19c/21c 更是完全不认
示例配置(追加到 sqlnet.ora 文件末尾即可):
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10
改完必须重启监听器,reload 不行
这个参数是监听器启动时一次性加载的静态配置,lsnrctl reload 不会重新读取。不重启,等于没改。
立即学习“Java免费学习笔记(深入)”;
- 执行
lsnrctl stop→lsnrctl start - 确认监听器已加载新配置:用
lsnrctl status查看输出中是否包含 “Listening Endpoints Summary...”,再连一次测试 - 如果监听器启不来,检查
sqlnet.ora是否有语法错误(比如多了一个等号、引号不配对)
JDBC 应用连不上?先查驱动有没有混用
即使服务端设了 = 10,Java 应用仍报 ORA-28040,大概率是 classpath 里混进了多个版本的 Oracle 驱动 jar。
- 检查项目
lib/目录或 Maven 依赖树:mvn dependency:tree | grep oracle - 常见冲突:同时存在
ojdbc6.jar和ojdbc8.jar,JVM 加载了旧的那个 - Oracle 官方推荐:JDBC 连 12c+ 数据库,最低使用
ojdbc7.jar(JDK 7+),但ojdbc8.jar是当前最稳的选择,支持 12c 到 21c - Spring Boot 用户额外注意:
application.properties中不要硬编码过时的驱动类名,如oracle.jdbc.driver.OracleDriver;应使用oracle.jdbc.OracleDriver(ojdbc7+ 新类名)
复杂点在于:服务端参数只是“允许低版本协议”,但最终能否成功握手,还取决于 JDBC 驱动自身是否实现了对应协议协商逻辑 —— 这就是为什么光改 sqlnet.ora 有时不够,驱动也得同步升级。


















