ora-16191等错误仍会直接发生,因19c密码文件“自动同步”仅在单实例主库或rac全节点asm统一托管、remote_login_passwordfile=shared、备库非rac(或rac各节点软链接指向同一asm文件)、且改密用alter user而非orapwd时才生效;现实中rac本地化、链接不一致或orapwd重建占故障90%以上,必须手动干预。

主备库密码文件不同步在 Oracle 19c Data Guard 中仍会直接导致 ORA-16191、ORA-16789 或 MRP 进程静默挂起,哪怕你用的是 12.2+ 版本——自动同步只对物理 DG 的 *部分场景* 生效,且依赖严格前提;一旦漏掉关键条件,手动干预仍是刚需。
为什么19c的密码文件“自动同步”经常失效
Oracle 官方文档说 12.2 起主库改 SYS 密码会通过 redo 同步到备库,但这仅在以下全部满足时才触发:
- 主库必须是单实例,或 RAC 所有节点密码文件已由 ASM 统一托管(即
v$passwordfile_info.TYPE = 'ASM') - 主库
remote_login_passwordfile = SHARED,且所有节点都加载了同一 ASM 密码文件 - 备库不能是 RAC;若为 RAC 备库,各节点本地
orapw$ORACLE_SID必须是软链接指向同一 ASM 文件,否则同步只写入第一个节点 - 主库改密必须用
ALTER USER SYS IDENTIFIED BY ...,不能用orapwd重生成(否则不走 redo 路径)
现实中 RAC 主库密码文件本地化、备库 RAC 节点未统一链接、或 DBA 直接 orapwd 重建——这三类情况占现场故障的 90% 以上,自动同步根本不会发生。
检查密码文件是否真正一致
别只看文件名或大小,要验证哈希和内容结构:
- 在主库任一节点执行:
strings $ORACLE_HOME/dbs/orapw$ORACLE_SID | grep -i sys,确认输出含SYS用户哈希行;同样操作在备库每个节点执行,逐行比对 - 查
v$passwordfile_info:主备库都应返回一行且TYPE = 'ASM'或'FILE',但不能主库是 ASM、备库是 FILE - RAC 备库必须每个节点单独检查:
ls -l $ORACLE_HOME/dbs/orapw*,确认全是软链接(lrwxr-xr-x),且目标路径一致(如+DATA/CDB1/PASSWORD/pwdcdb1.256.123456789) - 若发现某节点是真实文件(
-rw-r-----),立刻删掉并重建链接,否则该节点始终用旧哈希认证
手动同步必须用对 orapwd 参数
主库重生成密码文件再分发,是最稳妥的兜底方案,但 orapwd 命令错一个参数就白干:
- 必须加
FORCE=Y:否则orapwd拒绝覆盖已有文件 -
FORMAT=12.2是硬性要求:低于此值,备库无法识别SYSBACKUP角色,MRP启动报ORA-16789 -
IGNORECASE必须和原文件一致:主库原文件是IGNORECASE=N(默认),新文件也得设IGNORECASE=N,否则大小写敏感逻辑错乱 - 绝对不用
INPUT_FILE:它只复制哈希,不升级内部格式,生成的文件仍无法用于 DG 认证 - 生成后用
scp推送到备库每个节点对应路径($ORACLE_HOME/dbs/orapw$ORACLE_SID),属主权限保持oracle:oinstall+640
RAC 备库节点间状态不一致的隐蔽坑
RAC 备库不是“同步一次就全好”,节点间差异会导致 ORA-16778 或 MRP 随机中断:
- 各节点
orapw$ORACLE_SID文件的md5sum必须完全一致,差一个字节都会让某个节点 RFS 进程认证失败 - 如果用了 ASM 存储密码文件(如
+DATA/CDB1/PASSWORD/pwdcdb1),必须用asmcmd pwcopy同步,不能用系统cp—— 后者丢失 ASM 元数据,节点启动时加载失败 - 改密后不重启实例,但必须重启 MRP:先
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL,再USING CURRENT LOGFILE DISCONNECT - 验证是否生效:查
v$archive_dest_status中DEST_ID = 2的STATUS应为VALID,且ERROR列为空;同时v$dataguard_stats中transport_lag和apply_lag应稳定在秒级
最易被忽略的是:RAC 备库每个节点的密码文件路径名含 SID,而 SID 在各节点上不同(如 cdb11、cdb12),推文件时必须显式指定目标路径,不能只传一个再 rsync —— 否则必然漏节点。











