主库修改sys密码后备库连不上,需主库用ORAPWD FORCE=Y FORMAT=12.2生成密码文件并完整拷贝至备库对应路径,RAC需逐节点同步,且验证哈希一致。
主库改了 sys 密码,备库连不上怎么办
直接后果是:备库的 mrp 进程报错 ora-16191: primary log shipping client not logged on to standby,或者 alter database recover managed standby database 失败。根本原因是 data guard 依赖密码文件做 redo 传输认证,主备密码文件内容不一致,备库无法用新密码向主库发起日志拉取请求。
关键点不是“重生成密码文件”,而是“让备库密码文件和主库完全一致”。Oracle 不同步密码文件,也不校验一致性,全靠 DBA 手动分发。
- 主库执行
ORAPWD重新生成密码文件时,必须指定FORCE=Y(否则失败),且FORMAT=12.2或更高(适配 12c+ 的双模式密码文件) - 生成后立刻拷贝到备库相同路径(如
$ORACLE_HOME/dbs/orapw$ORACLE_SID),注意属主、权限要和原文件一致(chown oracle:oinstall+chmod 640) - 备库无需重启实例,但必须重启
MRP:先ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL,再重新启动
orapwd 命令里哪些参数不能错
输错一个参数,生成的密码文件就无法用于 DG 认证。最常踩的坑是忽略 FORMAT 和 ASMM 兼容性问题。
-
FORMAT=12.2是硬性要求(12.1 及以上版本),低于此值会导致备库识别为“只支持 SYSDBA”,失去SYSBACKUP等角色能力,MRP 启动失败 -
ENTRIES不影响 DG,但建议设为 ≥10,避免后续加用户时重生成 -
IGNORECASE必须和主库原密码文件一致(通常为N),否则大小写敏感逻辑错乱,sys登录被拒 - 绝对不要用
INPUT_FILE参数试图“升级”旧密码文件——它只复制口令哈希,不处理内部格式变更,结果仍是无效文件
备库是 RAC 怎么办:多个节点的密码文件要分别处理吗
要。RAC 备库每个实例都有独立的密码文件路径($ORACLE_HOME/dbs/orapw<SID>),且各节点必须完全一致。漏掉任意一个,该节点实例启动后无法参与 MRP,甚至可能因节点间状态不一致触发 ORA-16778。
- 主库生成新密码文件后,用
scp分别推送到所有备库节点对应路径(不能只传一个再 rsync,路径名含 SID,各节点不同) - 确认每个节点的
orapw<SID>文件 size、md5sum 和主库完全一致 - 如果用了 ASM 存储密码文件(
orapw<DB_UNIQUE_NAME>在+DATA),必须用ASMCMD cp替代文件系统拷贝,否则权限/元数据丢失
为什么不能在备库本地用 orapwd 重生成
因为备库本地生成的密码文件,其内部存储的 sys 用户哈希值,和主库当前密码计算出的哈希值不一致。DG 认证时主库比对的是自己密码文件里的哈希,不是明文——你本地重生成,等于告诉主库:“我用的是另一个 sys 密码”,自然拒绝连接。
- 验证方法:主备库分别运行
strings $ORACLE_HOME/dbs/orapw<SID>,搜索SYS行,对比哈希串是否完全相同 - 即使主备密码明文一样,不同
orapwd版本或参数生成的哈希算法也可能不同(尤其跨大版本时) - 唯一安全路径:主库生成 → 完整拷贝 → 备库覆盖 → 验证哈希一致
最易被忽略的是 RAC 备库多节点场景下,只更新了第一个节点的密码文件,其他节点仍持旧文件,MRP 表现不稳定,错误日志分散在各个节点的 alert.log 里,排查时容易漏掉。

















