之前在Blog中對RMAN 的備份和恢復做了說明,剛看了下,在恢復這塊還有知識點遺漏了。 而且恢復這塊很重要,如果DB 真要出了什么問題,就要掌握對應(yīng)的恢復方法。 所以把DB的恢復這塊單獨拿出來說明一下。
RMAN 備份與恢復 實例
如何搭建一個數(shù)據(jù)庫服務(wù)器平臺
如何 搭建 RMAN 備份平臺
在非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個冗余,很少會發(fā)生全部丟失的情況,當遇到控制文件所有都丟失,恢復需要以下步驟:
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; (保證數(shù)據(jù)一致,因為控制文件里scn發(fā)生改變)
RMAN>alter database open resetlogs;
resetlogs命令表示一個數(shù)據(jù)庫邏輯生存期的結(jié)束和另一個數(shù)據(jù)庫邏輯生存期的開始,每次使用resetlogs命令的時候,SCN不會被重置,不過oracle會重置日志序列號,而且會重置聯(lián)機重做日志內(nèi)容. 這樣做是為了防止不完全恢復后日志序列會發(fā)生沖突(因為現(xiàn)有日志和數(shù)據(jù)文件間有了時間差)。
3. Redo Log File損壞
重做日志文件在數(shù)據(jù)庫中是要求最高的組件,首先其對磁盤的IO要求極高,其次一旦CURRENT組發(fā)生故障,數(shù)據(jù)庫會立即崩潰,并且100%會發(fā)生數(shù)據(jù)丟失,所以O(shè)RACLE建議至少每個組需要兩個成員,并且在數(shù)據(jù)庫運行過程中日志文件會一直被鎖定,以防不測。
Redo log的恢復分為兩種:CURRENT 和 非CURRENT
3.1 CURRENT 情況
造成redo 損壞,很多情況是與突然斷電有關(guān)。這種情況下是比較麻煩的。
(1)如果有歸檔和備份,可以用不完全恢復。
SQL>startup mount;
SQL>recover database until cancel; 先選擇auto,盡量恢復可以利用的歸檔日志,然后重新執(zhí)行:
SQL>recover database until cancel; 這次輸入cancel,完成不完全恢復,
用resetlogs打開數(shù)據(jù):
SQL>alter database open resetlogs; 打開數(shù)據(jù)庫
(2)強制恢復, 這種方法可能會導致數(shù)據(jù)不一致
sql>startup mount;
sql>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
sql>recover database until cancel;
sql>alter database open resetlogs;
運氣好的話,數(shù)據(jù)庫能正常打開,但是由于使用_allow_resetlogs_corruption方式打開,會造成數(shù)據(jù)的丟失,且數(shù)據(jù)庫的狀態(tài)不一致。因此,這種情況下Oracle建議通過EXP方式導出數(shù)據(jù)庫。重建新數(shù)據(jù)庫后,再導入。
redo 的損壞,一般還容易伴隨以下2種錯誤:ORA-600[2662](SCN有關(guān))和 ORA-600[4000](回滾段有關(guān))。
metalink上的兩篇文章介紹了兩種情況的處理方法:
TECH: Summary For Forcing The Database Open With `_ALLOW_RESETLOGS_CORRUPTION` with Automatic Undo Management [ID 283945.1]
ORA-600 [2662] Block SCN is ahead of Current SCN [ID 28929.1]
這兩種情況下的恢復有點復雜,回頭單獨做個測試,在補充進來。
3.2 非CURRENT 情況
這種情況下的恢復比較簡單,因為redo log 是已經(jīng)完成歸檔或者正在歸檔。 沒有正在使用??梢酝ㄟ^v$log 查看redo log 的狀態(tài)。
(1)如果STATUS是INACTIVE,則表示已經(jīng)完成了歸檔,直接清除掉這個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. 非系統(tǒng)表空間損壞
若出現(xiàn)介質(zhì)故障導致某表空間不可用,恢復可以在數(shù)據(jù)庫處于 open 或 mount 狀態(tài)下進行,步驟如下:
1. 將該表空間置于offline狀態(tài)
2. 修復表空間數(shù)據(jù)
3. 恢復表空間并處于一致性
4. 將表空間online
rman> sql 'alter tablespace dave offline';
如果文件不存在,就加immediate參數(shù)
rman> sql 'alter tablespace dave offline immediate';
rman>restore tablespace dave;
rman>recovery tablespace dave;
rman>sql 'alter tablespace dave online';
5. 數(shù)據(jù)文件損壞
如果出現(xiàn)介質(zhì)故障導致某表空間數(shù)據(jù)文件丟失(這種情況也可以參照表空間損壞的恢復)。
恢復可以在 數(shù)據(jù)庫處于 open 或 mount 狀態(tài)下進行,只需4個步驟
1. 將該數(shù)據(jù)文件置于 offline 狀態(tài)
2. 修復數(shù)據(jù)文件(指定數(shù)據(jù)文件編號)
3. 恢復數(shù)據(jù)文件
4. 將數(shù)據(jù)文件 online
rman> sql 'alter datafile 8 offline ';
rman>restore datafile 8;
rman>recovery datafile 8;
rman>sql 'alter datafile 8 online';
6. 基于時間點/SCN/日志序列的不完全恢復
基于時間點/SCN/日志序列的不完全恢復,可以將數(shù)據(jù)庫、表空間、數(shù)據(jù)文件等恢復至恢復備份集保存時間中的任何一個時間點/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> //數(shù)據(jù)文件,控制文件全部刪除
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丟失,數(shù)據(jù)庫在缺省的方式下,是不容許進行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;
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/tianlesoftware/archive/2010/12/30/6106178.aspx
|
|