Oracle聯機熱備份的原理及rman增量備份原理

tolywang發表於2006-06-23

要求歸檔模式
SQL>; archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Next log sequence to archive 16
Current log sequence 16

-------------
先看使用者管理的熱備份



看看下面這個關鍵的操作,將備份的內容置於backup模式,使用者管理的聯機熱備份必需的操作,不然copy備份的資料檔案不能用來恢復,即使用某些放時恢復了也會丟資料
SQL>; alter tablespace users begin backup;
Tablespace altered.
SQL>; list
1 select d.file_name filename,d.tablespace_name ts_name,b.status
2 from dba_data_files d,v$backup b
3* where d.file_id=b.file#
SQL>; /
FILENAME TS_NAME STATUS
---------------------------------------- ---------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM NOT ACTIVE
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 NOT ACTIVE
/u02/oradata/sales/sysaux01.dbf SYSAUX NOT ACTIVE
/u02/oradata/sales/users01.dbf USERS ACTIVE
/u02/oradata/sales/example01.dbf EXAMPLE NOT ACTIVE
/u02/oradata/sales/perfstat.dbf PERFSTAT NOT ACTIVE

USERS
表空間現在處於backup模式,究竟這時候怎麼了?在我們alter tablespace users begin backup 的時候是鎖定了users表空間對應的資料檔案頭的change scn
首先考慮一下資料庫怎麼用日誌檔案做恢復:查詢不一致的資料檔案(根據檔案頭中舊的scn如果鎖定了檔案頭,這個檔案頭中的scn就不會改變(當然了資料塊還是會變化的,還可以做讀寫)。然後就會應用這個scn到現在的日誌。那我鎖定了scn,不管你後邊怎麼修改,總之做恢復的時候是應用鎖定的時候的scn一直到現在的日誌(完全恢復的話)
舉個例子:
a,b
兩個資料檔案,把a置於備份模式,b正常這時候兩個change scn都是100,然後開始備份這期間有資料庫的修改,備份完成的時候,Scn變成了200。但是由於a的備份模式,所以a的檔案頭中記錄的scn還是100b200某個時間,假設scn 500這時候a丟失
copy
a的備份,然後recover,完全恢復的話資料庫就應用100—500這段的日誌,自然也就不會丟失資料了。因為不管在我copy備份的過程中你做什麼操作,總之都在鎖定的時change scn之後,所以應用的日誌就不會有遺漏了。這時候應該能理解為什麼要資料庫處於archived模式了

看看資料檔案頭的change scn
SQL>;select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;
NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 545926
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 545926
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 545926
/u02/oradata/sales/users01.dbf USERS ONLINE 545498
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 545926
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 545926

6 rows selected.
顯然,在將users表空間置於backup狀態的時候,相應的datafile的檔案頭的scn就不會再發生改變,發生檢查點也不會改變。
SQL>; alter system checkpoint;
System altered.

SQL>; select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;
NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 546196
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 546196
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 546196
/u02/oradata/sales/users01.dbf USERS ONLINE 545498
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 546196
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 546196

6 rows selected.

下面end backup,看看scn

SQL>; alter tablespace users end backup;
Tablespace altered.

SQL>; alter system checkpoint;
System altered.

SQL>;select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;

NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 546467
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 546467
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 546467
/u02/oradata/sales/users01.dbf USERS ONLINE 546467
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 546467
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 546467

6 rows selected.

------------------
再說說rman備份
個人認為理解了使用者管理的熱備份,rman就已經理解了一大半了
rman
備份是針對塊一級的,支援增量備份,稍後說怎麼做的增量備份

Rman
備份並不需要將資料庫或者表空間置於backup狀態,但是它會把scn記錄在catalog中對應你的backupset準備在恢復的時候來使用
users表空間做一個完全備份
$ rman target sys/oracle nocatalog
RMAN>; run {
2>; allocate channel d1 type disk;
3>; backup
4>; format='/u03/oraclebk/%d_%N_%s.bk' tablespace users;
5>; release channel d1;
6>; }

看一下備份集裡都有什麼,注意看Ckp SCN 546792,
RMAN>; list backup of tablespace users;

List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
3 Full 1M DISK 00:00:02 31-MAR-05
BP Key: 3 Status: AVAILABLE Compressed: NO Tag: TAG20050331T153729
Piece Name: /u03/oraclebk/SALES_USERS_4.bk
List of Datafiles in backup set 3
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
4 Full 546792 31-MAR-05 /u02/oradata/sales/users01.dbf
恢復的時候應用546792開始到現在的歸檔日誌和重做日誌
.

---------------
rman
的增量備份的基本原理
其實原理很簡單,主要就是弄明白怎麼樣在做增量備份時確定某個資料塊需要備份,哪個不需要
rman
在做1級備份的時候怎麼來確定0級備份之後都有哪些資料塊做了修改呢?看下面一段
Each data block in a datafile contains a system change number (SCN), which is the
SCN at which the most recent change was made to the block. During an incremental
backup, RMAN reads the SCN of each data block in the input file and compares it to
the checkpoint SCN of the parent incremental backup. If the SCN in the input data
block is greater than or equal to the checkpoint SCN of the parent, then RMAN copies
the block.
原來block裡邊也有一個change scn也就是說在做level 1級備份的時候,需要掃描所有的資料塊並且用塊中記錄修改的SCNlevel 0備份時的SCN做比較(備份記錄中的Ckp SCN),來確定這個塊是否需要備份。所以掃描整個資料檔案是不可避免的 !
這是傳統的rman做增量備份
在10g中rman做增量備份不再需要掃描整個資料檔案了
10g
引入的新特性 block change tracking
Block change tracking
程式記錄自從上一次備份以來資料塊的變化,並把這些資訊記錄在跟蹤檔案中。
RMAN使用這個檔案判斷增量備份中需要備份的變更資料。這極大的促進了備份效能,RMAN可以不再掃描整個檔案以查詢變更資料。RMAN's change tracking feature for incremental backups improves incremental
backup performance by recording changed blocks in each datafile in a change tracking
file. If change tracking is enabled, RMAN uses the change tracking file to identify
changed blocks for incremental backup, thus avoiding the need to scan every block in
the datafile.
估計是使用的點陣圖檔案做的記錄!

附:有興趣的可以看看dump的資料塊
透過下面的查詢找一個表對應的資料塊
SQL>; select file_id,block_id,blocks
2 from dba_extents
3 where segment_name='EMPLOYEES';

FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
5 81 8

dump
一個塊到udumptrc檔案
SQL>; alter system dump datafile 5 block 81;

System altered.

udump目錄找到對應的trc檔案,找到dump那段
Start dump data blocks tsn: 6 file#: 5 minblk 81 maxblk 81
buffer tsn: 6 rdba: 0x01400051 (5/81)
scn: 0x0000.00086c4d seq: 0x01 flg: 0x04 tail: 0x4b502001
後面省略了


scn: 0x0000.00086c4d
16進位制你可以換算過來552013
你可以嘗試做一下修改,不過一定要保證對應的塊被修改了,並且被寫了,才能反映出來

Oracle備份中,我們可以使用alter tablespace ... begin backup將表空間置於聯機備份模式,然後用作業系統命令進行資料檔案的物理複製,達到備份的目的,這個過程中資料檔案還是照樣聯機,並進行正常的資料插入,但會導致比平常更多的REDO記錄的產生
產生較多的REDO記錄是由熱備引起的,因為在熱備過程中,我們採用copy/ocopy命令,這個是屬於作業系統的命令,他和Oracle是不相關的,不能和Oracle的內部程式如dbwr進行互動,這樣就可能導致熱碑塊的出現,因為作業系統讀取資料檔案時,他的IO尺寸並不是block size的大小,一般會更小,這樣會導致一個資料塊被讀取多次,而每次獲取的部分都不一致(資料不斷更新),為了恢復這種斷裂的熱碑塊,Oracle進行了資料塊前映象這個操作,對於backup模式的資料檔案塊,在第一次受到DML影響時,先將資料塊整個COPYREDO中,後續的DML在進行UNDO,正常REDO資訊的記錄,當恢復資料檔案時,會先應用最先的資料塊前映像,然後才是後續的REDO記錄資訊,更多的日誌記錄就是這個前映像產生的,這個不能和UNDO弄混淆,他是整個資料塊,而不是簡單的行記錄,由於Oracle本身不知道在複製時那些塊可能出現熱碑,所以只要是BACKUP期間有DML的塊,就按照上面的情況處理,所以如果在backup期間執行大量的批處理程式,日誌資訊會集聚增多
還有就是為什麼alter tablespace ... begin backup要凍結檔案頭的SCN?
這個主要是以後資料檔案做恢復的起始SCN,在BEGIN BACKUP下達後,系統要對錶空間執行檢查點,並將該檢查點前的所有事務應用都固化到資料檔案,然後凍結這個SCN,直到使用END BACKUP,使備份過程結束,再更新為新的SCN,凍結的原因是因為使用作業系統命令複製資料檔案時,他不能保證第一個讀取的塊就是資料檔案頭,如果不凍結,則可能從備份開始,已經多次更新了檔案頭,而此時檔案頭還沒有被複製,這樣等檔案頭被複製後,他的SCN已經遠遠大於了資料檔案中其他資料塊的SCN,這樣從檔案頭的SCN來定位恢復起點就不現實了

從上面可以看出,熱備與RMAN的聯機備份是存在本質區別的,RMAN是連線目標資料庫,產生Oracle使用者程式,呼叫他自身的過程包,與dbwr進行互動,使用OracleSGAPGA進行備份,這樣他首先會保證每個塊都是一致的,不會出現熱碑現象,這樣就減少了REDO記錄的產生,他也不需要凍結檔案頭SCN,因為RMAN總是能先讀取資料檔案頭的塊,做為DBARMAN工具都不能使用的話是很可笑的!!!

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

相關文章