Data Guard 归档传输 GAP 排查与修复
一、问题现象
主备库v$managed_standby显示:
主库 LNS WRITING sequence 480 -- 实时 redo 在传 主库 ARCH CLOSING sequence 478 -- 主库已归档 备库 RFS IDLE sequence 480 -- 备库已收到当前 redo 备库 MRP0 WAIT_FOR_GAP sequence 469 ← apply 卡在 469判断:实时 redo 流(LNS → RFS)通;归档传输(ARCH 路径)从 469 之后断开,备库 apply 进程卡住。
二、诊断步骤
1. 备库确认归档接收情况
-- 备库SELECT*FROMv$archive_gap;SELECTsequence#, applied, archived, deleted, nameFROMv$archived_logWHEREsequence# BETWEEN 466 AND 480ORDERBYsequence#;备库
v$archive_gap可能为空——MRP0 在等但 FAL 还没主动发现。
备库归档只到 468,469 之后未到达。
2. 主库确认本地归档与传输状态
-- 主库SELECTsequence#, applied, archived, deleted, nameFROMv$archived_logWHEREsequence# BETWEEN 466 AND 480ORDERBYsequence#;主库 469-479 都在本地,但传到 dest_2 的记录从 469 开始缺失。
-- 主库查 dest_2 状态SELECTdest_id,status,error,gap_status,db_unique_name,archived_seq#, applied_seq#FROMv$archive_dest_statusWHEREdest_id=2;报错示例:
STATUS: ERROR ERROR : ORA-00270: error creating archive log GAP_STATUS: RESOLVABLE GAP
3. 看备库 alert log 找具体子错误
tail-500$ORACLE_BASE/diag/rdbms/<dbname>/<sid>/trace/alert_<sid>.log|grep-A5"ORA-00270"常见子错误:
| 子错误 | 含义 |
|---|---|
ORA-15041: diskgroup space exhausted | ASM 磁盘组满 |
ORA-19809: limit exceeded for recovery files | FRA 满 |
ORA-19504 / ORA-17502 | 路径不存在 / 权限问题 |
ORA-16191 | 密码文件不一致 |
三、根因定位
ORA-00270 = 主库往备库写归档时,备库这一端创建文件失败。
主备网络通(否则报 12541 / 12154),问题在备库的归档落地路径或空间。
四、修复
路径 A:备库归档目的地空间不足
-- 备库查 ASM 磁盘组SELECTname,total_mb,free_mb,ROUND(free_mb/total_mb*100,2)ASpct_freeFROMv$asm_diskgroup;-- 看 FRA 占用SELECT*FROMv$recovery_area_usage;清理过期归档:
rman target / RMAN>DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE'sysdate-3';或扩 FRA:
ALTERSYSTEMSETdb_recovery_file_dest_size=200G SCOPE=BOTH;路径 B:手动补归档(最稳,不依赖传输修复)
# 主库上把缺失的归档拷贝到备库scp'+DATA01/CCRB06/ARCHIVELOG/.../thread_1_seq_469.dbf'\oracle@standby:/u01/archive/# 469 到 479 都拷过去-- 备库逐个注册ALTERDATABASEREGISTER LOGFILE'/u01/archive/thread_1_seq_469.dbf';ALTERDATABASEREGISTER LOGFILE'/u01/archive/thread_1_seq_470.dbf';...注册完 MRP0 自动开始 apply。
路径 C:触发主库重传(修复传输问题后)
-- 主库ALTERSYSTEMSETLOG_ARCHIVE_DEST_STATE_2=DEFER;ALTERSYSTEMSETLOG_ARCHIVE_DEST_STATE_2=ENABLE;-- 强制切换日志触发归档ALTERSYSTEM ARCHIVE LOGCURRENT;五、修复后验证
-- 主库SELECTdest_id,status,error,archived_seq#, applied_seq#FROMv$archive_dest_statusWHEREdest_id=2;-- 备库SELECTprocess,status,sequence#FROMv$managed_standbyWHEREprocessIN('MRP0','RFS');SELECT*FROMv$archive_gap;期望:
- 主库 dest_2 STATUS =
VALID,error 为空 - 备库 MRP0 状态从
WAIT_FOR_GAP变成APPLYING_LOG - archived_seq# 与 applied_seq# 持续追平
附:常用诊断 SQL 速查
-- 备库 apply 进度SELECTsequence#, applied FROM v$archived_logWHEREapplied='YES'ORDERBYsequence# DESC;-- 主备 lagSELECTname,value,time_computedFROMv$dataguard_statsWHEREnameIN('transport lag','apply lag');-- Broker 全局状态(如启用)-- DGMGRL> SHOW CONFIGURATION VERBOSE;