Oracle Data Guard Redo 传输详解

Oracle Data Guard Redo 传输详解

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


1. 概述

Redo 传输是 Data Guard 的核心[1]:

详细见:Oracle Data Guard 架构详解


2. 传输模式

2.1 SYNC(同步)

- LGWR 直接写 Standby Redo Log
- 主库等待备库确认
- 零数据丢失
- 性能影响

2.2 ASYNC(异步)

- LGWR 异步发送
- 不等待确认
- 可能数据丢失
- 高性能

2.3 FASTSYNC

- SYNC 但不等待写盘
- 网络确认即可
- 折中

3. 进程

3.1 主库

- LGWR:写 Online Redo
- LNS(NSS):发送到备库
- ARCH:归档

3.2 备库

- RFS:接收 Redo
- MRP:应用 Redo(物理备库)
- LSP:应用 Redo(逻辑备库)

4. 配置

4.1 LOG_ARCHIVE_DEST_n

-- SYNC
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 
  'SERVICE=stby1 SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stby1';

-- ASYNC
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 
  'SERVICE=stby1 ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stby1';

4.2 属性

- SYNC/ASYNC:传输模式
- AFFIRM/NOAFFIRM:是否确认写盘
- NET_TIMEOUT:网络超时
- REOPEN:重试间隔
- MAX_FAILURE:最大失败次数
- COMPRESSION:压缩

4.3 Standby Redo Log

-- 备库
ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 
  ('/u01/oradata/srl01.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 
  ('/u01/oradata/srl02.log') SIZE 50M;
-- 至少比 Online Redo 多一组

5. Redo Routes(12c+)

5.1 配置

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

5.2 Far Sync

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

详细见:Oracle Active Data Guard 详解


6. 传输状态

6.1 主库

SELECT dest_id, status, error, gap_status 
FROM v$archive_dest_status 
WHERE dest_id = 2;

SELECT * FROM v$archive_dest;

6.2 备库

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

SELECT * FROM v$standby_log;

6.3 Gap

SELECT * FROM v$archive_gap;

7. Gap 解决

7.1 检查

SELECT * FROM v$archive_gap;
-- thread#, low_sequence#, high_sequence#

7.2 传输

# 主库
RMAN> BACKUP AS COPY ARCHIVELOG SEQUENCE 123 THREAD 1 
  FORMAT '/tmp/arc_%t_%s_%r.arc';

# 传输到备库
scp /tmp/arc_*.arc stby:/tmp/

7.3 注册

-- 备库
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/arc_xxx.arc';

7.4 自动

- FAL_SERVER
- FAL_CLIENT
- 自动 Gap 解决
ALTER SYSTEM SET FAL_SERVER = 'prod';
ALTER SYSTEM SET FAL_CLIENT = 'stby1';

8. 网络优化

8.1 SDU

# sqlnet.ora
DEFAULT_SDU_SIZE = 32767

8.2 SEND/RECV

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 
  'SERVICE=stby1 SYNC SEND_BUF_SIZE=1048576 RECV_BUF_SIZE=1048576 ...';

8.3 压缩

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 
  'SERVICE=stby1 ASYNC COMPRESSION=ENABLE ...';

9. 监控

9.1 Lag

SELECT name, value, time_computed 
FROM v$dataguard_stats 
WHERE name LIKE '%lag%';

9.2 历史

SELECT * FROM v$standby_event_histogram 
WHERE name = 'apply lag';

9.3 错误

SELECT dest_id, error, status 
FROM v$archive_dest_status 
WHERE status != 'VALID';

10. 保护模式

10.1 Maximum Protection

- SYNC + AFFIRM
- 备库故障主库停
- 零数据丢失

10.2 Maximum Availability

- SYNC + AFFIRM
- 备库故障主库继续(降级)
- 零数据丢失(备库可用时)

10.3 Maximum Performance

- ASYNC + NOAFFIRM
- 高性能
- 可能数据丢失

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


11. 应用场景

11.1 同城灾备

- SYNC
- 零数据丢失
- 低延迟

11.2 异地灾备

- ASYNC
- 高性能
- Far Sync

11.3 多备库

- 1 主多备
- 不同保护级别
- Redo Routes

12. 常见坑与排错

12.1 ORA-12154

- TNS 配置
- 检查 tnsnames.ora

12.2 ORA-16198

- Standby Redo Log 满
- 增加组数

12.3 Lag 大

- 网络
- 磁盘
- 优化

13. 最佳实践

  1. Standby Redo Log:必须
  2. SYNC/ASYNC 选择:场景
  3. FAL_SERVER:自动 Gap
  4. 网络优化:SDU/Buffer
  5. 压缩:远距离
  6. 监控 Lag:及时
  7. Gap 解决:自动 + 手动
  8. 测试:Failover
  9. 文档:配置
  10. 监控:告警

14. 参考资料

[1] Oracle Data Guard Concepts and Administration 19c, “Redo Transport” https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/