RMAN 還原與恢復
--====================
-- RMAN 還原與恢復
--====================
在Oracle中,三大檔案即控制檔案,資料檔案,日誌檔案的丟失與破壞都將需要使用還原或恢復來使資料庫正常化。而RMAN還原與恢復
是實現資料庫完整性、可靠性必不可少的手段之一。還原簡言之即是將所需的檔案從備份中複製到原來檔案所在的路徑。還原通常可以包括
資料庫、表空間、資料檔案級別的還原。通常還原後的內容會滯後於最新的資料庫SCN,因此將歸檔日誌、聯機重做日誌檔案中的內容更新到
還原的資料檔案中,這個過程稱之為恢復。
恢復的幾種情形
1.在mount 或open 階段完成的災難恢復
非系統表空間,undo
2.在nomount 階段完成的災難恢復
控制檔案(controlfile)
3.在mount 階段完成的災難恢復
系統表空間,聯機重做日誌檔案
有關恢復、介質恢復、一致性或非一致性恢復的詳細概念請參考:
一、RMAN在歸檔模式下的還原與恢復的簡化例子
RMAN> connect target /
RMAN> startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
二、使用RMAN進行還原與恢復(非catalog方式)
1.資料檔案丟失的恢復處理
--設定客戶端環境變數並連線到資料庫
C:/>set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
C:/>rman target sys/[email protected] nocatalog
--對資料庫做全備
RMAN> backup as backupset
2> format'/u01/bk/rmbk/wb_%U'
3> tag=Whole_bak database;
RMAN> sql'alter system archive log current';
--對資料庫做0級增量備份
RMAN> run{
2> allocate channel ch1 type
3> backup incremental level 0 database
4> format '/u01/bk/rmbk/Inc_0_%U'
5> tag=Inc_0;
6> release channel ch1;}
--對錶插入新記錄並切換日誌
SQL> select * from tb2;
ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry
SQL> insert into tb2 select 3,'Danny' from dual;
SQL> commit;
SQL> alter system checkpoint;
SQL> alter system switch logfile;
--對資料庫做1級增量備份
RMAN> run{
2>allocate channel ch1 type disk;
3>backup incremental level 1 database
4>format '/u01/bk/rmbk/Inc_1%U'
5>tag=Inc_1;
6>release channel ch1;}
SQL> shutdown immediate;--關閉資料庫
SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf--刪除所有的資料檔案 */
SQL> startup mount
--使用RMAN連線到未mount狀態的資料庫
RMAN> connect target sys/[email protected]
connected to target database: ORCL (DBID=1257415066, not open)
--執行資料庫還原
--注意當存在完整備份也同時存在0級增量備份時,Oracle會自動使用0級增量備份來還原資料庫
RMAN> restore database;
piece handle=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0--下面可以看出還原的資料來自0級增量備份
--執行資料庫恢復
RMAN> recover database;
piece handle=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1
--開啟資料庫驗證恢復
RMAN> alter database open;
SQL> select * from bk.tb2;
ID NAME
---------- ---------------------------------------------
1 Robinson
2 Henry
3 Danny
2.磁碟損壞導致資料檔案無法恢復到原始位置或不想恢復到原始位置的處理
使用set newname 命令將資料檔案還原到新路徑
set newname for datafile 1 to '<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/[email protected]
connected to target database: ORCL (DBID=1257415066, not open)
RMAN> run{
2> set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf';
3> restore database;
4> switch datafile all;
5> recover database;
6> alter database open;}
SQL> select file#,name,status from v$datafile where file#=6;
FILE# NAMESTATUS
---------- -------------------------------------------------- -------
6 /u01/app/oracle/oradata/tbs01.dbfONLINE
SQL> select count(1) from bk.tb2;--表tb2位於tbs01.dbf內
COUNT(1)
----------
3
3.恢復表空間
--刪除表空間內的資料檔案,刪除後在針對位於該表空間的表進行插入記錄以及實施檢查點程序
SQL> ho rm $ORACLE_BASE/oradata/tbs01.dbf
SQL> insert into bk.tb2 select 4,'Jackson' from dual;
SQL> commit;
SQL> alter system checkpoint;
--強制檢查點後,告警日誌出現錯誤提示,檢視v$recover_file給出了故障資料檔案
[[email protected] ~]$ tail -n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4724.trc:
ORA-01110: data file 6: '/u01/app/oracle/oradata/tbs01.dbf'
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/tbs01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
SQL> select * from v$recover_file;
FILE# ONLINEONLINE_ ERRORCHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
6 OFFLINE OFFLINE FILE NOT FOUND0
SQL> select name,status from v$datafile where file#=6;
NAMESTATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/tbs01.dbfRECOVER
--使用RMAN命令恢復資料檔案,此時資料庫處於OPEN狀態,因此首先需要將表空間離線,恢復完成之後再將其聯機
RMAN> run{
2> sql 'alter tablespace tbs1 offline immediate';
3> set newname for datafile 6 to '/u01/app/oracle/oradata/orcl/tbs01.dbf';
4> restore tablespace tbs1;
5> switch datafile all;
6> recover tablespace tbs1;
7> sql 'alter tablespace tbs1 online';}
SQL> select name,status from v$datafile where file#=6;--位置變動到orcl子目錄下,狀態變為online
NAMESTATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs01.dbfONLINE
--也可以使用下面的命令完成同樣的功能
--注意表空間內有多個數據檔案的情形,而僅有單個數據檔案損壞則採用下面的方式處理更為妥當
RMAN> run{
2> sql 'alter database datafile 6 offline immediate';
3> set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf';
4> restore datafile 6;
5> switch datafile all;
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基於until time的例子
SQL> show user;
USER is "BK"
SQL> create table tb1(id int,name varchar2(10));
SQL> insert into tb1 select 1,'Lancy' from dual;
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> alter system switch logfile;
SQL> ho ls $ORACLE_BASE/oradata/arch
log_1_1_732989230.arclog_1_1_732989889.arc
RMAN> run{
2> allocate channel ch1 type disk;
3> allocate channel ch2 type disk;
4> backup as compressed backupset database plus archivelog delete input
5> format '/u01/bk/rmbk/wh_lg_%U'
6> tag='Wholebak_Pluslog';
7> release channel ch1;
8> release channel ch2;}
18:10:36 SQL> drop table tb1;
RMAN> run{
2> allocate channel ch1 type disk;
3> allocate channel ch2 type disk;
4> set until time "to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')";
5> restore database;
6> recover database;
7> alter database open resetlogs;
8> release channel ch1;
9> release channel ch2;}
SQL> select * from tb1;
ID NAME
---------- ----------
1 Lancy
5. SPFILE檔案丟失的恢復
SPFILE引數檔案可以在RMAN中進行備份,因此可以使用RMAN來恢復SPFILE檔案。可以自動備份SPFILE。
SPFILE的自動備份是隨著控制檔案的備份一起被完成的,因此可以通過自動備份控制檔案來實現自動備份SPFILE檔案的目的
其次,在備份系統表空間時將引發控制檔案的自動備份,而不論是否設定自動備份引數為ON,此時同樣也備份SPFILE檔案
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 autobackup on;
RMAN> configure controlfile autobackup format for device type disk to '/u01/bk/rmbk/auto_ctl_%d_%F';
RMAN> exit
[email protected]> alter tablespace users add datafile '$ORACLE_BASE/oradata/orcl/users02.dbf'