1. 程式人生 > 其它 >RMAN 還原與恢復

RMAN 還原與恢復

在Oracle中,三大檔案即控制檔案,資料檔案,日誌檔案的丟失與破壞都將需要使用還原或恢復來使資料庫正常化。而RMAN還原與恢復

是實現資料庫完整性、可靠性必不可少的手段之一。還原簡言之即是將所需的檔案從備份中複製到原來檔案所在的路徑。還原通常可以包括

資料庫、表空間、資料檔案級別的還原。通常還原後的內容會滯後於最新的資料庫SCN,因此將歸檔日誌、聯機重做日誌檔案中的內容更新到

還原的資料檔案中,這個過程稱之為恢復。

恢復的幾種情形

1.在mount或open階段完成的災難恢復

非系統表空間,undo表空間,所有的資料檔案

2.在nomount階段完成的災難恢復

控制檔案(controlfile)

3.在mount階段完成的災難恢復

系統表空間,聯機重做日誌檔案

有關恢復、介質恢復、一致性或非一致性恢復的詳細概念請參考:

Oracle基於使用者管理恢復的處理

Oracle 基於使用者管理的不完全恢復

一、RMAN在歸檔模式下的還原與恢復的簡化例子

RMAN>connect target/

RMAN>startup mount;

RMAN>restoredatabase;

RMAN>recoverdatabase;

RMAN>alterdatabaseopen;

二、使用RMAN進行還原與恢復(非catalog方式)

1.資料檔案丟失的恢復處理

--設定客戶端環境變數並連線到資料庫

C:/>setNLS_LANG=AMERICAN_AMERICA.AL32UTF8

C:/>rman target sys/redhat@dedicated nocatalog

--對資料庫做全備

RMAN>backupasbackupset

2>format'/u01/bk/rmbk/wb_%U'

3>tag=Whole_bakdatabase;

RMAN>sql'alter system archive log current';

--對資料庫做0級增量備份

RMAN>run{

2>allocate channel ch1typedisk;

3>backupincrementallevel0database

4>format'/u01/bk/rmbk/Inc_0_%U'

5>tag=Inc_0;

6>release channel ch1;}

--對錶插入新記錄並切換日誌

SQL>select*fromtb2;

IDNAME

---------- ---------------------------------------------

1 Robinson

2 Henry

SQL>insertintotb2select3,'Danny'fromdual;

SQL>commit;

SQL>altersystemcheckpoint;

SQL>altersystem switch logfile;

--對資料庫做1級增量備份

RMAN>run{

2>allocate channel ch1typedisk;

3>backupincrementallevel1database

4>format'/u01/bk/rmbk/Inc_1%U'

5>tag=Inc_1;

6>release channel ch1;}

SQL>shutdownimmediate;--關閉資料庫

SQL>ho rm $ORACLE_BASE/oradata/orcl/*.dbf--刪除所有的資料檔案*/

SQL>startup mount

--使用RMAN連線到未mount狀態的資料庫

RMAN>connect target sys/redhat@dedicated

connectedtotargetdatabase:ORCL(DBID=1257415066,notopen)

--執行資料庫還原

--注意當存在完整備份也同時存在0級增量備份時,Oracle會自動使用0級增量備份來還原資料庫

RMAN>restoredatabase;

piece handle=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0--下面可以看出還原的資料來自0級增量備份

--執行資料庫恢復

RMAN>recoverdatabase;

piece handle=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1

--開啟資料庫驗證恢復

RMAN>alterdatabaseopen;

SQL>select*frombk.tb2;

IDNAME

---------- ---------------------------------------------

1 Robinson

2 Henry

3 Danny

2.磁碟損壞導致資料檔案無法恢復到原始位置或不想恢復到原始位置的處理

使用setnewname命令將資料檔案還原到新路徑

setnewnamefordatafile 1to'<newdir>/system01.dbf';--為恢復的資料檔案指定新路徑或重新命名

使用switch命令將變更更新到控制檔案

switch datafile n|all;--等同於alter database rename file命令,該命令將恢復的資料檔案重新命名更新到控制檔案

--下面的示例首先刪除tbs01.dbf,接下來將其恢復到oradata目錄中

SQL>ho rm $ORACLE_BASE/oradata/orcl/tbs01.dbf

SQL>startup mount force;

RMAN>connect target sys/redhat@dedicated

connectedtotargetdatabase:ORCL(DBID=1257415066,notopen)

RMAN>run{

2>setnewnamefordatafile 6to'/u01/app/oracle/oradata/tbs01.dbf';

3>restoredatabase;

4>switch datafileall;

5>recoverdatabase;

6>alterdatabaseopen;}

SQL>selectfile#,name,statusfromv$datafilewherefile#=6;

FILE#NAMESTATUS

---------- -------------------------------------------------- -------

6/u01/app/oracle/oradata/tbs01.dbfONLINE

SQL>selectcount(1)frombk.tb2;--表tb2位於tbs01.dbf內

COUNT(1)

----------

3

3.恢復表空間

--刪除表空間內的資料檔案,刪除後在針對位於該表空間的表進行插入記錄以及實施檢查點程序

SQL>ho rm $ORACLE_BASE/oradata/tbs01.dbf

SQL>insertintobk.tb2select4,'Jackson'fromdual;

SQL>commit;

SQL>altersystemcheckpoint;

--強制檢查點後,告警日誌出現錯誤提示,檢視v$recover_file給出了故障資料檔案

[oracle@oradb ~]$ tail-n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log

Errorsinfile/u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4724.trc:

ORA-01110:datafile6:'/u01/app/oracle/oradata/tbs01.dbf'

ORA-01116:errorinopeningdatabasefile6

ORA-01110:datafile6:'/u01/app/oracle/oradata/tbs01.dbf'

ORA-27041:unabletoopenfile

Linux Error:2:Nosuchfileordirectory

SQL>select*fromv$recover_file;

FILE# ONLINEONLINE_ ERRORCHANGE#TIME

---------- ------- ------- ------------------ ---------- ---------

6 OFFLINE OFFLINEFILENOTFOUND0

SQL>selectname,statusfromv$datafilewherefile#=6;

NAMESTATUS

-------------------------------------------------- -------

/u01/app/oracle/oradata/tbs01.dbfRECOVER

--使用RMAN命令恢復資料檔案,此時資料庫處於OPEN狀態,因此首先需要將表空間離線,恢復完成之後再將其聯機

RMAN>run{

2>sql'alter tablespace tbs1 offline immediate';

3>setnewnamefordatafile 6to'/u01/app/oracle/oradata/orcl/tbs01.dbf';

4>restoretablespace tbs1;

5>switch datafileall;

6>recover tablespace tbs1;

7>sql'alter tablespace tbs1 online';}

SQL>selectname,statusfromv$datafilewherefile#=6;--位置變動到orcl子目錄下,狀態變為online

NAMESTATUS

-------------------------------------------------- -------

/u01/app/oracle/oradata/orcl/tbs01.dbfONLINE

--也可以使用下面的命令完成同樣的功能

--注意表空間內有多個數據檔案的情形,而僅有單個數據檔案損壞則採用下面的方式處理更為妥當

RMAN>run{

2>sql'alter database datafile 6 offline immediate';

3>setnewnamefordatafile 6to'/u01/app/oracle/oradata/tbs01.dbf';

4>restoredatafile 6;

5>switch datafileall;

6>recover datafile 6;

7>sql'alter databaes datafile 6 online';}

4.RMAN實現不完全恢復

對於RMAN的不完全恢復,使用Oracle的閃回特性的處理有更多的優勢。關於閃回請參考:Oracle閃回特性

步驟

a.載入資料到mount狀態(建議恢復前先做備份)

b.為高併發分配多個通道

c.還原所有(所需)的資料檔案

d.使用until time,until sequence,until scn來恢復資料庫

e.使用resetlogs開啟資料庫

f.全備資料庫

演示RMAN基於untiltime的例子

SQL>showuser;

USERis"BK"

SQL>createtabletb1(idint,namevarchar2(10));

SQL>insertintotb1select1,'Lancy'fromdual;

SQL>ho strings $ORACLE_BASE/oradata/orcl/redo02.log|grep Lancy--檢視聯機日誌檔案中不存在剛剛插入的記錄

SQL>commit;--注意commit是將日誌緩衝內容寫入到日誌檔案

SQL>ho strings $ORACLE_BASE/oradata/orcl/redo02.log|grep Lancy--提交後聯機日誌檔案中才有新增的記錄

Lancy

SQL>altersystem switch logfile;

SQL>ho ls $ORACLE_BASE/oradata/arch

log_1_1_732989230.arclog_1_1_732989889.arc

RMAN>run{

2>allocate channel ch1typedisk;

3>allocate channel ch2typedisk;

4>backupascompressed backupsetdatabaseplus archivelogdeleteinput

5>format'/u01/bk/rmbk/wh_lg_%U'

6>tag='Wholebak_Pluslog';

7>release channel ch1;

8>release channel ch2;}

18:10:36 SQL>droptabletb1;

RMAN>run{

2>allocate channel ch1typedisk;

3>allocate channel ch2typedisk;

4>setuntiltime"to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')";

5>restoredatabase;

6>recoverdatabase;

7>alterdatabaseopenresetlogs;

8>release channel ch1;

9>release channel ch2;}

SQL>select*fromtb1;

IDNAME

---------- ----------

1 Lancy

5. SPFILE檔案丟失的恢復

SPFILE引數檔案可以在RMAN中進行備份,因此可以使用RMAN來恢復SPFILE檔案。可以自動備份SPFILE。

SPFILE的自動備份是隨著控制檔案的備份一起被完成的,因此可以通過自動備份控制檔案來實現自動備份SPFILE檔案的目的

其次,在備份系統表空間時將引發控制檔案的自動備份,而不論是否設定自動備份引數為ON,此時同樣也備份SPFILE檔案

有關SPFILE檔案請參考:Oracle引數檔案

SPFILE錯誤導致資料庫無法啟動(ORA-01565)

SPFILE檔案恢復步驟

a. startup nomount [force];

b. set dbid=dbid_no;

c. restore spfile from autobackup | '<dir>'

d. startup force;如果d執行失敗則轉到e,f,否則不用執行e,f。

e. set dbid=dbid_no;

f. startup;

下面設定控制檔案的自動備份以及設定其備份路徑(注意要預先知道目標資料庫的DBID,此次演示的DBID為1263182651)

RMAN>configure controlfile autobackupon;

RMAN>configure controlfile autobackup formatfordevicetypediskto'/u01/bk/rmbk/auto_ctl_%d_%F';

RMAN>exit

sys@ORCL>altertablespace usersadddatafile'$ORACLE_BASE/oradata/orcl/users02.dbf'size5m;

[oracle@oradb rmbk]$ lsauto*--執行上一條alter tablespace users add datafile語句將引發控制檔案的自動備份

auto_ctl_ORCL_c-1263182651-20101124-00

sys@ORCL>shutdownimmediate;

[oracle@oradb dbs]$ mv spfileorcl.ora spfileorcl.ora.bak--將原來的spfile檔案重新命名

[oracle@oradb ~]$ rman target/nocatalog

RMAN>startup nomount force;

RMAN>setdbid=1263182651;

RMAN>restorespfilefromautobackup;--此處並沒有找到檔案路徑,按Oracle聯機文件,在nomount狀態應該可以找到

RMAN-06172:noautobackup foundorspecified handleisnota valid copyorpiece

RMAN>restorespfilefrom'/u01/bk/rmbk/auto_ctl_ORCL_c-1263182651-20101124-00';--手動指定路徑

RMAN>startup force;

6.聯機重做日誌檔案丟失的恢復請參考:

基於catalog的RMAN備份與恢復

7.控制檔案的恢復處理

控制檔案中描述了資料庫的相關物理資訊,如建立時間、DBID、資料檔案、日誌檔案等相關資訊,因此一旦控制檔案丟失資料庫將

不能啟動,鑑於其重要性,控制檔案的備份與恢復將單獨列出。有關控制檔案請參考下列

Oracle控制檔案的備份與恢復