Oracle11g:數據庫恢復總結

一、參數文件

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";

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章