Oracle 12c中如何配置Cascaded Standby以降低主库压力并实现级联同步?
- 内容介绍
- 文章标签
- 相关推荐
本文共计998个文字,预计阅读时间需要4分钟。
相关专题
log_archive_dest_n 配置对了,主库压力就能明显下降;但配错会导致级联中断、日志堆积、甚至备库拉不到归档——12c 级联不是“多加一个 dest 就完事”,关键在角色定位和传输时机。
级联库必须是物理备库,且不能是 Far Sync 实例
只有 PHYSICAL STANDBY 能作为 cascading standby 向下游转发 redo;逻辑备库、快照备库、Far Sync 实例都不行。Far Sync 虽然也接收日志并转发,但它没有数据文件、不应用日志、不参与角色转换,本质是日志中转桩,不能当级联源用。
-
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT必须在 cascading standby 上启用实时应用(否则无法实时转发) - cascading standby 的
DB_UNIQUE_NAME必须出现在所有节点的LOG_ARCHIVE_CONFIG中,漏掉一个就收不到或传不出 - 确认
V$DATABASE.PROTECTION_MODE是MAXIMUM PERFORMANCE或MAXIMUM AVAILABILITY,MAXIMUM PROTECTION会强制同步,阻塞级联链路
real-time cascading 依赖 Active Data Guard 许可
12c 起支持从 standby redo log 直接读取并转发(即 real-time),但这个能力被锁在 Oracle Active Data Guard 许可里。没许可时,级联只能走非实时路径:等 standby redo log 归档成 archivelog 后再发——延迟通常增加 1~3 分钟,且受 ARCHIVE_LAG_TARGET 影响。
- 检查许可状态:
SELECT * FROM V$OPTION WHERE PARAMETER = 'Active Data Guard';返回TRUE才可用 real-time 级联 - 没许可时,
LOG_ARCHIVE_DEST_2的SYNC/ASYNC设置会被忽略,系统自动降级为归档后转发 - real-time 级联下,
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)是必须项,写成(ONLINE_LOGFILES,...)会静默失效
LOG_ARCHIVE_DEST_n 参数组合容易踩的坑
级联失败八成出在 LOG_ARCHIVE_DEST_n 的 SERVICE、VALID_FOR 和 DB_UNIQUE_NAME 三者不匹配。尤其注意:cascading standby 发往 cascaded standby 的 dest,SYNC 关键字无效,强行写上不会报错,但会让 DBA 误以为是同步链路。
- cascading standby 上配置下游目标时,
LOG_ARCHIVE_DEST_2=’SERVICE=denver VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=denver’——SERVICE名必须能解析到 denver 的监听,DB_UNIQUE_NAME必须与 denver 实际一致 - cascaded standby(如 denver)的
FAL_SERVER应设为 cascading standby(boston2),不是主库(boston),否则它会绕过级联链直接连主库,破坏架构意图 -
LOG_ARCHIVE_DEST_STATE_n默认是ENABLE,但若某 dest 长期ERROR,Oracle 可能自动DEFER它,需手动ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE
验证级联是否真正生效,别只看归档目录
下游备库 V$ARCHIVED_LOG 里看到归档文件,不代表是级联来的——它可能仍是从主库直连拉的。真正在级联链路上,redo 来源应标记为上游 standby 的 DB_UNIQUE_NAME,而不是主库。
- 在 cascaded standby(denver)上查:
SELECT NAME, FIRST_TIME, NEXT_TIME, DEST_ID, SOURCE_DBID, SOURCE_DB_UNIQUE_NAME FROM V$ARCHIVED_LOG WHERE DEST_ID = 1 ORDER BY FIRST_TIME DESC FETCH FIRST 5 ROWS ONLY; - 如果
SOURCE_DB_UNIQUE_NAME显示的是boston2(而非boston),说明级联链路已通 - 同时检查 cascading standby(boston2)的
V$MANAGED_STANDBY,确认PROCESS列有ARCH进程在向 denver 传输,且STATUS是CONNECTED
级联链路越长,单点故障影响越大;LOG_ARCHIVE_DEST_n 最多 31 个,但实际建议级联深度不超过 2 层(主 → cascading → cascaded),再往下延迟不可控,且故障排查成本指数上升。
本文共计998个文字,预计阅读时间需要4分钟。
相关专题
log_archive_dest_n 配置对了,主库压力就能明显下降;但配错会导致级联中断、日志堆积、甚至备库拉不到归档——12c 级联不是“多加一个 dest 就完事”,关键在角色定位和传输时机。
级联库必须是物理备库,且不能是 Far Sync 实例
只有 PHYSICAL STANDBY 能作为 cascading standby 向下游转发 redo;逻辑备库、快照备库、Far Sync 实例都不行。Far Sync 虽然也接收日志并转发,但它没有数据文件、不应用日志、不参与角色转换,本质是日志中转桩,不能当级联源用。
-
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT必须在 cascading standby 上启用实时应用(否则无法实时转发) - cascading standby 的
DB_UNIQUE_NAME必须出现在所有节点的LOG_ARCHIVE_CONFIG中,漏掉一个就收不到或传不出 - 确认
V$DATABASE.PROTECTION_MODE是MAXIMUM PERFORMANCE或MAXIMUM AVAILABILITY,MAXIMUM PROTECTION会强制同步,阻塞级联链路
real-time cascading 依赖 Active Data Guard 许可
12c 起支持从 standby redo log 直接读取并转发(即 real-time),但这个能力被锁在 Oracle Active Data Guard 许可里。没许可时,级联只能走非实时路径:等 standby redo log 归档成 archivelog 后再发——延迟通常增加 1~3 分钟,且受 ARCHIVE_LAG_TARGET 影响。
- 检查许可状态:
SELECT * FROM V$OPTION WHERE PARAMETER = 'Active Data Guard';返回TRUE才可用 real-time 级联 - 没许可时,
LOG_ARCHIVE_DEST_2的SYNC/ASYNC设置会被忽略,系统自动降级为归档后转发 - real-time 级联下,
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)是必须项,写成(ONLINE_LOGFILES,...)会静默失效
LOG_ARCHIVE_DEST_n 参数组合容易踩的坑
级联失败八成出在 LOG_ARCHIVE_DEST_n 的 SERVICE、VALID_FOR 和 DB_UNIQUE_NAME 三者不匹配。尤其注意:cascading standby 发往 cascaded standby 的 dest,SYNC 关键字无效,强行写上不会报错,但会让 DBA 误以为是同步链路。
- cascading standby 上配置下游目标时,
LOG_ARCHIVE_DEST_2=’SERVICE=denver VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=denver’——SERVICE名必须能解析到 denver 的监听,DB_UNIQUE_NAME必须与 denver 实际一致 - cascaded standby(如 denver)的
FAL_SERVER应设为 cascading standby(boston2),不是主库(boston),否则它会绕过级联链直接连主库,破坏架构意图 -
LOG_ARCHIVE_DEST_STATE_n默认是ENABLE,但若某 dest 长期ERROR,Oracle 可能自动DEFER它,需手动ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE
验证级联是否真正生效,别只看归档目录
下游备库 V$ARCHIVED_LOG 里看到归档文件,不代表是级联来的——它可能仍是从主库直连拉的。真正在级联链路上,redo 来源应标记为上游 standby 的 DB_UNIQUE_NAME,而不是主库。
- 在 cascaded standby(denver)上查:
SELECT NAME, FIRST_TIME, NEXT_TIME, DEST_ID, SOURCE_DBID, SOURCE_DB_UNIQUE_NAME FROM V$ARCHIVED_LOG WHERE DEST_ID = 1 ORDER BY FIRST_TIME DESC FETCH FIRST 5 ROWS ONLY; - 如果
SOURCE_DB_UNIQUE_NAME显示的是boston2(而非boston),说明级联链路已通 - 同时检查 cascading standby(boston2)的
V$MANAGED_STANDBY,确认PROCESS列有ARCH进程在向 denver 传输,且STATUS是CONNECTED
级联链路越长,单点故障影响越大;LOG_ARCHIVE_DEST_n 最多 31 个,但实际建议级联深度不超过 2 层(主 → cascading → cascaded),再往下延迟不可控,且故障排查成本指数上升。

