Oracle 9i 引入 RMAN BLOCKRECOVER 指令,可在資料庫線上、無需離線還原整個檔案的情況下,精準修復損壞的資料區塊。本文記錄一次生產測試庫 ORA-01578 區塊損壞的完整診斷、備份可用性驗證、Block Recover 執行與驗證全流程。
SQL> SELECT * FROM dpa_history;
ERROR at line 1:
ORA-01578: Oracle data block corrupted (file # 15, block # 18)
ORA-01110: data file 15: '/d01/app/oracle/oradata/dpa/dpa01.dbf'
DPA_HISTORY)。rman/rman@catalog_db。Block Recover 需要:損壞區塊所屬 Datafile 的最近全備份 + 該備份 SCN 之後的所有 Archived Redo Log + Online Redo Log。
rman target sys/oracle@dpa catalog rman/rman
RMAN> LIST BACKUP OF DATAFILE 15;
-- 輸出關鍵資訊:
BS Key: 643, Type: Full, Size: 64K, Device: DISK, Completion: 16-MAR-09
Piece: /d02/fullbackup/20090316_data_24_1
Checkpoint SCN: 11856250905, Time: 16-MAR-09
RMAN> LIST BACKUP OF ARCHIVELOG SCN FROM 11856250905;
-- 備份集 680 包含 Sequence 109, 110 (SCN 範圍覆蓋至 11856251487)
RMAN> LIST COPY OF ARCHIVELOG FROM SEQUENCE 110;
-- Disk Copy: Sequence 111, 112 存在於 /d02/arch/
SQL> SELECT sequence#, members, archived, status FROM v$log;
-- Online Redo: Seq 113 (CURRENT), 111/112 (INACTIVE, ARCHIVED)
結論:全備份 SCN 11856250905 → Archived Log Seq 109~112 (備份+磁碟) → Online Redo Seq 113,**Redo 鏈完整無斷點**,滿足 Block Recover 條件。
RMAN> BLOCKRECOVER DATAFILE 15 BLOCK 18;
Starting blockrecover at 16-MAR-09
allocated channel: ORA_DISK_1
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00015
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/d02/fullbackup/20090316_data_24_1 tag=TAG20090316T154352
starting media recovery
archive log thread 1 sequence 111 is already on disk as file /d02/arch/1_111.dbf
archive log thread 1 sequence 112 is already on disk as file /d02/arch/1_112.dbf
channel ORA_DISK_1: restoring archive log thread=1 sequence=109
channel ORA_DISK_1: restoring archive log thread=1 sequence=110
channel ORA_DISK_1: restored backup piece 1
piece handle=/d02/fullbackup/20090316_arch_28 tag=TAG20090316T154731
media recovery complete
Finished blockrecover at 16-MAR-09
SQL> SELECT * FROM dpa_history;
-- 正常返回資料,無 ORA-01578
| 條件 | 說明 |
|---|---|
| 資料庫版本 | 9i+ (9.2.0.4 驗證通過) |
| 資料庫模式 | ARCHIVELOG (必須) |
| 備份類型 | RMAN 備份集 (BACKUPSET) 或 Image Copy |
| Redo 完整性 | 備份 Checkpoint SCN 至今的所有 Redo (Archived + Online) 必須可用 |
| 損壞類型 | 單一/少量區塊媒體損壞 (ORA-01578, ORA-01110) |
| 不適用場景 | 大面積區塊損壞、檔案遺失、系統表空間核心區塊損壞 (需完整恢復) |
| 線上執行 | ✅ 支援資料庫 OPEN 狀態執行,無業務中斷 |
RMAN> VALIDATE BACKUPSET ...、VALIDATE DATAFILE ...。DBVERIFY、ANALYZE TABLE ... VALIDATE STRUCTURE 定期掃描發現潛在損壞。RMAN BLOCKRECOVER DATAFILE n BLOCK m 是 Oracle 9i+ 針對局部區塊損壞的「外科手術式」修復利器。核心成功要素:完整的 Redo 鏈 (備份 SCN 至今) + 線上執行零停機。掌握「驗證備份 → 驗證 Redo → 執行 Block Recover → 驗證業務」四步驟,即可從容應對 ORA-01578 突發故障,將 RTO 從小時級壓縮至分鐘級。