首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 無備份情況下 UNDO 損壞搶救實戰手冊

     編輯:Oracle 資料庫相關知識

故障現象

UNDO 表空間資料檔損壞/遺失,資料庫僅能啟動至 MOUNT 狀態,OPEN 時報錯:

ORA-01157: cannot identify/lock data file 14
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'

核心原理

利用隱藏參數 _OFFLINE_ROLLBACK_SEGMENTS(或 _CORRUPTED_ROLLBACK_SEGMENTS)標記受損回滾段,讓 Oracle 忽略其上未提交交易,犧牲極少量未提交資料換取資料庫可用性。

四階段搶救流程

階段 1:離線損壞檔案並識別受影響回滾段

-- 1. 離線損壞檔案
ALTER DATABASE DATAFILE 'I:\...\UNDO1.O06DMS0' OFFLINE DROP;

-- 2. 開啟資料庫(僅為查詢回滾段狀態)
ALTER DATABASE OPEN;

-- 3. 查詢回滾段狀態
SELECT segment_name, status FROM dba_rollback_segs;
-- 受損段將顯示 OFFLINE

-- 4. 記錄參數
SHOW PARAMETER UNDO;
-- 確認 undo_tablespace、undo_management

階段 2:建立臨時 PFILE 並以手動 UNDO 管理啟動

-- 1. 建立 PFILE
CREATE PFILE='H:\initO06DMS0.ora' FROM SPFILE;

-- 2. 修改 PFILE 關鍵參數
*.undo_management='MANUAL'
*.undo_tablespace='UNDO2'
*._offline_rollback_segments=('_SYSSMU1_...','_SYSSMU2_...', ...所有 OFFLINE 段...)

-- 3. 以 PFILE 啟動
STARTUP PFILE='H:\initO06DMS0.ora'

階段 3:清除舊回滾段與 UNDO 表空間,重建新環境

-- 1. 逐一刪除受影響回滾段
DROP ROLLBACK SEGMENT "_SYSSMU1_3281912951$";
DROP ROLLBACK SEGMENT "_SYSSMU2_3908286755$";
-- ... 所有列表中的段

-- 2. 刪除舊 UNDO 表空間
DROP TABLESPACE UNDO1 INCLUDING CONTENTS;

-- 3. 建立新 UNDO 表空間
CREATE UNDO TABLESPACE UNDO2 
  DATAFILE 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' SIZE 100M;

-- 4. 從 PFILE 重建 SPFILE 覆蓋原檔
CREATE SPFILE FROM PFILE='H:\initO06DMS0.ora';

-- 5. 關閉資料庫
SHUTDOWN IMMEDIATE;

階段 4:還原自動 UNDO 管理並驗證

-- 1. 以原 SPFILE 啟動
STARTUP;

-- 2. 還原自動管理
ALTER SYSTEM SET UNDO_MANAGEMENT='AUTO' SCOPE=SPFILE;

-- 3. 移除隱藏參數
ALTER SYSTEM RESET "_OFFLINE_ROLLBACK_SEGMENTS" SCOPE=SPFILE;

-- 4. 重啟生效
SHUTDOWN IMMEDIATE;
STARTUP;

-- 5. 最終驗證
SHOW PARAMETER UNDO;
SELECT SEGMENT_NAME, STATUS FROM DBA_ROLLBACK_SEGS;
-- 所有段應顯示 ONLINE

風險與注意事項

  • 資料損失風險:若受損 UNDO 含未提交交易,該交易變更將永久遺失(通常可接受)。
  • 隱藏參數風險:僅作緊急搶救,事後必須移除。
  • 生產環境建議:務必配置 UNDO 表空間多路徑鏡像(ASM/RAID)並定期備份控制檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved