90%的SYS密码丢失可用connect / as sysdba + ALTER USER SYS IDENTIFIED BY解决,无需重启或重生成PWD文件;其原理是本地OS认证(NTS/BEQ),要求用户属ora_dba或dba组。

能直接改就别碰密码文件——90%的SYS密码丢失,用connect / as sysdba + ALTER USER SYS IDENTIFIED BY就能解决,根本不用重启实例或生成新PWD文件。
为什么sqlplus /nolog → conn / as sysdba能绕过密码登录
Oracle在本地Windows/Linux上默认启用OS认证(SQLNET.AUTHENTICATION_SERVICES=(NTS)或(BEQ)),只要当前系统用户属于ora_dba组(Windows)或dba组(Linux),就能以/ as sysdba方式免密连接。这是最轻量、最安全的恢复路径。
常见误判是以为“连不上sqlplus就是密码问题”,其实可能是:
– 没以管理员身份运行cmd(Windows)
– ORACLE_SID没设对(查注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_*或服务名OracleServiceXXX)
– sqlnet.ora里被手动删了SQLNET.AUTHENTICATION_SERVICES行
orapwd命令静默失败的三大雷区
orapwd不是交互式工具,漏参数、路径错、权限不足都会静默退出,只报OPW-00001: invalid argument,但很多人没注意控制台最后一行。
- 必须同时指定
file和password,缺一不可:例如orapwd file=%ORACLE_HOME%\database\PWDorcl.ora password=MyNewPass123 - 路径不能含空格或中文;Windows下推荐用短路径如
C:\oracle\product\11.2.0\dbhome_1\database\ -
force=y在Windows上基本无效——因为PWD*.ora常被Oracle服务进程独占锁定;更可靠的是先手动重命名原文件(如ren PWDorcl.ora PWDorcl.ora.bak),再执行orapwd
改完密码文件后仍连不上?一定是忘了这步
密码文件只在实例启动时加载一次。用orapwd生成新文件后,必须重启数据库实例,否则sqlplus sys/<newpwd> as sysdba</newpwd>一定报ORA-01017。
验证是否生效:
– 重启后登录,执行SELECT * FROM v$pwfile_users;,确认SYS行的SYSDBA列为TRUE
– SHOW PARAMETER remote_login_passwordfile必须返回EXCLUSIVE;若为SHARED或NONE,密码文件被完全忽略
– 登录命令必须带完整角色关键字:sqlplus sys/<newpwd> as sysdba</newpwd>(不能写成as sys dba或漏空格)
用SPARE4哈希值还原密码的适用边界
这个方法只适用于已知目标用户(比如SYS)当前哈希值,且数据库还能正常启动、能查SYS.USER$表的情况。它本质是“复刻旧密码”,不是“找回明文”。
操作链很脆弱:
– 必须用ALTER USER ... IDENTIFIED BY VALUES 'S:xxx;T:yyy',写错大小写、漏分号、多空格都会失败
– SPARE4列值在11g中是SHA-1加盐哈希,无法反向破解,只能原样复用
– 如果原密码文件已损坏、实例无法启动,这条路直接走不通
真正紧急时,优先走OS认证路径;只有当connect / as sysdba也失败(比如ora_dba组被清空、sqlnet.ora被改)才动orapwd,且务必记住:改完必重启、路径要干净、参数要给全。


















