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

Oracle表空間故障恢復實戰手冊:五大場景分級應對策略

     編輯:Oracle 資料庫基礎

前言

表空間故障是DBA最常面對的核心挑戰。本文依據表空間類型(用戶、臨時、系統、回滾、控制文件)與數據庫狀態(打開、掛載、關閉),提供分級恢復方案,助你從容應對ORA-01157、ORA-01110等經典錯誤。

一、 用戶表空間故障

典型錯誤

  • 啟動報ORA-01157、ORA-01110或OS級ORA-07360
  • 正常關閉時觸發ORA-01116、ORA-01110、ORA-07368

方案A:對象可重建(最簡單)

STARTUP MOUNT;
ALTER DATABASE DATAFILE 'filename' OFFLINE DROP;
ALTER DATABASE OPEN;
DROP TABLESPACE ts_name INCLUDING CONTENTS;
-- 重建表空間、對象、導入數據

適用:近期有導出、對象DDL可腳本化、數據可重新加載。

方案B:對象不可重建(介質恢復)

  1. 從備份還原丟失數據文件
  2. STARTUP MOUNT
  3. 查詢日誌序列與SCN:
    SELECT v1.group#, member, sequence#, first_change# FROM v$log v1, v$logfile v2 WHERE v1.group#=v2.group#;
  4. 檢查可恢復性(NOARCHIVELOG模式):
    SELECT file#, change# FROM v$recover_file;
    若change# > min(first_change#) 可恢復,否則退回方案A或全庫恢復。
  5. RECOVER DATAFILE 'filename';
  6. 驗證無誤後 ALTER DATABASE OPEN RESETLOGS;

只讀表空間特例

原則:無需介質恢復,直接還原備份文件即可。
例外:備份後曾切換為READ WRITE或再次READ ONLY,則需介質恢復。

二、 臨時表空間故障

不存儲持久數據,恢復最簡單:

DROP TABLESPACE temp_ts INCLUDING CONTENTS AND DATAFILES;
CREATE TEMPORARY TABLESPACE temp_ts TEMPFILE '...' SIZE ... AUTOEXTEND ON;

三、 系統表空間故障

核心字典損壞,若無有效備份唯一出路是重建數據庫。平時必須:

  • 啟用歸檔模式(ARCHIVELOG)
  • 控制文件多路復用
  • 系統表空間備份頻率最高(建議每日RMAN Level 0)

四、 回滾/UNDO表空間故障

分三種數據庫狀態處理:

1. 數據庫已完全關閉(SHUTDOWN NORMAL/IMMEDIATE)

-- 1. 確認關閉
-- 2. 註釋 init.ora 中 rollback_segments
STARTUP RESTRICT MOUNT;
ALTER DATABASE DATAFILE 'undo_file' OFFLINE DROP;
ALTER DATABASE OPEN;
-- 若報 ORA-00376/ORA-01110
SHUTDOWN IMMEDIATE;
-- 3. 設置隱藏參數跳過損壞回滾段
_corrupted_rollback_segments = (_SYSSMU1$, _SYSSMU2$)
STARTUP RESTRICT;
DROP TABLESPACE undo_ts INCLUDING CONTENTS;
-- 重建 UNDO 表空間與回滾段
ALTER SYSTEM DISABLE RESTRICTED SESSION;
-- 恢復 init.ora 參數

2. 數據庫異常終止(CRASH / SHUTDOWN ABORT)

-- 1. 還原備份文件
STARTUP MOUNT;
ALTER DATABASE DATAFILE 'undo_file' ONLINE;
-- 檢查日誌與恢復文件 SCN
SELECT v1.group#, member, sequence#, first_change# FROM v$log v1, v$logfile v2 WHERE v1.group#=v2.group#;
SELECT file#, change# FROM v$recover_file;
RECOVER DATAFILE 'undo_file';
ALTER DATABASE OPEN;

3. 數據庫處於打開狀態

直接離線刪除並重建:

DROP ROLLBACK SEGMENT ...;
DROP TABLESPACE undo_ts INCLUDING CONTENTS;
CREATE UNDO TABLESPACE undo_ts ...;
ALTER SYSTEM SET UNDO_TABLESPACE = undo_ts;

五、 控制文件恢復

所有控制文件損壞

  • 文件系統:cp control.bak /oradata/control01.ctl
  • 裸設備:dd if=con.bak of=/dev/rdsk/c0t1d0s1 seek=128

部分損壞

刪除損壞副本,修改CONTROL_FILES參數指向完好副本,STARTUP即可。

DBA避坑速查表

場景關鍵決策點禁忌操作
用戶表空間對象可否重建?NOARCHIVELOG下強行RECOVER導致數據不一致
UNDO表空間數據庫狀態(OPEN/MOUNT/ABORT)OPEN狀態直接OFFLINE DROP活躍UNDO文件
系統表空間備份可用性嘗試手工修復字典對象
控制文件是否全部損壞單副本環境不備份控制文件

總結

恢復的核心是備份策略決定恢復選項。建立「每日Level 0 + 每小時Level 1 + 實時歸檔備份」的RMAN策略,配合定期恢復演練,才是治本之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved