ora-01017错误大概率非密码本身问题,而是账户被锁(locked)或过期(expired)、sec_case_sensitive_logon开启导致大小写不匹配、sysdba远程登录缺少有效密码文件,或12c+客户端协议不兼容所致。

密码改了但登录还是ORA-01017,大概率不是密码本身的问题
账户状态被锁或过期时也会报ORA-01017
Oracle对锁定、过期、口令历史等状态不单独报错,统一返回ORA-01017,掩盖真实原因。即使刚用ALTER USER ... IDENTIFIED BY改完密码,只要账户状态是LOCKED或EXPIRED & LOCKED,照样登录失败。
- 必须用
sqlplus / as sysdba连上去查:SELECT username, account_status FROM dba_users WHERE username = 'YOUR_USER'; - 看到
LOCKED就执行ALTER USER your_user ACCOUNT UNLOCK; - 看到
EXPIRED且没带GRANT权限,直接ALTER USER your_user IDENTIFIED BY newpass;会重置状态;但如果profile限制了口令重用,可能仍卡在EXPIRED(GRACE),需先ALTER PROFILE default LIMIT PASSWORD_REUSE_TIME UNLIMITED;
SEC_CASE_SENSITIVE_LOGON开启后大小写不匹配
Oracle 11g起默认启用密码大小写敏感,改密码时如果用小写字符串(如IDENTIFIED BY abc123),而应用连接时传的是ABC123或混合大小写但不一致,就会认证失败——错误仍是ORA-01017。
- 检查当前设置:
SHOW PARAMETER sec_case_sensitive_logon,若返回TRUE,就得确认应用层传的密码大小写是否与建库/改密时完全一致 - 临时绕过(仅调试):
ALTER SYSTEM SET sec_case_sensitive_logon = FALSE SCOPE=BOTH;,但生产环境不建议长期关闭 - 更稳妥的做法是统一用双引号包住密码再改:
ALTER USER your_user IDENTIFIED BY "AbC123";,确保大小写固化
远程登录sysdba需要密码文件和remote_login_passwordfile=EXCLUSIVE
普通用户改密码不影响登录,但sys或system以AS SYSDBA方式远程连接时,依赖独立的密码文件(orapw$ORACLE_SID)和参数控制。改了密码却没同步更新密码文件,或remote_login_passwordfile仍是NONE或SHARED,就会ORA-01017。
- 确认密码文件存在:
ls $ORACLE_HOME/dbs/orapw$ORACLE_SID(Linux)或dir %ORACLE_HOME%\database\orapw%ORACLE_SID%(Windows) - 检查参数:
SHOW PARAMETER remote_login_passwordfile,必须是EXCLUSIVE - 若为
NONE,需重启库生效:ALTER SYSTEM SET remote_login_passwordfile = EXCLUSIVE SCOPE=SPFILE;,然后SHUTDOWN IMMEDIATE+STARTUP - 密码文件未更新?用
orapwd重建:orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=newpass entries=10
Oracle 12c+客户端协议不兼容导致协商失败
从12.1开始,Oracle默认启用更强的密码验证协议(如SHA-512),旧版客户端(比如11g client、某些JDBC thin driver老版本)无法完成握手,最终表现为ORA-01017,而非协议不支持类错误。
- 现象:本地
sqlplus能登,Java程序或PL/SQL Developer换机器就报错;tnsping通,sqlnet.ora里没配SQLNET.ALLOWED_LOGON_VERSION_SERVER - 临时解决(仅限测试环境):在服务器端
$ORACLE_HOME/network/admin/sqlnet.ora加一行:SQLNET.ALLOWED_LOGON_VERSION_SERVER=8(对应10g协议)或11(对应11g) - 根本解法:升级客户端驱动,或用
ALTER USER ... IDENTIFIED BY VALUES降级密码哈希(不推荐) - 注意:该参数只影响服务端接受的最低协议版本,设太低会削弱安全性
真正难排查的点往往藏在“改完密码就以为万事大吉”这个动作之后——账户状态、大小写策略、sysdba权限链、协议兼容性,四个地方任一缺失,都会让新密码形同虚设。动手前先看v$pwfile_users、dba_users.account_status、sec_case_sensitive_logon、remote_login_passwordfile这四个关键视图/参数,比反复重设密码高效得多。











