一、參數文件
1、操作系統文件複製
如果使用操作系統命令複製過參數文件,還原只要複製回去就行。
2、備份集恢復
rman恢復需要啓動實例,SQL*PLUS在沒有參數文件的情況下不能打開,但是rman可以在沒有參數文件的情況下,通過內置的參數打開。
RMAN> startup nomount;
手動備份恢復
RMAN> restore spfile from '/xxx/xxx/xxxx/xxxx';
如果使用了快速恢復區,自動備份,可以使用以下命令
RMAN> restore spfile from autobackup db_name=orcl db_recovery_file_dest='/xxx/xxxx/';
如果沒有使用快速恢復區,控制文件保存在dbs目錄下。可以通過指定DBID
RMAN> set dbid 1112231231231;
RMAN> restore spfile from autobackup;
啓動實例
SQL> startup force;
3、實例沒有關閉的情況下恢復
先從自動備份中獲取spfile到臨時目錄,然後通過操作系統命令進行替換。
RMAN> restore spfile to '/home/oracle/spfileorcl.ora' from autobackup;
$ cp /home/oracle/spfileorcl.ora $ORACLE_HOME/dbs
二、控制文件
數據庫訪問控制文件,讀取參數文件中配置的第一個控制文件,寫所有的控制文件。所以,第一個控制文件出問題,讀寫操作都會出問題。其他控制文件出問題,只有寫操作纔會出錯。
數據庫啓動時候,控制文件損壞,會報ORA-00205(識別控制文件有誤)或者ORA-00227(控制文件存在壞塊)。
實例open,控制文件損壞,但是不能保證所有功能正常。直到CKPT發起檢查點的時候,實例最終被強制關閉。遇到這種情況,立刻提交所有操作commit,然後等實例自動關閉或者shutdown abort。
建議開啓自動備份,在數據庫物理結構發生變化的時候都會自動備份。
RMAN> configure controlfile autobackup on;
控制文件恢復的時候,雖然可以通過start nomount命令啓動,但是建議以startup命令,使數據庫產生更多有價值的信息。
1、在線副本
控制文件存在多個副本,存在沒有損壞的副本。首先對所有的文件通過操作系統文件複製保持。
將損壞的文件替換成完好的文件,啓動數據庫。
2、結構備份,數據庫結構相同,但是檢查點和SCN等信息比較舊,這裏就是開啓了控制文件自動備份。
數據庫到nomount狀態
RMAN> resotre controlfile from autobackup;
RMNA> mount database;
RMAN> recover database;
RMAN> alter database open resetlogs;
3、歷史備份,所有的信息都不一致
(1)備份了控制文件後,創建了添加了表空間,添加日誌組,刪除日誌組。
這種recover可以自動修復。
RMAN> resotre controlfile from '/xxx/xxx';
RMAN> mount database;
RMAN> recover database;
RMAN> alter database open resetlogs;
(2)備份控制文件後,刪除表空間
RMAN> resotre controlfile from '/xxx/xxx';
RMAN> mount database;
SQL> alter database datafile 6 offline; #將刪除表空間的文件都下線
SQL> recover database using backup controlfile; #輸入AUTO
可能再次報錯,提示沒有歸檔日誌,其實是某個還沒來得及歸檔的在線日誌,通過查詢可以得知是某個在線日誌。再次執行命令
SQL> recover database using backup controlfile; #輸入查詢出來的在線日誌路徑
或者使用跳過表空間的方式
RMAN> recover database skip tablespace examples;
RMAN> alter database open resetlogs;
4、缺失歸檔日誌
確認問題只和控制文件相關,如果數據文件損壞就需要不完全恢復。
恢復控制文件,加載到mount狀態後
RMAN> recover database;
報錯,顯示找不到歸檔。
SQL> alter database backup controlfile to trace;
SQL> select value from v$diag_info where name='Default Trace File';
SQL> startup force nomount;
在追蹤文件中找到NORESETLOGS的創建語句,並執行後,數據庫已經到mount狀態。
RMAN> recover database;
再次報錯,提示找不到歸檔日誌,但是此時的歸檔日誌和上面不一樣,這是因爲恢復只查找歸檔日誌,無視了在線日誌。
SQL> recover database using backup contrilfile; #輸入在線日誌路徑
SQL> alter database open resetlogs;
SQL> alter tablespace temp add tempfile '/xxx/xxx/xxx/xx.dbf' reuse;
三、數據文件
1、關鍵數據文件損壞(system表空間和撤銷表空間),一定是在mount狀態下恢復。
如果實例沒有崩潰使,則先關閉
SQL> shutdown abort;
關鍵數據文件損壞可能登陸不了數據庫,需要手動關閉進程。
kill -9 `ps aux |grep ora_smon_orcl |grep -v grep | wak '{pring $2}'`
恢復system數據文件
run{
startup mount;
restore datafile 1;
recover database;
alter database open;
}
2、普通數據文件損壞,可以在open狀態下恢復
除了system表空間、undo_tablespace表空間、臨時表空間和只讀表空間,屬於普通數據文件,損壞後最多導致用戶數據不可訪問,不會導致數據庫異常。
啓動時候發現普通數據文件不存在或者頭部損壞,可以先讓該文件下線,數據庫能正常啓動。
SQL> alter database datafile 5 offline;
SQL> alter database open;
如果數據庫運行的時數據庫文件頭損壞,發生檢查點的時候會強制將這個文件下線,此時重啓能正常重啓。
(1)如果數據文件沒有強制下線
可以關閉實例進行恢復
run{
shutdown abort;
startup mount;
restore datafile ''/xxx/xxxx/dd.dbf;
recover database;
alter database open;
}
也可以在實例啓動的時候進行恢復
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online'
}
如果實例已經關閉,提高數據庫可用性的情況下,先啓動數據庫實例
run{
startup mount;
sql 'alter database datafile 5 offline';
alter database open;
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online';
}
(2)數據文件被強制下線
數據文件的頭部損壞後,檢查點要強制將文件下線,恢復這個文件的時候會報錯。
採用啓動實例到mount,然後使數據文件在線,然後恢復的方式。
run{
shutdown abort;
startup mount;
sql 'alter database datafile 5 online';
resotre datafile 5;
recover database;
alter database open;
}
(推薦)刪除數據文件,在數據庫open的狀態下恢復。
rm -rf /eee/ddd/xxx.dbf
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online';
}
3、只讀數據文件
只讀文件損壞後,檢查點不會對只讀文件進行操作,實例不會崩潰,也不會強制下線。
和普通文件恢復的區別:只讀狀態不變的情況下,不需要recover,在修改只讀狀態的情況下,可能需要兩次recover。
在只讀表空間備份了控制和數據文件,後來改爲讀寫,數據文件和控制文件損壞了,沒有最新的備份。重啓數據庫到nomount狀態
從備份中還原控制文件,這時候控制文件記錄的表空間爲只讀。
啓動到mount,還原數據文件。
第一次recover database恢復了控制文件,但是此時表空間記錄爲只讀,所以忽略了。
第二次recover database通過最新的控制文件恢復表空間。
四、不完全數據庫恢復
歸檔或者active的在線日誌、current的在線日誌丟失或者損壞。
認爲操作錯誤想要回退到某個時間點。
恢復到指定的日誌
run{
startu force mount;
set until sequence 100;
restore database;
recover database;
alter database open resetlogs;
}
到指定時間
set until time "sysdate-interval '10' minute";