同城双中心需确保故障时业务接管、数据不丢、切换可控,Oracle Data Guard须结合保护模式、传输方式等设计;MAXIMUM AVAILABILITY为默认起点,需配置SYNC AFFIRM、NET_TIMEOUT、AUTO文件管理;Active Data Guard支持只读服务以验证同步、分流查询、缩短RTO;FSFO Observer必须部署异地,切换后需手动REINSTATE原主库;演练须覆盖非计划中断,连接应使用VIP/SCAN,备库listener.ora中GLOBAL_DBNAME须设为db_unique_name_DGMGRL。

同城双中心不是简单地把主库和备库分别放在两个机房,而是要让它们在故障时能真正接管业务、数据不丢、切换可控。Oracle Data Guard 本身不自动解决“同城”特有的网络延迟、带宽抖动、跨中心仲裁等问题,必须结合保护模式、传输方式、角色切换机制和运维流程一起设计。
最大可用性模式(MAXIMUM AVAILABILITY)是同城场景的默认起点
同城距离通常在 10–50 公里,RTT 多数在 1–5ms,但偶尔会突增到 20ms+。此时 MAXIMUM PROTECTION 容易因 LGWR 等待超时导致主库挂起;而 MAXIMUM PERFORMANCE 又可能丢数据——尤其在批量导入或大事务场景下,归档日志还没传完主库就宕了。
-
LOG_ARCHIVE_DEST_2必须配置为SYNC AFFIRM+REOPEN=5,避免单次网络抖动直接中断日志传输 - 启用
NET_TIMEOUT=30(单位秒),让 LGWR 在等待备库确认时最多等 30 秒,超时后自动降级为异步(需配合DELAY参数防止误切) - 必须开启
STANDBY_FILE_MANAGEMENT=AUTO,否则新增表空间/数据文件不会自动同步,切换后启动失败
物理 Standby + Active Data Guard 是读写分离与快速切换的组合解
单纯物理 Standby 只能恢复,不能对外提供服务;而启用 Active Data Guard 后,备库可实时只读开放,这对同城双中心的价值在于:验证同步链路是否健康、分流报表类查询、缩短 RTO(因为备库已 warm up)。
- 启动 ADG 需先执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT,再ALTER DATABASE OPEN READ ONLY - 注意:
READ ONLY WITH APPLY模式下,备库不能执行 DML,但支持物化视图刷新、统计信息收集等后台任务 - 如果应用层做了连接池路由(如 UCP 或 Oracle Wallet),可将备库地址加入连接字符串并设置
LOAD_BALANCE=on,但需确保应用逻辑容忍只读语义
Fast-Start Failover(FSFO)必须搭配 Observer 且部署在第三地
同城双中心天然缺乏“第三方仲裁”,若 Observer 和主备库同处一个数据中心,一旦该中心断电或网络分区,FSFO 会误判并触发脑裂。真实生产中,Observer 必须部署在异地(哪怕只是同城另一行政区的独立机房)或云上轻量 VM。
- Observer 启动命令为:
DGMGRL> START OBSERVER,它不依赖数据库实例,只监听 Data Guard Broker 状态 - FSFO 触发条件默认包含
Primary database is down和Redo transport is lagging,建议关闭后者(EDIT CONFIGURATION SET PROPERTY FastStartFailoverLagLimit=30),避免因瞬时延迟误切 - 切换后,原主库重启需手动执行
REINSTATE,否则无法重新加入 Broker 配置;这步容易被忽略,导致灾备链路失效
切换演练必须覆盖“非计划中断”和“计划维护”两类路径
很多团队只练 Switchover(主备主动换位),却从没模拟过主库突然 hang 或实例 crash 的场景。而真实故障中,90% 是后者。
- 模拟主库宕机:直接 kill -9
pmon进程,观察 FSFO 是否在FastStartFailoverThreshold(默认 30 秒)内完成切换 - 验证切换后序列号连续性:
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE DEST_ID = 2 ORDER BY SEQUENCE# DESC,确认最后一条归档已应用 - 应用连接重连必须依赖 VIP 或 SCAN 地址,不能硬编码 IP;否则切换后所有连接持续报
ORA-12154或超时
最常被跳过的细节是:备库的 listener.ora 中 GLOBAL_DBNAME 必须设为 db_unique_name_DGMGRL(而非 ORACLE_SID),否则 Broker 无法建立连接;这个配置项在文档里藏得深,但不设就会卡在 “Status: ORA-16664: unable to contact database”。


















