Oracle 不同故障的恢復方案

lygle發表於2013-04-06

在非Catalog模式下, 備份的資訊儲存在controlfile中。 所以在RMAN 備份的時候,別忘了備份控制檔案。

1. SPFILE丟失

startup nomount;

set dbid 3988862108;

restore spfile from autobackup;

或者通過某個檔案

restore spfile from 'path/file_name'

shutdown immediate;

set dbid 3988862108;

startup;

2. Controlfile全部丟失

控制檔案做了3個冗餘,很少會發生全部丟失的情況,當遇到控制檔案所有都丟失,恢復需要以下步驟:

RMAN>set dbid 3988862108;

RMAN>startup nomount;

RMAN>restore controlfile from autobackup;

或者從檔案恢復

RMAN>restore controlfile from 'file_name';

RMAN>alter database mount;

RMAN>recover database; (保證資料一致,因為控制檔案裡scn發生改變)

RMAN>alter database open resetlogs;

resetlogs命令表示一個資料庫邏輯生存期的結束和另一個資料庫邏輯生存期的開始,每次使用resetlogs命令的時候,SCN不會被重置,不過oracle會重置日誌序列號,而且會重置聯機重做日誌內容. 這樣做是為了防止不完全恢復後日志序列會發生衝突(因為現有日誌和資料檔案間有了時間差)。

3. Redo Log File損壞

重做日誌檔案在資料庫中是要求最高的元件,首先其對磁碟的IO要求極高,其次一旦CURRENT組發生故障,資料庫會立即崩潰,並且100%會發生資料丟失,所以ORACLE建議至少每個組需要兩個成員,並且在資料庫執行過程中日誌檔案會一直被鎖定,以防不測。

Redo log的恢復分為兩種:CURRENT CURRENT

3.1 CURRENT 情況

造成redo 損壞,很多情況是與突然斷電有關。這種情況下是比較麻煩的。

1)如果有歸檔和備份,可以用不完全恢復。

SQL>startup mount;

SQL>recover database until cancel; 先選擇auto,儘量恢復可以利用的歸檔日誌,然後重新執行:

SQL>recover database until cancel; 這次輸入cancel,完成不完全恢復,

resetlogs開啟資料:

SQL>alter database open resetlogs 開啟資料庫

2)強制恢復, 這種方法可能會導致資料不一致

sql>startup mount;

sql>alter system set "_allow_resetlogs_corruption"=true scope=spfile;

sql>recover database until cancel;

sql>alter database open resetlogs;

運氣好的話,資料庫能正常開啟,但是由於使用_allow_resetlogs_corruption方式開啟,會造成資料的丟失,且資料庫的狀態不一致。因此,這種情況下Oracle建議通過EXP方式匯出資料庫。重建新資料庫後,再匯入。

redo 的損壞,一般還容易伴隨以下2種錯誤:ORA-600[2662]SCN有關)和 ORA-600[4000](回滾段有關)。

metalink上的兩篇文章介紹了兩種情況的處理方法:

TECH: Summary For Forcing The Database Open With `_ALLOW_RESETLOGS_CORRUPTION` with Automatic Undo Management [ID 283945.1]

http://space.itpub.net/28673746/viewspace-757850

ORA-600 [2662] Block SCN is ahead of Current SCN [ID 28929.1]

http://space.itpub.net/28673746/viewspace-757414

這兩種情況下的恢復有點複雜,回頭單獨做個測試,在補充進來。

3.2 CURRENT 情況

這種情況下的恢復比較簡單,因為redo log 是已經完成歸檔或者正在歸檔。 沒有正在使用。可以通過v$log 檢視redo log 的狀態。

1)如果STATUSINACTIVE,則表示已經完成了歸檔,直接清除掉這個redo log即可。

SQL>startup mount;

SQL> alter database clear logfile group 3 ;

SQL>alter database open;

2)如果STATUS ACTIVE ,表示正在歸檔, 此時需要使用如下語句:

SQL>startup mount;

SQL> alter database clear unarchived logfile group 3 ;

SQL>alter database open;

4. 非系統表空間損壞

若出現介質故障導致某表空間不可用,恢復可以在資料庫處於 open mount 狀態下進行,步驟如下:

1. 將該表空間置於offline狀態

2. 修復表空間資料

3. 恢復表空間並處於一致性

4. 將表空間online

rman> sql 'alter tablespace dave offline';

如果檔案不存在,就加immediate引數

rman> sql 'alter tablespace dave offline immediate';

rman>restore tablespace dave;

rman>recover tablespace dave;

rman>sql 'alter tablespace dave online';

5. 資料檔案損壞

如果出現介質故障導致某表空間資料檔案丟失(這種情況也可以參照表空間損壞的恢復)。

恢復可以在 資料庫處於 open mount 狀態下進行,只需4個步驟

1. 將該資料檔案置於 offline 狀態

2. 修復資料檔案(指定資料檔案編號)

3. 恢復資料檔案

4. 將資料檔案 online

rman> sql 'alter datafile 8 offline ';

rman>restore datafile 8;

rman>recover datafile 8;

rman>sql 'alter datafile 8 online';

6. 基於時間點/SCN/日誌序列的不完全恢復

基於時間點/SCN/日誌序列的不完全恢復,可以將資料庫、表空間、資料檔案等恢復至恢復備份集儲存時間中的任何一個時間點/SCN/日誌序列,但須謹慎,操作前一定需要做好備份,具備條件的情況下最好先恢復到異機。

6.1 基於時間點

run{

set until time "to_date(12/29/10 23:00:00','mm/dd/yy hh24:mi:ss')";

restore database;

recover database;

alter database open resetlogs;

}

SQL>STARTUP NOMOUNT;

SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SQL> recover database until time '2010-12-29 23:19:00';

SQL>ALTER DATABASE OPEN RESETLOGS;

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

SQL>startup mount;

SQL>restore database until time "to_date('2010-12-29 23:19:00','YYYY-MM-DD HH24:MI:SS')";

SQL>recover database until time "to_date('2010-12-29 23:19:00','YYYY-MM-DD HH24:MI:SS')";

SQL>alter database open resetlogs;

6.2 基於 SCN:

SQL>startup mount;

SQL>restore database until scn 10000;

SQL>recover database until scn 10000;

SQL>alter database open resetlogs;

6.3 基於日誌序列

SQL>startup mount;

SQL>restore database until SEQUENCE 100 thread 1; //100是日誌序列

SQL>recover database until SEQUENCE 100 thread 1;

SQL>alter database open resetlogs;

日誌序列檢視命令:

SQL>select sequence from v$log;

resetlogs就會把sequence 置為1

7. catalog下完全恢復

SQL>startup nomount;

SQL>restore controlfile from autobackup;

SQL>alter database mount;

SQL>restore database;

SQL>recover database;

SQL>alter database open resetlogs;

示例:

oracle ora10g> rm *;

oracle ora10g> ls;

oracle ora10g> //資料檔案,控制檔案全部刪除

oracle ora10g> rman target /; //因為controlfile 丟失,不能夠連線到rman

oracle ora10g> sqlplus /nolog;

oracle ora10g> connect / as sysdba;

oracle ora10g> shutdown abort;

oracle ora10g> rman target /

rman> startup nomount;

rman> restore controlfile from autabackup;

rman> alter database mount;

rman> restore database;

rman> recover database; //online redolog 不存在

SQL>recover database until cancel; //redo log丟失,資料庫在預設的方式下,是不容許進行recover操作的,那麼如何在這種情況下操作呢

SQL>create pfile from spfile;

vi /u01/product/10.20/dbs/initora10g.ora,在這個檔案的最後一行新增

*.allow_resetlogs_corruption='TRUE'; //容許resetlog corruption

SQL>shutdown immediate;

SQL>startup pfile='/u01/product/10.20/dbs/initora10g.ora' mount;

SQL>alter database open resetlogs;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28673746/viewspace-757851/,如需轉載,請註明出處,否則將追究法律責任。

相關文章