ora-01017是连接成功但认证失败,根源在凭证校验环节;需用sql*plus直连验证、检查sec_case_sensitive_logon设置、确认账户状态与create session权限、排查pdb连接串及jdbc驱动兼容性。
ora-01017 不是连不上数据库,而是连接已通、认证被拒——问题一定出在凭证校验环节,不是网络或监听配置的问题。
用 SQL*Plus 直连验证是否真密码错
所有 GUI 工具、IDE、应用配置都可能隐藏空格、换行、BOM、大小写转换等干扰。必须用最原始方式验证:
- 在应用服务器或客户端本机执行:
sqlplus "user/Pass@123@//host:1521/orclpdb1"(双引号包裹,含特殊字符时必加) - 若
sqlplus user/pass@orcl(全小写)失败,但加引号后成功 → 基本锁定为SEC_CASE_SENSITIVE_LOGON=TRUE导致 - Windows 下从记事本/邮件复制的密码,极可能带 UTF-8 BOM 或末尾
\r\n,sqlplus不报错但 Oracle 服务端字节比对失败
检查 SEC_CASE_SENSITIVE_LOGON 是否启用
Oracle 11g 起默认开启该参数,旧密码(如全小写)在升级后会突然失效:
- 用
SYSDBA登录后执行:SHOW PARAMETER sec_case_sensitive_logon,返回TRUE即启用 - 临时关闭验证(仅用于定位):
ALTER SYSTEM SET sec_case_sensitive_logon = FALSE SCOPE=BOTH - 关闭后务必重设一次密码:
ALTER USER user IDENTIFIED BY "Pass@123",否则旧哈希与新策略不兼容 - .NET 或 Java 应用中,用户名含小写字母/下划线、密码含
@/$//等字符时,Connection String中必须用英文双引号包裹对应字段
确认用户状态和权限是否完整
账户锁定、过期、无 CREATE SESSION 权限,Oracle 统一返回 ORA-01017,不提示真实原因:
- 查状态:
SELECT username, account_status, expiry_date FROM dba_users WHERE username = 'USER' - 若为
LOCKED或EXPIRED & LOCKED:ALTER USER user ACCOUNT UNLOCK+ALTER USER user IDENTIFIED BY "newpass" - 新建用户后必须显式授权:
GRANT CREATE SESSION TO user,仅CREATE USER不足以登录 - 12c+ 多租户环境下,用户实际存在于 PDB,但连接串误用 SID(如
@host:1521:ORCL)会路由到 CDB 根,导致“用户不存在”式认证失败
排查 JDBC 驱动与服务端协议兼容性
ORA-01017 在 Java 应用中高频出现于驱动版本不匹配场景,sqlplus 可连但 JDBC 死活报错:
- Oracle 19c/21c 必须使用
ojdbc11.jar或更高(JDK 11+ 编译),ojdbc8.jar仅支持到 12.2 - 检查 classpath 是否混入多个 ojdbc 版本(尤其 Tomcat
lib/下残留旧包) - 19c 默认禁用旧密码算法,若
dba_users.password_versions显示10G,说明用户是从 10g/11g 导入,需强制重设密码触发新哈希生成 -
sqlnet.ora中若配置了SQLNET.AUTHENTICATION_SERVICES = (NTS),会优先走 Windows OS 认证,跳过用户名密码校验 —— 测试时可临时改为(NONE)
真正麻烦的从来不是参数开关或命令拼写,而是那些看不见的字符、协议协商时的静默降级、以及不同组件对同一错误码的统一掩盖。验证时一定要控制变量:同一台机器、同一套凭据、最简命令行工具,绕开所有中间层。否则你改的可能根本不是问题所在。











