(修改,整理)RMAN總結

控制備份片的大小:

1、一次性(通過限制通道,來限制備份片的大小):

run{

allocate channel d1 type disk;

set limit channel d1 kbytes=10000; --10000KB

backup datafile 4 format '/bk/%d_%s_%p.bkp';}            -----如果我的datafile 4的備份有80M,那麼這個備份集有8個備份片

----這裏的backup datafile 4指的的是數據文件的file_id

----如果不指定format的路徑和命名格式,則自動備份到系統的recovery路徑

SQL> select file_name,file_id from dba_data_files;

FILE_NAME                                   FILE_ID
---------------------------------------- ----------
D:\APP\CAIYH\ORADATA\KM\USERS01.DBF               4
D:\APP\CAIYH\ORADATA\KM\UNDOTBS01.DBF             3
D:\APP\CAIYH\ORADATA\KM\SYSAUX01.DBF              2
D:\APP\CAIYH\ORADATA\KM\SYSTEM01.DBF              1
D:\APP\CAIYH\ORADATA\KM\KM01.DBF                  5

SQL>

 

2、設置系統的默認配置:

configure channel device type disk maxpiecesize 1G format '/bk/%d_%I_%s_%p_%T.bkp';

 

控制一個備份集中有多少個數據文件

backup as compressed backupset database format '/bk/%d_%s_%p.bkp' filesperset 3;        ---一個備份集3個數據文件

 

增量備份

2種增量備份策略:

週日:0    週一:2     週二:2     週三:1     週四:2  週五:2      週六:1c      週日:0

元旦:0    每天:4     每週:3     每月:2     每季度:1     

 

backup incremental level 1 datafile 4 format '/bk/%d_%s_%p.bkp';                    ------差異增量

backup incremental level 1 cumulative datafile 4 format '/bk/%d_%s_%p.bkp'      -----累計增量(1c)

*1c不認1,1認1c

 

 

expired(死亡備份)、obsolete(陳舊備份)

expired就是有備份記錄,但是沒有備份的文件了

obsolete是有多個備份,但是不符合保留策略

 

crosscheck backup;

delete noprompt expired backup;

crosschek copy;

delete noprompt expired copy;

crosscheck archivelog all;

delete noprompt expired archivelog all;

 

report obsolete;             ---copy和backup都計算

delete noprompt obsolete;          ---- 刪除陳舊的備份信息和連帶的備份物理文件

 

這裏對obsolete特別提一下:obsolete有兩個含義:①冗餘的 ②過期的

說一下歸檔和obsolete的關係:比如說我每天晚上做全備份,那麼全備份之前的:①歸檔的備份②歸檔    都是obsolete(過期的)  也就是說我delete obsolete會刪掉他們

**因爲歸檔本身並沒有過期不過期之分,它的過期與否是根據數據文件的備份而定的,凡是你的備份可能會用到的歸檔,就不是過期的!

換句話說就是,"你非冗餘最早的數據文件備份之前的歸檔(歸檔的備份集)是過期的"!     <--------記住這句話就行

如果你的備份都是冗餘的,那它就不能算是我上面說的非冗餘最早的備份嘍~!

 

所以說用delete obsolete要小心,因爲她會刪掉你的歸檔

 

設定保留策略

configure retention policy to redundancy 3;

configure retention policy to recovery window of 7 days;

 

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

備份控制文件:

copy current controlfile to '/bk/c1.ctl';

backup current controlfile format '/bk/c1_%d.ctl';

list copy of controlfile;

list backup of controlfile;

可自動備份控制文件

 

備份歸檔日誌文件:

list archivelog all;

list copy of archivelog all;

list backup of archivelog all;

list copy of archivelog seqence between 264 and 265 thread 1;

 

backup archivelog all format '/bk/arc_%d_%T_%U' delete input;

 

備份二進制文件:

list backup of spfile;

backup spfile format '/bk/spfile.%s';

 

catalog恢復目錄的配置:

1、create tablespace rman datafile '....../rman.dbf' size 20M;

2、create user rman identified by rman default tablespace rman;

3、grant recovery_catalog_owner,connect,resource to rman;

4、DOS> rman catalog rman/rman

5、RMAN>create catalog;

6、rman target sys/managerconfig@tt catalog rman/rman

7、RMAN>register database;

 

*進入rman時,如果連接catalog,會將備份信息同時保存在控制文件和catalog中;

                           如果不連接catalog,只會將備份信息保存在控制文件中,等下次連接catalog時,catalog會去讀取控制文件的信息。

 

利用rman恢復換路徑
run
{ sql "alter tablespace users offline";
set newname for datafile 4 to '/bk/users.dbf';
restore datafile 4;
switch datafile 4;
recover datafile '/bk/users.dbf';
sql "alter tablespace users online";
}

 

有rman全備(數據文件,參數文件,控制文件,日誌文件),異地恢復

1、還原參數文件:   export ORACLE_SID=luyang     (這裏名字可以自己起,只要把dbs目錄下恢復的參數文件的後綴也改了就ok了     <---改實例名就這麼改)

      用rman啓動一個傀儡實例(DUMMY)到nomount下恢復參數文件:RMAN>restore spfile from '/rmanbk/LUYANG_1021439988_4_1_20130226.bkp'

      shutdown 假實例

      修改參數文件的一些值:如(a,b,c,u)dump、控制文件的路徑、歸檔路徑等

2、還原控制文件:  SQL>startup nomount

                            SQL>show parameter name     ---看看是不是自己的庫

    啓動rman:RMAN>restore controlfile from '/rmanbk/LUYANG_1021439988_4_1_20130226.bkp' (還原的位置由參數文件裏的路徑決定)

3、還原數據文件、恢復:

    SQL>alter database mount ;

    RMAN>list backup;

    RMAN>crosscheck backup;

    RMAN>delete noprompt expired backup;

    RMAN>catalog start with '/rmanbk/';

 

run{

set newname for datafile 1 to '/u01/oracle/oradata/luyang/system01.dbf';  

set newname for datafile 2 to '/u01/oracle/oradata/luyang/undotbs01.dbf';

set newname for datafile 3 to '/u01/oracle/oradata/luyang/sysaux01.dbf';
set newname for datafile 4 to '/u01/oracle/oradata/luyang/users01.dbf';
set newname for datafile 5 to '/u01/oracle/oradata/luyang/example01.dbf';
restore database;
switch datafile all;  
recover database; 

}                    ------還在找下面的歸檔,不用管它

 

修改日誌文件的指針,使之能建立聯機日誌(因爲要resetlogs)

SQL> alter database rename file '/u01/app/oracle/oradata/luyang/redo03.log' to '/u01/oracle/oradata/luyang/redo03.log';

SQL> alter database rename file '/u01/app/oracle/oradata/luyang/redo02.log' to '/u01/oracle/oradata/luyang/redo02.log';

SQL> alter database rename file '/u01/app/oracle/oradata/luyang/redo01.log' to '/u01/oracle/oradata/luyang/redo01.log';

sql>alter database open resetlogs;

大功告成~!

 

rman 的數據塊完全恢復(rman數據塊不能不完全恢復)

select * from V$DATABASE_BLOCK_CORRUPTION ;

BLOCKRECOVER DATAFILE 12 BLOCK 12;

 

數據文件的恢復(在線恢復):

1、數據文件要再offline或者recover狀態(如果是在線狀態,手動offline)

2、RMAN>restore datafile 4;

3、RMAN>recover datafile 4;

 

控制文件的恢復(rman沒有using backup controlfile):

1、控制文件壞了----數據庫崩潰~!

2、從新啓動數據庫到nomount ,然後進入rman還原控制文件:RMAN>restore controlfile from '/bk/controlfile_TEST.bkp';

3、將數據庫啓動到mount下:SQL>alter database mount;

4、RMAN>recover database;                               ---完全恢復

 

rman的不完全恢復:

1、有rman的全備份

2、drop table t1 purge;

3、日誌挖掘找出SCN

4、停止數據庫,從新啓動到mount

5、進入rman:

RMAN>run{
set until scn 39847;
restore database;                                    ---------rman的restore database是還原所有的數據文件;
recover database;
alter database open resetlogs;          
}

 

rman的數據庫副本(incarnation)管理:

list incarnation of database;       ----列出共有多少個副本

想要理解incarnation,先要弄明白alter database open resetlogs 和 incarnation的關係

舉個例子:

我要進行一次不完全恢復:

1、我有rman的全備份

2、然後我關閉數據庫,從新啓動到mount

3、RMAN> run{  

set until time "to_date('2010-10-16 23:14:42','yyyy-mm-dd hh24:mi:ss')"; 

restore database; 

recover database; 

Starting restore at 17-OCT-10

。。。。

Finished restore at 17-OCT-10

starting media recovery

。。。。

Finished recover at 17-OCT-10

4、alter database open resetlogs;

5、打開庫後,我發現我剛纔恢復的時間23:14:42有點早,我想恢復到23:14:50;

6、於是我再次將數據庫啓動到mount下

7、RMAN> run{  

set until time "to_date('2010-10-16 23:14:50','yyyy-mm-dd hh24:mi:ss')"; 

restore database; 

recover database; 

報錯:RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time

觀察以上這個實驗,想想爲什麼呢?對!因爲你用的還那個控制文件,而你做了resetlogs操作後,控制文件中記錄日誌的sequence號重置了,以前的歸檔和日誌就不認了.

當然如果你有控制文件的備份,可以先恢復控制文件再做不完全恢復。

但是10g以後rman給我們引入了一個新的概念incarnation,我每次resetlogs後incarnation+1,有了它我們就可以更簡單的實現上面的實驗:

list incarnation;

reset database to incarnation 1;

然後再重複6、7就ok了

 

登記備份集:

catalog datafilecopy '/bk/user01.cp';

catalog backuppiece '/bk/TT_3_1_20130817.bkp';  (10g 新特性)

catalog start with '/bk/';

 

 

補充:不完全恢復:

熱備----recover database (using backup control file) until ......;    (文件已經cp完)

rman -----RMAN>run{

set until scn 39847;

restore database;                                  
recover database;}

 

**********************************************************************

附贈一個rman全備份的腳本for AIX:

 

#!/bin/ksh

exportORACLE_BASE=/opt/oracle

exportORACLE_HOME=/opt/oracle/product/10.2.0/db_1

exportORA_CRS_HOME=/opt/oracle/product/10.2.0/crs_1

exportORACLE_SID=orcl1

export PATH=$PATH:$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:$HOME/bin:/usr/ccs/bin:.

exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;

exportCLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;

exportAIXTHREAD_SCOPE=S

exportNLS_LANG=AMERICAN_AMERICA.ZHS16GBK

 

ly=`/bin/date +%y%m%d`

rman target/ log=/oracle/oradata/rman/rman$ly.log <<EOF

run{

crosscheck backup;

crosscheck archivelog all;

delete noprompt expired backup;

delete noprompt expired archivelog all;

delete noprompt obsolete;

 

allocate channel c1 type disk;

allocate channel c2 type disk;

sql 'alter system archive log current';

backup as compressed backupset databaseformat '/oracle/oradata/rman/dbfull_%d_%T_%U.bkp';

sql 'alter system archive log current';

backup as compressed backupset archivelogall format '/oracle/oradata/rman/arc_%d_%T_%U' delete all input;

release channel c1;

release channel c2;

delete noprompt obsolete;

}

EOF

echo "backup complete!";

 

大前提是我CONFIGURE RETENTION POLICY TO REDUNDANCY 1;

1、如上的備份策略如果用藍色位置,我每天得到的是,一個數據庫的全備份(包括數據文件、參數文件、控制文件),和一個歸檔日誌的備份集(該備份集中的歸檔是上次備份歸檔日誌到這次備份歸檔日誌之間的所有歸檔),顯然這個歸檔日誌的備份集意義不大(因爲其中的歸檔大部分都是本次全備份之前的歸檔!)~! 雖然這個歸檔日誌的備份集中有非冗餘的最早的備份之前的歸檔,但是該備份集不算obsolete,因爲備份集是在本次全備之後完成的

 

2、如果用粉色的位置,那我每天備份完成會後,會有兩套全備份和歸檔日誌的備份,說不明白了。。。看圖!

這樣看來比第一種要合理一點,起碼我3號的歸檔日誌的備份,2號的全備份可以用上。。。。。也就是說我可以恢復2號3:00點到3號3:00之間的任意時間點。。。。

主要是我的保留策略太不科學~(CONFIGURE RETENTION POLICY TO REDUNDANCY 1;)   -----生產中最好不好不要冗餘1

 

如果是CONFIGURE RETENTION POLICY TO REDUNDANCY 2;的話,我上面的腳本就可以實現,有3套’黑線‘和‘藍線’,我3號備份完成後,我可以恢復1號3:00到3號3:00的任意時間點~~

也就是說我redundancy +1,我就能多保留一套備份,我可以恢復的時間就越往前唄~~

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