Oracle Data Guard中备库不会自动同步主库新增的Online Redo Log组,必须手动添加大小≥主库最大日志、数量≥主库组数+1且匹配THREAD的Standby Redo Log(SRL),否则切换或应用会失败。
主库加
后备库不自动同步 SRL
oracle data guard 不会自动在备库创建 standby redo log(srl),哪怕主库刚加了新 online redo log 组。这是设计使然,不是 bug。备库必须手动添加 srl,否则切换或重做应用可能卡在“waiting for archive log”或报
、
错误。
实操建议:
主库执行
后,立刻查备库是否已有对应数量的 SRL —— 通常没有
备库上不能用
直接照搬主库路径(尤其 RAC 或 ASM 环境路径不一致)
优先用
和
对比组数:SRL 组数应 ≥ Online Redo Log 组数 + 1(官方推荐)
若备库是物理 standby 且处于 MOUNT 状态,可直接添加;若已启用了实时应用(
),需先取消恢复再加
备库加 SRL 必须匹配主库 Online Redo Log 的 SIZE 和 THREAD
SRL 大小必须 ≥ 主库对应线程中最大 Online Redo Log 文件尺寸,否则日志传输时会报
(primary and standby database are not synchronized)或归档无法应用。
实操建议:
查主库最大日志尺寸:
,比如结果是
(200MB)
备库添加时不能写更小值,例如
是错的
单实例主库默认 THREAD 1;RAC 主库若开了多线程,备库必须为每个 THREAD 都配够 SRL,否则某线程日志无法传递
路径名无需和主库一致,但需确保 Oracle 进程有读写权限,且磁盘空间充足(SRL 占用和 Online Redo Log 相当)
备库已开启实时应用时,加 SRL 的安全操作顺序
直接在运行中的 MRP(Managed Recovery Process)下执行
会失败,报
:database must be mounted in exclusive mode and not open —— 但物理备库正常就是 MOUNT 状态,问题出在 MRP 正在跑。
实操建议:
先停恢复:
确认状态:
应返回空或
再加 SRL:
重启恢复:
加完别忘验证:
看新组是否显示
常见误操作导致 SRL 无效的三个信号
看似加成功了,但后续主库切日志、备库追日志仍失败,大概率是 SRL 没真正生效。最典型的假成功现象:
加完后
显示
状态持续不退 —— 说明该组正被 MRP 使用中,但没完成归档应用,可能是大小不匹配或路径不可写
主库
后,备库
中新生成的归档
,且
是
而非
—— 表明日志没进 SRL,还在等归档落盘
告警日志里反复出现
或
—— 很可能漏加了某个 THREAD 的 SRL,尤其 RAC 环境容易只加了 THREAD 1
真正加对的标志只有一个:主库连续
三次,备库告警日志里能看到
后迅速接上
,且
中
的
始终是
。
ALTER DATABASE ADD LOGFILEora-00313ora-00312ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oradata/ORCL/redo04a.log') SIZE 200M;ALTER DATABASE ADD STANDBY LOGFILEV$LOGFILEV$STANDBY_LOGALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILEORA-16191SELECT MAX(BYTES) FROM V$LOG;209715200ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '/u01/oradata/ORCL/srl4.log' SIZE 100M;ALTER DATABASE ADD STANDBY LOGFILEORA-01126ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0';NOT APPLYINGALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '/u01/oradata/ORCL/srl4.log' SIZE 200M;ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;SELECT GROUP#, THREAD#, SEQUENCE#, ARCHIVED, STATUS FROM V$STANDBY_LOG;UNASSIGNEDV$STANDBY_LOGACTIVEALTER SYSTEM SWITCH LOGFILEV$ARCHIVED_LOGAPPLIED = 'NO'REGISTRARRFSMRP0Standby redo logfile not found for threadCould not find archived logSWITCH LOGFILEMedia Recovery Waiting for threadarchived log for threadV$MANAGED_STANDBYMRP0STATUSAPPLYING_LOG