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. 離線損壞檔案
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
-- 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'
-- 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;
-- 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