ORA-16191 根本原因是主库 LGWR/ARCH 进程无法远程认证连接备库,等价于 ORA-01017;必须检查 remote_login_passwordfile=EXCLUSIVE、密码文件字节级一致、SYS 用户 SYSDBA 权限为 TRUE,且 RAC 环境需全节点同步并 force=y 重建。

ORA-16191 不是归档没传过去、也不是网络不通,而是主库的 LGWR 或 ARCH 进程根本连不上备库——等价于你手动执行 sqlplus sys/password@standby as sysdba 直接报 ORA-01017。修复必须从认证链入手,其他排查全是绕路。
确认 remote_login_passwordfile 是否为 EXCLUSIVE
SHARED 或 NONE 模式下,Oracle 不允许远程 SYS 登录用于 DG 传输,ORA-16191 是必然结果。
- 两端都执行
SHOW PARAMETER remote_login_passwordfile,输出值必须是EXCLUSIVE - RAC 环境需加
SID='*'修改:ALTER SYSTEM SET remote_login_passwordfile=EXCLUSIVE SCOPE=SPFILE SID='*'; - 修改后必须重启实例才生效,不重启等于没改
-
SHARED模式无法写入新口令,NONE则彻底禁用远程认证——两者都不满足 DG 要求
验证主备 orapw<sid> 文件是否字节级一致
文件名错、内容不一致、权限不对,任何一个都会导致认证失败。别只看 ls -l 时间戳或大小。
- 查备库实例名:
SELECT INSTANCE_NAME FROM V$INSTANCE;,密码文件名必须是orapw<INSTANCE_NAME>(注意大小写) - ASM 存储不能直接
scp,先用asmcmd pwcopy导出到本地临时路径再传 - 替换前必须停备库:
shutdown immediate,否则 Oracle 可能缓存旧句柄,覆盖无效 - 拷贝后立刻执行:
chown oracle:oinstall <password_file>,否则 Oracle 进程无权读取 - RAC 多节点环境:每个节点的
$ORACLE_HOME/dbs/下都要有同名、同内容的文件,建议用md5sum校验
检查 orapwd describe 输出是否匹配
这是最可靠的验证方式——orapwd describe 会解析密码文件内部结构,比对真实权限位。
- 主库执行:
orapwd describe file=$ORACLE_HOME/dbs/orapw<sid> - 备库执行同样命令,逐行比对输出中的
USERNAME和SYSDBA列 - 重点看
SYS行是否存在、SYSDBA是否为TRUE;若备库输出为空、缺 SYS 行、或SYSDBA=FALSE,说明文件损坏或未正确生成 - 12c+ 版本对大小写敏感,若主库 SYS 密码含大写字母,备库密码文件也必须包含相同大小写的记录
改过 SYS 密码后必须重建并全量分发密码文件
ALTER USER SYS IDENTIFIED BY xxx 只更新数据字典,完全不影响密码文件内容。不重建 = 主备必然不一致。
- 重建命令必须带
force=y:orapwd file=$ORACLE_HOME/dbs/orapw<sid> password=<new_pwd> force=y entries=10 - 重建后不能只传一个节点,RAC 主库所有节点、备库所有节点都得覆盖
- 传完立即在主库执行:
ALTER SYSTEM ARCHIVE LOG CURRENT;触发一次日志切换,观察是否恢复传输 - 别信“我刚改了密码,应该同步了”——Oracle 没有自动同步机制,这一步漏掉,99% 的 ORA-16191 都会复发
最容易被忽略的是 RAC 环境下只同步了部分节点的密码文件,或者用 orapwd 重建时忘了加 force=y 导致命令静默失败。这两个点一错,错误现象和排查路径几乎一模一样,但根因完全不同。


















