Oracle Data Guard 架构详解

Oracle Data Guard 架构详解

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


1. 概述

Data Guard 是 Oracle 灾备方案[1]:

类型

  • 物理 Standby
  • 逻辑 Standby
  • Snapshot Standby
  • Far Sync

详细见:Oracle Data Guard 部署


2. 架构

2.1 主库

- Primary
- 读写
- Redo 产生

2.2 备库

- Standby
- 物理:块级一致
- 逻辑:SQL 应用

2.3 角色

- Primary:主
- Standby:备
- 可切换

3. 数据保护模式

3.1 Maximum Protection

- 零数据丢失
- SYNC
- 备库失败主库停

3.2 Maximum Availability

- 零数据丢失(最佳)
- SYNC
- 备库失败主库继续

3.3 Maximum Performance

- 最大性能
- ASYNC
- 数据可能丢失

3.4 设置

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;

4. Redo 传输

4.1 SYNC

- 同步
- 主库等备库确认
- 零丢失

4.2 ASYNC

- 异步
- 主库不等
- 性能好

4.3 配置

ALTER SYSTEM SET log_archive_dest_2 = 
  'service=standby sync valid_for=(online_logfiles,primary_role) db_unique_name=standby'
  SCOPE=BOTH;

5. 物理 Standby

5.1 创建

-- 1. 主库准备
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 ('...') SIZE 200M;

-- 2. 参数
ALTER SYSTEM SET log_archive_config = 'dg_config=(orcl,orcldg)';
ALTER SYSTEM SET log_archive_dest_2 = 'service=orcldg async ...';

-- 3. RMAN Duplicate
rman target sys/pwd@orcl auxiliary sys/pwd@orcldg
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;

-- 4. 启动 MRP
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION USING CURRENT LOGFILE;

5.2 应用

- Redo Apply
- MRP(Managed Recovery Process)
- 物理块级

5.3 Active Data Guard

- 11g+
- 只读 + 应用
- 实时查询

详细见:Oracle Active Data Guard


6. 逻辑 Standby

6.1 创建

-- 类似物理
-- 但使用 SQL Apply
ALTER DATABASE START LOGICAL STANDBY APPLY;

6.2 应用

- SQL Apply
- LogMiner
- 转换 SQL
- 执行

6.3 限制

- 数据类型限制
- 不支持对象
- 需要主键

7. Snapshot Standby

7.1 转换

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;

7.2 用途

- 读写测试
- 临时
- 恢复后同步

7.3 恢复

ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

8. Far Sync

8.1 概述

- 12c+
- 远距离零丢失
- 中继实例

8.2 架构

Primary → Far Sync (SYNC) → Standby (ASYNC)

8.3 优势

- 零数据丢失
- 远距离
- 性能好

9. 切换

9.1 Switchover

- 计划
- 主备互换
- 无数据丢失
-- 主库
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;

-- 备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;

9.2 Failover

- 故障
- 备库变主
- 可能数据丢失
-- 备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE ACTIVATE STANDBY DATABASE;

9.3 Reinstate

- 12c+
- 失败主库恢复为备
DGMGRL> reinstate database orcl;

10. Data Guard Broker

10.1 配置

# 启用
ALTER SYSTEM SET dg_broker_start = TRUE;

# DGMGRL
dgmgrl sys/Oracle123@orcl
CREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS orcl CONNECT IDENTIFIER IS orcl;
ADD DATABASE orcldg AS CONNECT IDENTIFIER IS orcldg MAINTAINED AS PHYSICAL;
ENABLE CONFIGURATION;

10.2 管理

SHOW CONFIGURATION;
SHOW DATABASE orcl;
SHOW DATABASE orcldg;

EDIT DATABASE orcldg SET PROPERTY LogXptMode = 'SYNC';
EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;

SWITCHOVER TO orcldg;
FAILOVER TO orcldg;

11. Standby Redo Log

11.1 创建

ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 
  ('/u01/oradata/stdby_redo11.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 
  ('/u01/oradata/stdby_redo12.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 
  ('/u01/oradata/stdby_redo13.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14 
  ('/u01/oradata/stdby_redo14.log') SIZE 200M;

11.2 优势

- 实时应用
- 零丢失
- Active Data Guard

详细见:Oracle Redo 日志配置与管理


12. 监控

12.1 v$archive_dest

SELECT dest_id, status, destination, error 
FROM v$archive_dest WHERE dest_id <= 5;

12.2 v$archive_dest_status

SELECT 
  dest_id, database_mode, 
  recovery_mode, 
  archived_seq#, applied_seq#
FROM v$archive_dest_status;

12.3 v$dataguard_status

SELECT facility, severity, message, timestamp
FROM v$dataguard_status
ORDER BY timestamp DESC;

12.4 进度

-- 主库
SELECT thread#, sequence#, archived, status FROM v$log;

-- 备库
SELECT thread#, sequence#, applied, status 
FROM v$archived_log ORDER BY sequence# DESC;

12.5 Gap

SELECT * FROM v$archive_gap;

13. 性能优化

13.1 Redo 传输

- 网络带宽
- ASYNC
- Net Timeout

13.2 应用

- Parallel
- SGA
- 备库性能

详细见:Oracle Data Guard 性能优化


14. 常见坑与排错

14.1 Gap

- 归档缺失
- FIND_GAP
- 手动传输
- REGISTER

14.2 ORA-16191

- SYS 密码不一致
- 密码文件同步

14.3 ORA-12154

- 网络问题
- tnsnames
- 监听

15. 最佳实践

  1. 物理 Standby:简单
  2. Active Data Guard:实时查询
  3. Maximum Availability:平衡
  4. SYNC:关键业务
  5. Standby Redo Log:实时
  6. Broker:管理
  7. Far Sync:远距离
  8. 监控 Gap:及时
  9. 测试切换:可行
  10. 文档化:DR 计划

16. 参考资料

[1] Oracle Data Guard Concepts and Administration 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/