ora-16191 根源是 sys 远程认证失败,因主备库密码文件不一致或 remote_login_passwordfile 非 exclusive;须同步命名正确、权限合规的密码文件,rac 环境需覆盖所有节点,并重建文件以同步 sys 新口令。
ora-16191 根源就是 sys 认证失败
这个错误不是网络不通、归档没开,也不是 dg 配置漏了参数——它本质是主库尝试用 sys 身份连备库时被拒了,等价于你在 sql*plus 里输错密码:ora-01017: username/password invalid。而 oracle data guard 日志传输(lgwr/arch)强制走 sys 身份认证,一旦密码文件不匹配,arcn 或 lnsn 进程直接报 ora-16191 并断连。
必须同步密码文件,且文件名不能错
主库生成的密码文件(如 orapwORCL)必须原样拷到备库对应位置,名字得和备库实例名严格一致。RAC 环境下尤其容易漏:主库有 3 个节点,但只拷了 1 个节点的密码文件到备库,其他节点连不上就报这个错。
- 查主库密码文件路径:
select * from v$pwfile_users;+srvctl config database -d <db_name></db_name>看Password file输出 - 确认备库实例名:
SELECT INSTANCE_NAME FROM V$INSTANCE;,文件名必须是orapw<instance_name></instance_name> - 拷贝后检查权限:
chown oracle:oinstall <password_file></password_file>,否则 Oracle 进程读不了 - ASM 存储时不能直接 scp,得先
asmcmd pwcopy到本地临时路径再传
remote_login_passwordfile 必须是 EXCLUSIVE
remote_login_passwordfile 设成 SHARED 会导致密码文件无法写入新口令,SYS 密码改了也不同步;设成 NONE 更不行,直接禁用远程密码认证。只有 EXCLUSIVE 才允许单实例独占使用密码文件,并支持 ALTER USER SYS IDENTIFIED BY 更新口令。
- 查当前值:
SHOW PARAMETER remote_login_passwordfile - 修改(需重启生效):
ALTER SYSTEM SET remote_login_passwordfile=EXCLUSIVE SCOPE=SPFILE; - RAC 环境下要加
SID='*',否则只改当前实例
改 SYS 密码后,必须重生成密码文件再分发
单纯 ALTER USER SYS IDENTIFIED BY xxx 不会自动更新密码文件内容——它只改数据字典,密码文件是独立二进制文件。所以改完密码,必须立刻用 orapwd 重建,并覆盖所有主备节点。
- 重建命令示例:
orapwd file=$ORACLE_HOME/dbs/orapwORCL password=xxx force=y entries=10 - force=y 是关键,否则
orapwd拒绝覆盖已有文件 - RAC 备库多节点?每个节点的
$ORACLE_HOME/dbs/下都要放一份同名文件 - 别忘了改完后在主库执行
ALTER SYSTEM ARCHIVE LOG CURRENT;触发一次日志切换,验证传输是否恢复
最容易被忽略的是:密码文件时间戳旧 ≠ 内容旧,哪怕文件是上周拷的,只要期间主库改过 SYS 口令,它就已失效。不要看文件是否存在,要看它是否包含当前有效的 SYS 口令。










