核心提示:當誤刪表、日志損壞或控制文件丟失時,Oracle的不完全恢復是DBA最后的救命稻草。掌握關鍵恢復技術,可在數據災難中力挽狂瀾。
一、不完全恢復核心概念
1. 核心特點
- 必須關閉數據庫:在
MOUNT
狀態下執行重做日志恢復 - 權限要求:以
SYSDBA
身份連接操作 - 數據回溯:整個數據庫回滾到指定時間點,后續數據永久丟失
2. 適用場景
- 重要數據被破壞(如誤刪表)
- 最小化備份測試驗證
- 完全恢復時丟失歸檔日志或當前在線日志(重要考點)
- 誤刪除表空間(需使用備份控制文件)
3. 恢復類型
類型 | 應用場景 |
---|---|
基于時間點 | 恢復到指定時間點前的狀態 |
基于SCN | 恢復到特定SCN號前的狀態 |
基于CANCEL | 恢復到歸檔日志/當前日志斷點 |
使用備份控制文件 | 誤刪表空間等控制文件損壞場景 |
二、不完全恢復通用步驟
- 定位錯誤點:使用LogMiner分析DDL/DML誤操作(時間點/SCN/SQL)
- 備份當前庫:立即執行數據庫全量備份
- 還原舊備份:恢復錯誤發生前的數據文件備份
- 前滾恢復:應用日志至目標時間點/SCN
- 重置日志:
ALTER DATABASE OPEN RESETLOGS
三、實戰案例解析
? 案例1:恢復誤刪表(基于時間點)
場景:scott.t1
表被誤刪且PURGE
-- 1. 定位刪除操作
SELECT username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time,sql_redo
FROM v$logmnr_contents
WHERE lower(sql_redo) LIKE 'drop table%';-- 輸出結果
USERNAME SCN TIME SQL_REDO
SCOTT 1918000 2022-10-01 17:28:29 drop table t1 purge;-- 2. 關閉庫并還原備份
SHUTDOWN ABORT;
rm *.dbf # 刪除所有數據文件
cp /u01/back1/*.dbf ./ # 還原備份-- 3. 執行時間點恢復
STARTUP MOUNT;
RECOVER DATABASE UNTIL TIME '2022-10-01 17:28:29';
AUTO # 自動應用日志-- 4. 重置日志打開
ALTER DATABASE OPEN RESETLOGS;
? 案例2:當前日志損壞恢復
場景:redo01.log
被刪除導致崩潰
-- 1. 嘗試完全恢復(失敗)
RECOVER DATABASE; -- 2. 執行不完全恢復
RECOVER DATABASE UNTIL CANCEL;
CANCEL # 手動終止恢復-- 3. 重置日志打開
ALTER DATABASE OPEN RESETLOGS;
四、備份控制文件恢復(核心難點)
? 案例1:控制文件+數據文件損壞
場景:表空間abcd
數據文件丟失且控制文件損壞
-- 1. 還原備份文件
cp /u01/back/*.dbf ./ # 數據文件
cp con.bak1 control*.ctl # 控制文件-- 2. 重建丟失的數據文件
STARTUP;
ALTER DATABASE CREATE DATAFILE '/u01/oradata/prod/abcd01.dbf';-- 3. 使用備份控制文件恢復
RECOVER DATABASE USING BACKUP CONTROLFILE;
輸入日志路徑:/u01/oradata/prod/redo03.log # 手動指定當前日志-- 4. 重置打開
ALTER DATABASE OPEN RESETLOGS;
? 案例2:新增表空間后的控制文件恢復
場景:備份控制文件后新建表空間ceshi
-- 1. 啟動時發現文件不匹配
STARTUP;
ORA-01589: 必須使用RESETLOGS或NORESETLOGS打開-- 2. 恢復時出現未命名文件
RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-01244: 未命名數據文件被添加到控制文件-- 3. 重建并重命名數據文件
ALTER DATABASE CREATE DATAFILE '/u01/oracle/dbs/UNNAMED00003'
AS '/u01/oradata/prod/ceshi01.dbf'; # 關鍵命令!-- 4. 完成恢復并打開
RECOVER DATABASE USING BACKUP CONTROLFILE;
ALTER DATABASE OPEN RESETLOGS;
五、關鍵技術總結
-
LogMiner精準定位:
EXECUTE dbms_logmnr_d.build('dict.ora','/logmnr_dir',dbms_logmnr_d.store_in_flat_file); EXECUTE dbms_logmnr.add_logfile('/arch/arch_1_111.log',options=>dbms_logmnr.NEW);
-
控制文件恢復核心命令:
RECOVER DATABASE USING BACKUP CONTROLFILE; # 必須配合RESETLOGS
-
數據文件重建技巧:
ALTER DATABASE CREATE DATAFILE '損壞文件路徑' AS '新路徑'; -- 同時完成物理文件創建和控制文件更新
重要警示:不完全恢復后務必用
RESETLOGS
方式打開數據庫,此時會重置日志序列(可通過SELECT * FROM v$log
驗證)。此操作不可逆,需立即執行全量備份!