表空間損壞表現為啟動報 ORA-01157/ORA-01110、關閉報 ORA-01116/ORA-07368。恢復策略視表空間類型、備份可用性、歸檔模式而異。本文提供五大場景分級方案。
最簡單:離線丟棄損壞資料檔 → 刪除表空間 → 重建表空間與物件
SVRMGR> STARTUP MOUNT
SVRMGR> ALTER DATABASE DATAFILE 'filename' OFFLINE DROP;
SVRMGR> ALTER DATABASE OPEN;
SVRMGR> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
-- 重建表空間、執行 DDL、匯入資料
前提:有備份、運行歸檔模式 (ARCHIVELOG)
STARTUP MOUNTSELECT 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;
CHANGE# > 最小 FIRST_CHANGE# → 可恢復CHANGE# < 最小 FIRST_CHANGE# → 不可恢復,需完整恢復或採場景 1RECOVER DATAFILE 'filename';ALTER DATABASE OPEN RESETLOGS;僅需從備份還原資料檔,無需介質恢復。例外:最後備份後曾切換為 READ WRITE 或 READ ONLY,則需介質恢復。
不含永久資料,直接刪除重建:
DROP TABLESPACE temp_ts INCLUDING CONTENTS;
CREATE TEMPORARY TABLESPACE temp_ts TEMPFILE 'path' SIZE 100M;
核心字典儲存於此,損壞嚴重:
三種狀態分別處理:
init.ora 註解 rollback_segmentsSTARTUP RESTRICT MOUNTALTER DATABASE DATAFILE 'filename' OFFLINE DROP;ALTER DATABASE OPEN;
SHUTDOWN IMMEDIATE,修改 init.ora 加入:
_corrupted_rollback_segments = (segment_name, ...)
STARTUP RESTRICTDROP TABLESPACE rbs_ts INCLUDING CONTENTS; 重建表空間與回滾段ALTER SYSTEM DISABLE RESTRICTED SESSION;init.ora 設定STARTUP MOUNTALTER DATABASE DATAFILE 'filename' ONLINE;RECOVER DATAFILE 'filename';ALTER DATABASE OPEN;直接刪除回滾段與表空間 → 重建。
dd if=con.bak of=/dev/rdsk/drd1 seek=128用完好控制檔啟動:STARTUP NOMOUNT → 複製完好檔覆蓋損壞檔 → STARTUP
| 表空間類型 | 有備份+歸檔 | 無備份/非歸檔 | 關鍵操作 |
|---|---|---|---|
| 用戶 | 介質恢復 | 重建或近期匯入 | RECOVER DATAFILE |
| 唯讀 | 僅還原檔案 | 僅還原檔案 | 無需 RECOVER |
| 臨時 | 刪除重建 | 刪除重建 | DROP/CREATE TEMPORARY |
| 系統 | 介質恢復 | 重建資料庫 | 無備份必重建 |
| 回滾 | 視關閉狀態分級處理 | 離線丟棄+隱藏參數 | _corrupted_rollback_segments |
| 控制檔 | 還原備份 | 需至少一份完好 | 多路徑多工最關鍵 |
核心建議:多路徑多工控制檔、啟用歸檔模式、定期驗證備份可恢復性、建立標準化恢復操作手冊。