Oracle Data Guard Gap 修复详解

Oracle Data Guard Gap 修复详解

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


1. 概述

GAP 是 Data Guard 常见问题[1]:

详细见:Oracle Redo 传输详解Oracle Data Guard 故障诊断详解


2. GAP 概念

2.1 定义

- 备库缺失归档
- Redo 传输中断
- 备库落后

2.2 原因

- 网络中断
- 磁盘空间
- 备库故障
- 主库归档丢失

2.3 影响

- 数据延迟
- 灾备风险
- 切换问题

3. GAP 检测

3.1 v$archive_gap

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

3.2 v$archive_dest

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

3.3 序列对比

-- 主库
SELECT max(sequence#) FROM v$archived_log WHERE dest_id=2;
-- 备库
SELECT max(sequence#) FROM v$archived_log WHERE applied='YES';

4. FAL 自动修复

4.1 FAL

- Fetch Archive Log
- 备库自动请求
- 自动修复

4.2 配置

-- 备库
ALTER SYSTEM SET fal_server='prod';
ALTER SYSTEM SET fal_client='stby';

4.3 验证

- 自动
- 检查
- 修复

5. 手动修复

5.1 查找归档

# 主库
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> LIST ARCHIVELOG SEQUENCE BETWEEN 100 AND 105;

5.2 备份归档

# 主库
RMAN> BACKUP AS COPY ARCHIVELOG SEQUENCE BETWEEN 100 AND 105 
  FORMAT '/tmp/arc_%U';

# 传输
scp /tmp/arc_* stby:/tmp/

5.3 注册

-- 备库
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/arc_100.arc';
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/arc_101.arc';
-- 或
ALTER DATABASE REGISTER OR REPLACE PHYSICAL LOGFILE '/tmp/arc_100.arc';

5.4 验证

SELECT * FROM v$archive_gap;
-- 无数据

6. 增量备份修复

6.1 大 GAP

- GAP 太大
- 归档丢失
- 增量备份

6.2 流程

# 主库
# 查找备库 SCN
sqlplus / as sysdba @stby
SELECT current_scn FROM v$database;

# 主库增量备份
rman target /
RMAN> BACKUP INCREMENTAL FROM SCN 1234567890 
  DATABASE FORMAT '/tmp/inc_%U';

# 传输
scp /tmp/inc_* stby:/tmp/

6.3 恢复

-- 备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- RMAN 恢复
rman target /
RMAN> CATALOG START WITH '/tmp/inc_';
RMAN> RECOVER DATABASE NOREDO;

6.4 重启

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

7. 重建备库

7.1 严重 GAP

- GAP 严重
- 无法修复
- 重建

7.2 RMAN DUPLICATE

rman target sys/xxx@prod auxiliary sys/xxx@stby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE;

7.3 验证

SELECT database_role, open_mode FROM v$database;
SELECT * FROM v$archive_gap;

8. 预防

8.1 监控

- v$archive_gap
- 延迟
- 告警

8.2 网络

- 冗余
- 监控
- 修复

8.3 空间

- 归档空间
- FRA
- 监控

8.4 备份

- 归档备份
- 多重
- 安全

9. 自动化

9.1 脚本

#!/bin/bash
# gap_check.sh
sqlplus -s / as sysdba <<EOF
SELECT * FROM v$archive_gap;
EOF

9.2 告警

- GAP 告警
- 通知
- 响应

9.3 修复

- 自动 FAL
- 手动
- 重建

10. 常见问题

10.1 FAL 不工作

- 配置
- fal_server
- 检查

10.2 归档丢失

- 增量备份
- 或重建
- 评估

10.3 重建慢

- 大库
- Active Database
- 优化

11. 最佳实践

  1. 监控:GAP
  2. FAL:配置
  3. 网络:冗余
  4. 空间:足够
  5. 备份:归档
  6. 自动化:检测
  7. 告警:及时
  8. 测试:修复
  9. 文档:流程
  10. 演练:GAP

12. 参考资料

[1] Oracle Data Guard 19c, “Resolving Archive Gaps” https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/