ORA-01578: Oracle data block corrupted (file #, block #)
成因分類
- 硬體 I/O 錯誤 (磁碟壞軌、控制器故障、纜線鬆動)。
- 作業系統 I/O 子系統/快取錯誤 (檔案系統 Bug、Volume Manager 鏡像不同步)。
- 記憶體/分頁問題 (ECC 錯誤、Swap 空間不足導致頁面損壞)。
- Oracle 讀取未格式化系統區塊 (邏輯損壞)。
- 資料檔離線/縮小導致邏輯位址無效。
關鍵特徵:錯誤發生時間 **晚於實際損壞時間** (只有讀取到該區塊時才報錯)。
診斷步驟
-- 1. 定位損壞區塊歸屬物件
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = &file_num
AND &block_num BETWEEN block_id AND block_id + blocks - 1;
-- 2. 若為索引 → 直接 REBUILD
ALTER INDEX schema.index_name REBUILD [ONLINE] [TABLESPACE tbs];
-- 3. 若為表 → 驗證結構判斷永久/隨機損壞
ANALYZE TABLE schema.table_name VALIDATE STRUCTURE CASCADE;
-- 執行 2-3 次觀察一致性
-- ORA-01578 同參數 → 永久物理/邏輯損壞
-- ORA-01578 異參數 → 記憶體/硬體隨機錯誤
修復策略
| 場景 | 方案 |
| 有近期備份 (RMAN/EXP) | 最佳:RMAN `BLOCKRECOVER` 區塊級恢復,或表空間/資料檔恢復。 |
| 無備份,僅救資料 | Event 10231 跳過壞區塊導出: 1. `SHUTDOWN IMMEDIATE` 2. `init.ora` 加 `event="10231 trace name context forever, level 10"` 3. `STARTUP RESTRICT` 4. `CREATE TABLE temp AS SELECT * FROM bad_table;` (跳過壞塊) 5. 移除 event 重啟 6. `RENAME bad_table TO bad_table_old; RENAME temp TO bad_table;` 7. 重建索引/約束/授權 |
| 損壞在資料字典 / 回滾段 / SYSTEM 表空間 | 立即聯繫 Oracle Support,嚴禁自行嘗試,極高風險導致資料庫無法啟動。 |
ORA-01628: max # extents reached for rollback segment / table / index
成因
- 物件儲存參數 `MAXEXTENTS` 達到上限 (非硬體極限,由 `DB_BLOCK_SIZE` 決定理論上限)。
- 常見於頻繁 DML 的表/索引、長跑交易的回滾段、臨時表空間排序區段。
解決方案
- 調大 MAXEXTENTS (若未達 `LARGEST_MAXEXTENTS`):
`ALTER TABLE schema.table_name STORAGE (MAXEXTENTS 10000);`
`ALTER ROLLBACK SEGMENT rbs_name STORAGE (MAXEXTENTS UNLIMITED);` (Oracle 9i+ 支援 UNLIMITED)
- 已達理論上限:重建物件並調大 `INITIAL`/`NEXT` 減少 Extent 數量:
`EXP ... COMPRESS=Y` 導出 → `DROP TABLE` → `IMP` 導入 (新儲存參數) 或 `CREATE TABLE new AS SELECT * FROM old` → `DROP old` → `RENAME`。
- 回滾段/索引/臨時段:直接 `DROP` 重建 (回滾段需先 `OFFLINE`)。
- 臨時表空間:調整 `TEMPORARY TABLESPACE` 儲存參數或改用 **Locally Managed Temporary Tablespace** (Oracle 8i+ 預設 `UNIFORM SIZE`/`AUTOALLOCATE`,不受 MAXEXTENTS 限制)。
範例錯誤
ORA-01628: max # extents 50 reached for rollback segment RBS_1
-- 解決:ALTER ROLLBACK SEGMENT RBS_1 STORAGE (MAXEXTENTS UNLIMITED);
預防與監控建議
- 啟用 **DB_BLOCK_CHECKSUM=FULL** (資料塊檢驗和) + **DB_BLOCK_CHECKING=MEDIUM/FULL** (邏輯一致性檢查) 早期發現損壞。
- 定期 `RMAN VALIDATE DATABASE` / `BACKUP VALIDATE` 掃描壞塊。
- 監控 `DBA_SEGMENTS.MAX_EXTENTS` 接近上限告警。
- 採用 **Locally Managed Tablespace (LMT)** + **AUTOALLOCATE** 完全消除 Extent 管理負擔 (Oracle 8i+ 標準)。
- 硬體層:RAID 1/5/10 + 磁碟巡檢 + ECC 記憶體 + 不斷電系統 (UPS)。
結語
ORA-01578 是最嚴重的資料完整性錯誤,**備份有效性是唯一底線**;ORA-01628 則是儲存管理疏忽的信號,遷移至 LMT + AUTOALLOCATE 可徹底根治。建立「壞塊零容忍」監控體系 (RMAN Validate + Block Change Tracking + 硬體健康度),才能在災難發生前完成避險。