级联备库不同步通常因中间级备库配置或状态异常导致,核心表现为日志无法向下传递:需确认LOG_ARCHIVE_DEST_n指向正确、归档传输启用(ENABLE)、数据库处于READ ONLY WITH APPLY模式、MRP0和LNS进程正常运行,并验证下游连通性及密码文件同步。

级联备库(Cascade Standby)不同步,通常不是“完全断连”,而是滞后严重或某一级卡住。核心判断依据是:主库日志能传到第一级备库,但无法继续往下传;或者中间级备库的 MRP 进程正常,但下游级收不到归档 —— 这说明问题出在级联链路的配置或状态上,而不是主备直连那种常见密码/网络问题。
确认级联拓扑和归档传输方向
级联不是自动形成的,必须显式配置 LOG_ARCHIVE_DEST_n 指向下一跳。最容易忽略的是:中间级备库没开归档传输(LOG_ARCHIVE_DEST_STATE_n=ENABLE),或者目标 DEST_ID 指向了错误的服务名。
- 在中间级备库(即既是第一级备库、又是第二级主库的实例)上查:
SELECT dest_id, destination, status, error FROM v$archive_dest WHERE dest_id IN (2,3)—— 确保其中一项指向下游级备库,且status='VALID' - 检查该
destination值是否与下游级备库的tnsnames.ora中服务名一致(注意大小写、域名、端口) - 确认中间级备库已启用归档传输:
SHOW PARAMETER log_archive_dest_state_2(或对应dest_id)必须为ENABLE,不能是DEFER或RESET
检查中间级备库是否处于“只读+应用”模式
级联要求中间级备库必须同时做两件事:接收上游日志并应用(MRP 进程运行),还要将自身生成的归档(即已应用后的日志)转发给下游。如果它停在 READ ONLY 而没启 RECOVER MANAGED STANDBY DATABASE,就不会产生可转发的归档。
- 查中间级备库状态:
SELECT open_mode, database_role, recovery_mode FROM v$database—— 必须是READ ONLY WITH APPLY或MOUNTED(非READ ONLY) - 查进程:
SELECT process, status, sequence# FROM v$managed_standby—— 必须有MRP0且status='APPLYING_LOG';同时应有LNS进程(表示正在往外发日志) - 若无
LNS,说明归档传输未启动,需确认log_archive_dest_n是否生效,以及是否设置了log_archive_config包含所有 DB_UNIQUE_NAME
验证下游级备库能否连通中间级
下游级备库的 RFS 进程要从中间级拉日志,依赖的是中间级的监听和密码文件。这里常踩的坑是:中间级用了独立密码文件,但没同步到下游级,或 REMOTE_LOGIN_PASSWORDFILE 设为 EXCLUSIVE 却没重生成密码文件。
- 在下游级备库服务器上手动测试连接:
tnsping <中间级服务名>和sqlplus sys/<pwd>@<中间级服务名> as sysdba—— 必须成功 - 检查中间级备库的
REMOTE_LOGIN_PASSWORDFILE参数值,必须是SHARED或EXCLUSIVE;若为EXCLUSIVE,确保其密码文件(orapw<SID>)存在且包含SYS用户 - 下游级备库的告警日志里如果出现
ORA-16191或ORA-12154,基本就是上述连通性或认证问题
级联链路上的归档 Gap 容易被掩盖
主库的 v$archive_gap 查不到级联中断,因为 gap 只反映主库→第一级备库之间的缺失;中间级备库的 v$archive_gap 也只反映它自己收不全上游日志。真正影响下游的是中间级是否把“已应用日志”完整归档并传出 —— 这部分得靠比对序列号。
- 在中间级备库查:
SELECT thread#, MAX(sequence#) FROM v$archived_log WHERE applied='YES' GROUP BY thread#(已应用最大序号) - 在下游级备库查:
SELECT thread#, MAX(sequence#) FROM v$archived_log GROUP BY thread#(收到的最大序号) - 两者差值持续增大,且下游
v$archived_log中next_time明显落后于中间级,就说明级联传输卡在中间级归档生成或传输环节
级联不同步最难定位的点,往往不在配置语法,而在于中间级备库的角色认知错位 —— 它既不是纯粹主库,也不是纯粹备库,任何一步启停操作(比如误执行 ALTER DATABASE OPEN)都会破坏链路。务必在每次变更后,用 v$managed_standby 和 v$archive_dest_status 交叉验证两端状态。


















