1. 執行個體恢複
在執行個體重新啟動時,系統自動回復。
判斷依據:資料檔案的scn與控制檔案不一致。
步驟:
(1)使用online redo log,資料前滾到與控制檔案一致的SCN處。
(2)使用undo資料表空間,對未提交事務執行復原操作。
結果:資料庫中資料保留到執行個體異常前最後一次提交的內容。
2. 使用者錯誤恢複
使用者錯誤包括:使用者資料錯誤修改,資料表誤刪等
恢複技術:閃回查詢(Flashback Query)
Flashback Drop和資料表空間資源回收筒(Tablespace's recycle bin)
閃回表(Flashback Table)
LogMiner
2.1 閃回查詢
前提:undo資料表空間足夠容納使用者在一段時期內修改的資料
undo資料表空間保留曆史修改資料的時限(UNDO_RETETION初始變數)
查詢表employees在15分鐘前的資料:
SELECT employee_id, last_name, email FROM hr.employees
AS OF TIMESTAMP(systimestamp - interval '15' minute)
WHERE employee_id = 101;
查詢表employees在指定曆史時間的資料:
SELECT employee_id, last_name, email FROM hr.employees
AS OF TIMESTAMP(
to_timestamp('01-Sep-04 16:18:57.84', 'DD-Mon-RR HH24:MI:SS.FF'))
WHERE employee_id = 101;
2.2 Flashback Drop和資料表空間資源回收筒
每個Oracle資料表空間中存在一個Recycle bin,使用者存放刪除的表和表相關內容(索引等)
刪除的表所佔用的空間並不立即回收,但在視圖DBA_FREE_SPACE中可看到。
# 恢複已刪除的資料表到刪除前狀態(包括表中資料):
SQL> FLASHBACK TABLE order_items TO BEFORE DROP;
# 恢複已刪除的資料表並改名:
SQL> FLASHBACK TABLE order_items TO BEFORE DROP RENAME TO order_items_old;
如果同一個表被刪除恢複多次,如果需要恢複到以前的版本,則可以查詢檢視RECYCLEBIN
或者使用命令SHOW RECYCLEBIN,並使用其中的表名稱。
使用限制:
僅能用於非系統本地管理的資料表空間。
位元影像聯合索引、參照完整性條件約束、物化視圖刪除後無法儲存在Recyclebin.
使用Drop Index刪除索引,刪除的索引不會儲存(只有刪除表,縣官索引才儲存)。
2.3 Flashback表
允許將一個或多個表恢複到曆史指定時間的狀態。無需使用太耗時的操作。
Flashback Table使用對相關事務的Undo操作恢複表,使用undo資料表空間。
(Flashback Drop直接回收恢複表佔用的空間)
需要啟用行遷移(row movement)功能。undo操作可能會改變記錄的rowid.
#啟用Row Movement
SQL> ALTER TABLE hr.employees ENABLE ROW MOVEMENT;
#使用Flashback Table恢複表到指定時間
SQL> FLASHBACK TABLE hr.employees [, ...]
TO TIMESTAMP systimestamp - interval '15' minute;
2.4 LogMiner
從Redo Log中提取所有的DDL和DML活動的語句。
使用V$LOGMNR_CONTENTS視圖查看(首先需要執行DBMS_LOGMNR.START_LOGMNR()過程)
LogMiner工具本身不能用於恢複資料庫
僅從RedoLog中提取用於恢複資料庫的SQL語句。
3. 控制檔案恢複
如果有控制檔案發生錯誤,Oracle執行個體將停止運行。
如果沒有停止,則必須手動執行:SHUTDOWN ABORT
將未損壞的控制檔案複製一份到目標地址,並修改初始化參數中出問題的
控制檔案的路徑到新的控制檔案
或者在初始化參數中把有問題的控制檔案條目刪除。
控制檔案錯誤時,修改初始化參數參數,需要在NOMOUNT狀態下。
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP NOMOUNT;
SQL> SHOW PARAMETER CONTROL_FILES;
或
SQL> SELECT name, value FROM v$spparameters
WHERE name = 'control_files';
SQL> ALTER SYSTEM SET CONTROL_FILES='...','...','...' SCOPE=SPFILE;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
4. 重做日誌恢複
只要有一組中還有一個Redo Log檔案還有可用,Oracle執行個體就不會崩潰。
(即一個redo log組中所有redo log檔案全部失效,Oracle樣本就會崩潰)
使用V$LOGFILE視圖查詢當前redo log檔案的狀態。
如果一個redo log組中存在錯誤的redo log檔案,那麼按以下步驟恢複:
# 確認哪個檔案出現錯誤(在哪個組中)
SQL> SELECT * FROM v$logfile ORDER BY group#;
# 對該組redo log執行歸檔操作
SQL> ALTER SYSTEM ARCHIVE LOG GROUP <group_number>;
# 清空有問題的redo log組並重建
SQL> ALTER DATABASE CLEAR LOGFILE GROUP <group_number>;
5. 系統關鍵資料檔案恢複
包括SYSTEM資料表空間和UNDO資料表空間。
5.1 NOARCHIVELOG 模式下
只能依賴於是否對資料庫有全備份,如果有,則只能恢複到全備份時。
5.2 ARCHIVELOG 模式下
SQL> SHUTDOWN ABORT; # 強制停止
SQL> STARTUP MOUNT; # 只能在Mount狀態下恢複
在EM的Perform Recovery中,選擇恢複資料檔案,以及對應的SYSTEM資料表空間資料檔案。
並可指定需要恢複到的目標路徑。系統將會執行RMAN指令碼進行恢複。
SQL> ALTER DATABASE OPEN; # 恢複完畢後開啟資料庫
6. 非系統資料檔案恢複
6.1 NOARCHIVELOG 模式下
只能依賴於是否對資料庫有全備份,如果有,則只能恢複到全備份時。
6.2 ARCHIVELOG 模式下
隻影響到丟失的資料檔案相關的資料庫物件。
同樣可在EM中,按步驟執行Perform Recovery進行恢複。
# 查看資料檔案
SQL> SELECT t.name, d.name FROM v$tablespace t
JOIN v$datafile d USING (ts#)
WHERE t.name = 'USERS';
也可以執行RMAN命令恢複編號為4和7的資料檔案:
$ rman target /
RMAN> run { sql 'alter database datafile 4 offline';
sql 'alter database datafile 7 offline';
restore datafile 4, 7;
recover datafile 4, 7;
sql 'alter database datafile 4 online';
sql 'alter database datafile 7 online'; }