主备切换后密码文件“失效”是因为角色互换导致密码文件中的db_unique_name、asm路径注册及实例标识未同步更新,lns/rfs进程依赖remote_login_passwordfile=exclusive和静态密码文件认证,而该文件不随redo传输自动更新,需手动重建并确保两端字节级一致、路径注册正确、监听器重载生效。
主备切换后,备库(新主库)的密码文件必须能被原主库(新备库)正确识别,否则 ora-16191 会直接阻断日志传输和同步启动。
为什么切换后密码文件会“失效”
Oracle Data Guard 的日志传输进程(LNS、RFS)在连接对端时,依赖 remote_login_passwordfile=EXCLUSIVE 或 SHARED + 密码文件中存储的 SYS 凭据。主备角色切换后:
- 原主库的密码文件仍含旧
DB_UNIQUE_NAME和旧实例标识,无法被新主库(原备库)的监听器或 RFS 进程信任 - 新主库(原备库)若使用 ASM 存储密码文件,其路径记录在 OCR 中,而
srvctl config database -d显示的仍是切换前的路径 - 手动修改
sys密码不会自动同步到对端密码文件 —— 密码文件是静态二进制,不参与 redo 传输
检查当前密码文件位置与状态
先确认新主库(刚切换完成的库)是否在用 ASM 密码文件,这是 12c+ RAC/DG 的默认行为:
- 执行
srvctl config database -d DB_NAME -a,查看输出中Passwordfile:行。若路径以+开头(如+DATA/DBNAME/PASSWORD/pwdDBNAME.256.1044684147),说明在 ASM 中 - 在新主库上运行
select * from v$pwfile_users;,确认SYS行的USERNAME和PRIVILEGE是否为SYSDBA - 在新备库(原主库)上运行相同查询,若返回空或
SYS权限为NO,说明密码文件未生效或内容不匹配
同步密码文件的两种可靠方式
不能只拷贝文件,必须保证 DB_UNIQUE_NAME、ASM 路径注册、文件格式三者一致:
- 推荐方式:用
orapwd从新主库密码文件重建,并指定新备库的dbuniquename
在新主库执行:orapwd input_file='+DATA/DBNAME/PASSWORD/pwdDBNAME.256.1044684147' file='/tmp/orapwOLDDBNAME' dbuniquename='OLDDBNAME' force=y
再将/tmp/orapwOLDDBNAME传到新备库$ORACLE_HOME/dbs/下,重命名为orapwOLDDBNAME(注意大小写匹配$ORACLE_SID) - RAC 环境下必须更新 OCR 记录:
在新备库节点执行:srvctl modify database -d OLDDBNAME -pwfile '+DATA/OLDDBNAME/PASSWORD/pwdOLDDBNAME'
然后用asmcmd pwcopy把新生成的文件上传到该 ASM 路径 - 避免踩坑:
OPW-00010: Could not create the password file. This resource has a PasswordFile.错误出现时,先执行srvctl modify database -d OLDDBNAME -pwfile ''清空 OCR 中旧路径,再重新设置
验证与收尾关键点
同步不是改完就完事,以下三步缺一不可:
- 重启新备库的监听器:
lsnrctl stop && lsnrctl start—— 否则 RFS 进程仍读取旧内存缓存 - 在新备库执行:
alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;并重启数据库,确保参数生效(SHARED在 12c+ 多实例场景易出权限混淆) - 不要只看
md5sum是否一致 —— 手动创建的密码文件即使密码相同,MD5 也可能不同;真正要验证的是connect sys@tns_alias as sysdba能否从新主库连到新备库,且v$pwfile_users返回有效行
最容易被忽略的是:角色切换后,新备库的 log_archive_dest_2 指向的 TNS 别名,其底层 tnsnames.ora 必须解析到新主库的 VIP 或 SCAN 地址,且该地址监听器已加载新主库的密码文件路径 —— 否则 LNS 连接失败,报错直接落在网络层,掩盖了密码文件问题。











