Oracle 19c中remote_login_passwordfile必须设为EXCLUSIVE才能支持本地“/ as sysdba”认证;若为NONE或SHARED,即使重建密码文件也无效,且必须重启实例生效。

remote_login_passwordfile 必须设为 EXCLUSIVE
Oracle 19c 默认安装后该参数常为 NONE 或 SHARED,但 / as sysdba 本地认证只认 EXCLUSIVE。不改这个,重建密码文件也没用。
检查当前值:SQL> show parameter remote_login_passwordfile
若返回 NONE 或 SHARED,执行:ALTER SYSTEM SET remote_login_passwordfile=EXCLUSIVE SCOPE=SPFILE;
然后必须重启实例,否则新设置不生效 —— 这是很多人卡住的第一步。
orapwd 命令缺一不可的三个参数
orapwd 不是交互式工具,漏掉任一关键参数就静默失败(无报错、无文件、或生成 0 字节空文件),尤其容易栽在 Windows 下。
-
file=:必须显式指定完整路径,Linux 下典型路径是$ORACLE_HOME/dbs/orapw$ORACLE_SID;Windows 是%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora -
password=:仅设定SYS用户的密码,不是 SYSTEM 或其他用户;该值会直接写入密码文件,后续登录sqlplus sys/<password> as sysdba才能通过 -
force=y:推荐加上,避免因原文件存在而报OPW-00002;但注意 Windows 下若原文件被占用(如 ASM 正在读取),force=y可能失效,更稳妥的是先手动重命名原orapw*文件
示例(Linux):orapwd file=$ORACLE_HOME/dbs/orapwORCLCDB password=mypass123 force=y
文件权限和属主不能错(Linux 下最常踩的坑)
即使 orapwd 成功生成了文件,如果权限或属主不对,Oracle 实例启动时会拒绝加载它,/ as sysdba 仍报 ORA-01031: insufficient privileges。
- 属主必须是运行 Oracle 实例的 OS 用户(通常是
oracle) - Linux 权限必须是
640:chmod 640 $ORACLE_HOME/dbs/orapw$ORACLE_SID - 检查 SELinux 上下文:
ls -Z $ORACLE_HOME/dbs/orapw*;若上下文异常(如unconfined_u:object_r:user_home_t:s0),需用restorecon修复
Windows 下则必须以管理员身份运行 CMD,否则 orapwd 写入 %ORACLE_HOME%\database\ 会因 UAC 拒绝访问而失败。
RAC 环境下密码文件不在本地磁盘
Oracle 19c RAC 默认把 ASM 和数据库实例的密码文件统一存于 ASM 磁盘组中,不是 $ORACLE_HOME/dbs/。直接在节点本地重建 orapw 文件无效。
正确做法分两步:
- 先确认密码文件位置:
asmcmd ls +ASM/PASSWORD/(或查V$PWFILE_USERS和 OCR 中的CRSUSER__ASM_00X密码) - 用
asmcmd工具重建:asmcmd --nocp credfix(19.8+);低于 19.8 则需从 OCR 提取密码后手动创建并asmcmd cp上传到 ASM
忽略这点,在 RAC 单节点上反复修本地文件,只会白忙活。
真正麻烦的从来不是命令怎么写,而是你不确定当前环境到底走的是操作系统认证、密码文件认证,还是 ASM 管理的集中式认证 —— 先搞清路径和模式,再动手。


















