Oracle Active Data Guard 详解

Oracle Active Data Guard 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Active Data Guard 允许备库在 READ ONLY 模式下同时应用 Redo 日志[1]:

详细见:Oracle Data Guard 架构详解


2. ADG 特性

2.1 Real-Time Query

- 备库 READ ONLY
- 同时应用 Redo
- 实时查询
- Active Standby

2.2 Automatic Block Repair

- 主库坏块
- 自动从备库修复
- 透明

2.3 Far Sync

- 零数据丢失远程
- 轻量级
- 多地灾备

2.4 DML Redirection

- 19c+
- 备库 DML 重定向主库
- 只读应用

3. 启用 ADG

3.1 备库配置

-- 启动实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

-- 打开 READ ONLY
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

3.2 验证

SELECT open_mode, database_role, protection_mode 
FROM v$database;
-- READ ONLY WITH APPLY, PHYSICAL STANDBY

SELECT process, status, sequence# FROM v$managed_standby;
-- MRP0, APPLYING_LOG

4. Real-Time Query

4.1 查询

-- 备库查询
SELECT COUNT(*) FROM employees;
-- 实时数据(与主库同步)

4.2 应用分离

- 报表 → 备库
- 读写 → 主库
- 减轻主库压力

4.3 一致性

- 会话级读一致性
- Flashback 查询
- Standby 阻塞主库(特定场景)

5. Automatic Block Repair

5.1 触发

- 主库坏块(ORA-01578)
- 自动从备库读取
- 修复主库
- 应用无感知

5.2 配置

-- 自动启用
-- 物理 standby
-- 不需额外配置

5.3 验证

SELECT * FROM v$database_block_corruption;

6. Far Sync

6.1 架构

Primary → Far Sync (SYNC) → Remote Standby (ASYNC)
- Far Sync 仅传 Redo
- 零数据丢失
- 远距离

6.2 配置

-- Far Sync 实例
CREATE CONTROLFILE AS STANDBY ...;
-- 仅控制文件 + SPFILE
-- 无数据文件

6.3 Redo 路由

DGMGRL> EDIT DATABASE prod SET PROPERTY 'RedoRoutes' = '(far_sync : SYNC)';
DGMGRL> EDIT FAR_SYNC far_sync SET PROPERTY 'RedoRoutes' = '(stby1 : ASYNC)';

7. DML Redirection

7.1 启用

-- 19c+
ALTER SESSION ENABLE ADG_REDIRECT_DML;

7.2 工作原理

- 备库执行 DML
- 重定向到主库
- 主库执行
- Redo 同步回备库

7.3 应用

- 只读应用偶尔写
- 简化应用
- 性能有损耗

8. 角色

8.1 Standby 角色

-- 物理备库
-- Active Standby(READ ONLY + APPLY)
-- Snapshot Standby

8.2 切换

- Switchover
- Failover
- 应用连接服务

详细见:Oracle Data Guard Switchover 与 Failover 详解


9. 服务名

9.1 角色

prod_rw = 主库
prod_ro = 备库

9.2 TAF

# tnsnames.ora
prod =
  (DESCRIPTION =
    (FAILOVER = ON)
    (ADDRESS_LIST = ...)
    (CONNECT_DATA = (SERVICE_NAME = prod_rw))
  )

9.3 Broker 配置

DGMGRL> EDIT DATABASE prod SET PROPERTY 'StaticConnectIdentifier' = ...;
DGMGRL> EDIT DATABASE stby1 SET PROPERTY 'StaticConnectIdentifier' = ...;

10. 监控

10.1 同步延迟

SELECT name, value, time_computed 
FROM v$dataguard_stats 
WHERE name IN ('transport lag', 'apply lag');

10.2 进程

SELECT process, status, sequence#, block#, blocks 
FROM v$managed_standby;

10.3 性能

SELECT * FROM v$standby_event_histogram;

11. 应用场景

11.1 读分离

- 报表 → 备库
- 查询 → 备库
- 主库专注写

11.2 HA

- 主库故障
- Fast-Start Failover
- 备库变主库

11.3 DR

- 异地
- 零数据丢失
- Far Sync

11.4 升级

- 滚动升级
- 降级升级
- 最小停机

12. 常见坑与排错

12.1 Lag 大

- 网络
- 磁盘 I/O
- 性能调优

12.2 Active Standby 卡

- 长查询阻塞
- 调整

12.3 坏块修复

- Automatic Block Repair
- 检查
- 手动修复

13. 最佳实践

  1. 读分离:报表
  2. Far Sync:远距离
  3. Fast-Start Failover:HA
  4. 监控 Lag:及时
  5. 服务名:角色
  6. TAF:连接
  7. 升级:滚动
  8. 测试:Failover
  9. 监控:状态
  10. 文档:流程

14. 参考资料

[1] Oracle Active Data Guard 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/