首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

實戰紀錄:Oracle 8i 回滾段區塊損壞修復全過程

     編輯:Oracle 資料庫基礎

現象描述

開發庫每日 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 回滾段。

環境限制

  • 非歸檔模式(NOARCHIVELOG)
  • 無定期備份
  • 開發環境,資料遺失可接受

修復策略:標記回滾段損壞並重建

1. 關閉資料庫,修改參數檔

在 init.ora 或 SPFILE 中加入隱含參數:


_corrupted_rollback_segments=(rbs1,rbs2,rbs4,rbs5,rbs6,rbs7,rbs8,rbs9,rbs10)

將除 SYSTEM 以外所有回滾段標記為損壞。

2. 啟動至 MOUNT 狀態並移除損壞資料檔


STARTUP MOUNT PFILE='...'
ALTER DATABASE DATAFILE 'D:\Oracle\ORADATA\CROOT\TRBS1.ORA' OFFLINE DROP;
RECOVER DATABASE;
ALTER DATABASE OPEN;

3. 驗證並清除殘留回滾段

資料庫開啟後查詢 V$ROLLNAME 僅剩 SYSTEM 回滾段,DBA_ROLLBACK_SEGS 顯示其餘為 NEED RECOVERY 狀態。依序執行:


DROP ROLLBACK SEGMENT rbs1;
DROP ROLLBACK SEGMENT rbs2;
...
DROP TABLESPACE rbs INCLUDING CONTENTS AND DATAFILES;

4. 重建回滾段表空間與回滾段

關鍵插曲: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;

5. 清理參數並正常重啟


SHUTDOWN IMMEDIATE;
-- 註釋 _corrupted_rollback_segments 參數
STARTUP;

測試 INSERT/COMMIT 正常,修復完成。

關鍵技術點總結

  1. _corrupted_rollback_segments 隱含參數允許帶壞塊開啟資料庫,屬緊急搶救手段
  2. 非歸檔模式下無法進行區塊級媒體恢復,重建為唯一出路
  3. DMT/LMT 表空間相容性限制在 8i/9i 早期版本常被忽略
  4. 修復後務必移除隱含參數,避免長期運行風險

事後建議

  • 開發庫亦應啟用歸檔模式並建立基本備份策略
  • 定期執行 DBVERIFY 檢測區塊損壞
  • 升級至 10g+ 享受自動儲存管理 (ASM) 與區塊損壞自動修復
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved