開發庫每日 Crash 4-5 次,Alert Log 大量報錯:
ORA-01578: ORACLE data block corrupted (file # 22, block # 14715)
ORA-01110: data file 22: 'D:\Oracle\ORADATA\CROOT\TRBS1.ORA'
File 22 為回滾段表空間資料檔。資料庫可正常開啟但無法正常關閉,SHUTDOWN IMMEDIATE 時 SMON 嘗試恢復交易 (2, 50) 遭遇壞塊導致實例 Crash。檢查發現 RBS01 為 ONLINE,其餘回滾段皆為 PARTIAL AVAILABLE,手動 ONLINE 後立即被 ACTIVE 交易佔用,甚至停止所有 Session 後 V$TRANSACTION 仍無記錄,無法正常 OFFLINE/DROP 回滾段。
在 init.ora 或 SPFILE 中加入隱含參數:
_corrupted_rollback_segments=(rbs1,rbs2,rbs4,rbs5,rbs6,rbs7,rbs8,rbs9,rbs10)
將除 SYSTEM 以外所有回滾段標記為損壞。
STARTUP MOUNT PFILE='...'
ALTER DATABASE DATAFILE 'D:\Oracle\ORADATA\CROOT\TRBS1.ORA' OFFLINE DROP;
RECOVER DATABASE;
ALTER DATABASE OPEN;
資料庫開啟後查詢 V$ROLLNAME 僅剩 SYSTEM 回滾段,DBA_ROLLBACK_SEGS 顯示其餘為 NEED RECOVERY 狀態。依序執行:
DROP ROLLBACK SEGMENT rbs1;
DROP ROLLBACK SEGMENT rbs2;
...
DROP TABLESPACE rbs INCLUDING CONTENTS AND DATAFILES;
關鍵插曲:Oracle 8i 若 SYSTEM 表空間為字典管理 (DMT),回滾段表空間亦必須為 DMT。初次習慯建立 LMT 表空間導致 ORA-01552: cannot use system rollback segment for non-system tablespace 錯誤。解決:刪除 LMT 表空間,重建 DMT 表空間後成功建立回滾段。
CREATE TABLESPACE rbs DATAFILE '...' SIZE 500M EXTENT MANAGEMENT DICTIONARY;
CREATE ROLLBACK SEGMENT rbs1 TABLESPACE rbs;
...
ALTER ROLLBACK SEGMENT rbs1 ONLINE;
SHUTDOWN IMMEDIATE;
-- 註釋 _corrupted_rollback_segments 參數
STARTUP;
測試 INSERT/COMMIT 正常,修復完成。
_corrupted_rollback_segments 隱含參數允許帶壞塊開啟資料庫,屬緊急搶救手段DBVERIFY 檢測區塊損壞