Oracle Data Guard 故障案例详解

Oracle Data Guard 故障案例详解

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


1. 概述

Data Guard 实战故障案例[1]:

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


2. 案例 1:GAP 故障

2.1 现象

- 备库延迟
- v$archive_gap 有数据
- Redo 缺失

2.2 诊断

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

2.3 修复

# 主库查找归档
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> BACKUP AS COPY ARCHIVELOG SEQUENCE BETWEEN 100 AND 105 FORMAT '/tmp/%U';
scp /tmp/arc_* stby:/tmp/
-- 备库
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/arc_100.arc';
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/arc_101.arc';

2.4 验证

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

3. 案例 2:密码文件不一致

3.1 现象

- ORA-16191
- Redo 传输失败
- 备库未同步

3.2 诊断

- 主备 SYS 密码不同
- 密码文件不一致

3.3 修复

# 主库
orapwd file=$ORACLE_HOME/dbs/orapwprod password=****** force=y

# 复制
scp $ORACLE_HOME/dbs/orapwprod stby:$ORACLE_HOME/dbs/orapwstby

3.4 验证

-- 备库
SELECT process, status FROM v$managed_standby;
-- RFS 运行

4. 案例 3:Standby Redo Log 满

4.1 现象

- 传输延迟
- Standby Redo 未归档
- 备库慢

4.2 诊断

SELECT group#, status, bytes/1024/1024 AS mb 
FROM v$standby_log;
-- ACTIVE:未归档

4.3 修复

-- 增加组
ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 
  ('/u01/redo/s08.log') SIZE 50M;

-- 调整归档
ALTER SYSTEM SET log_archive_max_processes=4;

4.4 验证

SELECT * FROM v$dataguard_stats;
-- 延迟正常

5. 案例 4:Switchover 失败

5.1 现象

- Switchover 失败
- ORA-16139
- 状态异常

5.2 诊断

SELECT switchover_status FROM v$database;
-- NOT ALLOWED

5.3 修复

- 检查 GAP
- 启动 Apply
- 终止会话
-- 备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
-- 等待同步

-- 主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY 
  WITH SESSION SHUTDOWN;

5.4 验证

DGMGRL> SHOW CONFIGURATION;

6. 案例 5:备库数据文件缺失

6.1 现象

- 主库新增数据文件
- 备库未创建
- Apply 停止

6.2 诊断

-- 备库 alert log
-- ORA-01111
-- 文件不存在

6.3 修复

-- 备库
ALTER DATABASE CREATE DATAFILE '/u01/oradata/users02.dbf' 
  AS '/u01/oradata/users02.dbf';
-- 或
ALTER SYSTEM SET standby_file_management='AUTO';

6.4 验证

SELECT file_name FROM dba_data_files;
-- 一致

7. 案例 6:网络中断

7.1 现象

- 网络中断
- Redo 传输停止
- 延迟增加

7.2 诊断

ping stby
tnsping stby

7.3 修复

- 修复网络
- FAL 自动同步
- 验证

7.4 验证

SELECT * FROM v$dataguard_stats;
-- 延迟恢复

8. 案例 7:MRP 停止

8.1 现象

- MRP 进程停止
- Apply 停止
- 延迟增加

8.2 诊断

SELECT process, status FROM v$managed_standby 
WHERE process LIKE 'MRP%';
-- ERROR/STOPPED

8.3 修复

-- 检查 alert log
-- 修复错误
-- 重启
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

8.4 验证

SELECT process, status FROM v$managed_standby;
-- APPLYING LOG

9. 案例 8:Far Sync 故障

9.1 现象

- Far Sync 故障
- 零丢失中断
- 主库降级

9.2 诊断

DGMGRL> SHOW FAR_SYNC farsync;

9.3 修复

- 启动 Far Sync
- 或切换备用 Far Sync
- 恢复

9.4 验证

SELECT protection_mode, protection_level FROM v$database;
-- 一致

10. 经验总结

10.1 预防

- 监控
- 告警
- 定期检查

10.2 响应

- 快速
- 诊断
- 修复

10.3 文档

- 故障记录
- 解决方案
- 改进

11. 最佳实践

  1. 监控:实时
  2. 告警:及时
  3. GAP:修复
  4. 密码:一致
  5. Standby Redo:足够
  6. 网络:冗余
  7. 演练:故障
  8. 文档:记录
  9. 自动化:修复
  10. 改进:持续

12. 参考资料

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