使用者誤刪除回滾段表空間 RBS 的資料檔 rbs01.dbf,導致資料庫無法正常啟動(ORA-01157、ORA-01110)。
SYSTEM 表空間內建 SYSTEM 回滾段,資料庫啟動**必須**上線。SYSTEM 回滾段啟動資料庫至 MOUNT 階段進行修復。SVRMGR> SHUTDOWN ABORT
$ vi $ORACLE_HOME/dbs/init.ora
rollback_segments = (system)
_corrupted_rollback_segments = (r01,r02,r03,r04) -- 標記損壞段跳過
SVRMGR> STARTUP MOUNT
SVRMGR> ALTER DATABASE DATAFILE '##/##/rbs01.dbf' OFFLINE DROP;
SVRMGR> RECOVER DATABASE USING BACKUP CONTROLFILE;
-- 若提示指定日誌,依 sequence# 提供線上重做日誌路徑
SVRMGR> ALTER DATABASE OPEN RESETLOGS;
OFFLINE DROP:從控制檔移除檔案,避免後續恢復嘗試讀取。USING BACKUP CONTROLFILE:控制檔與資料檔 SCN 不一致時必須指定。RESETLOGS:重置重做日誌序列,產生新化身。SVRMGR> ALTER ROLLBACK SEGMENT r01 OFFLINE DROP;
SVRMGR> ALTER ROLLBACK SEGMENT r02 OFFLINE DROP;
SVRMGR> ALTER ROLLBACK SEGMENT r03 OFFLINE DROP;
SVRMGR> ALTER ROLLBACK SEGMENT r04 OFFLINE DROP;
SVRMGR> DROP TABLESPACE rbs INCLUDING CONTENTS;
SVRMGR> CONNECT INTERNAL
SVRMGR> CREATE ROLLBACK SEGMENT ro TABLESPACE system; -- 臨時段
SVRMGR> ALTER ROLLBACK SEGMENT ro ONLINE;
SVRMGR> CREATE TABLESPACE rbs DATAFILE '##/##/rbs01.dbf' SIZE ##K;
SVRMGR> CREATE ROLLBACK SEGMENT r01 TABLESPACE rbs;
SVRMGR> CREATE ROLLBACK SEGMENT r02 TABLESPACE rbs;
SVRMGR> CREATE ROLLBACK SEGMENT r03 TABLESPACE rbs;
SVRMGR> CREATE ROLLBACK SEGMENT r04 TABLESPACE rbs;
SVRMGR> ALTER ROLLBACK SEGMENT r01 ONLINE;
SVRMGR> ALTER ROLLBACK SEGMENT r02 ONLINE;
SVRMGR> ALTER ROLLBACK SEGMENT r03 ONLINE;
SVRMGR> ALTER ROLLBACK SEGMENT r04 ONLINE;
SVRMGR> SHUTDOWN ABORT
$ vi $ORACLE_HOME/dbs/init.ora
rollback_segments = (r01,r02,r03,r04)
-- 移除 _corrupted_rollback_segments
SVRMGR> STARTUP
RECOVER DATABASE USING BACKUP CONTROLFILE 需有可用控制檔備份或追蹤檔。ro:建立於 SYSTEM 表空間,僅供重建過程使用,後續可刪除。ALTER DATABASE DATAFILE ... OFFLINE DROP → CREATE UNDO TABLESPACE → 切換 UNDO_TABLESPACE 參數)。DBA_ROLLBACK_SEGS 確認所有段 STATUS = ONLINE。SELECT * FROM V$ROLLSTAT 觀察使用狀況。回滾段資料檔誤刪是經典災難場景。核心邏輯:**以 SYSTEM 回滾段繞過損壞段啟動 → 離線損壞檔並 RESETLOGS 重置 → 重建回滾段體系**。熟練掌握此流程,可在無備份檔案情況下最大程度挽救業務資料(僅丟失回滾段內未提交交易)。