redo log file 物理結構學習與測試

gdutllf2006發表於2009-12-08

redo log file 物理結構學習與測試

參考文件

<>P52

<>P227

<>

<及日誌管理深入分析及效能調整_20091119>>

<>

<< oracle dump命令的使用_20091207.doc>>

<<一個事務的整個流程,datafile,undo,redo的內容_20091208.doc>>

 

目錄

1 redo log file overview

2 Redo logfile的結構

3 Redo logfile header

4 Redo record header

6 相關views

7 Notes

 

1 redo log file overview

 

1.1 The primary function of the redo log is to record all changes made to data. The information in a redo log file is used only to recover the database from a system or media failure that prevents database data from being written to the datafiles.

 

1.2 Online redo log files are filled with redo records. A redo record, also called a redo entry, is made up of a group of change vectors, each of which is a description of a change made to a single block in the database. (一個 change vectors 描述一個block的變化,多個change vectors 構成一個redo record,透過Dump命令可以看到詳細)

For example, if you change a salary value in an employee table, you generate a redo record containing change vectors that describe changes to the data segment block for the table, the rollback segment data block, and the transaction table of the rollback segments.

 

1.3 Redo entries record data that you can use to reconstruct all changes made to the database, including the rollback segments. Therefore, the online redo log also protects rollback data. when you recover the database using redo data, Oracle reads the change vectors in the redo records and applies the changes to the relevant blocks.

 

1.4 Oracle properly applies redo log files in ascending order by using the log sequence number of necessary archived and online redo log files.(以升序的方式應用日誌? 假定有3,4,5日誌要應用,從3開始應用)

 

1.5 Oracleredo機制是一種邏輯和物理日誌結合的機制,其內容包括:

DML語句導致的資料庫變更,但是不包括DML語句本身;

DDL語句導致的資料字典的變更,同時包含DDL語句本身;

遞迴語句導致的資料庫變更

 

redo logfile是按順序寫入的檔案,其塊大小不同於資料塊大小是有db_block_size引數設定的,而是在Oracle原始碼中固定的,和os相關,大部分os中都是512位元組。

 

2 Redo logfile的結構

redo logfiledata filecontrol file一樣,都有一個檔案頭資訊。緊隨檔案頭之後,是按照順序寫入的一個個redo record。一個redo record記錄的是一個原子操作的redo

redo record的結構,則是由一個redo record頭記錄加上一個個change vector。一個change vector就是對一個block的一次修改的redo。一個原子操作可能包含對相關的幾個block的修改,比如data blockundo blockundo header block等,所以包含了幾條change vector

Oracle提供了dump redo logfile的功能,可以看到redo file中儲存的具體資訊。

 

3 Redo logfile header

redo logfile頭資訊中主要記錄了seqlow rbahigh rbascn等資訊,用來區分該檔案中包含了哪個時間段內的redo記錄。另外還包括了當前例項中可用的所有redo logfile的一個連結串列,主要用於日誌切換時找到下一個可用的redo logfile

另外,前面說到的redo block size的大小在redo logfile header中也是有記錄的,注意到Blksiz=512

redo logfile header也可以單獨的dump出來(包括整個例項中可用的redo logfile header

 

SQL>alter system set events 'immediate trace name redohdr level 10';

System altered.

 

4 Redo record header

 

redo record header中的資訊比較簡單,主要包括:

Thread:產生該redo recordinstancethread編號

RBAredo byte address redo record的地址

LEN:該redo record的大小

SCN:產生該redo record時的SCN

其中,RBA10位元組,包括三部分組成,記錄的是redo record的起始地址。
RBA: 0x0001d5.00000002.0010

log sequence(0x1d5)

redo logfile block編號(0x2)

redo logfile block中的位元組編號(0x10)

 

5 Change vector

 

Change vector 包含哪些資訊呢? 基本上, 它包含了來自於資料塊的版本號, 操作的型別以及資料塊的地址. 每個redo record是由多個change vector組成的. oracle 在恢復過程中, 會保證一個transaction 要麼被全部恢復, 要麼全部不恢復, 實際上就是透過恢復redo record中的全部change vector來做到的, 只要有一個change vector恢復失敗, 這個redo record的所有change vector都將失敗.

 

change vector儲存的是對單個block的修改記錄,這些block可以是:

資料塊 data block

回滾塊 undo block

資料段頭塊 data segment header block

回滾段頭塊 undo header block

每次修改cache buffer中的這些block時,需要先在PGA中生成對應的change vectorChange vector的結構,包含一個頭資訊,和一組修改記錄的長度加上修改的值資訊。

change vector header主要包括:

change #n 同一個redo record中的change vector的編號

TYP 變更型別

CLS 本次修改對應的block的類別,等於x$bh.class

AFN 絕對檔案號

DBA 本次修改對應的block的地址

SCN 修改時的SCN

SEQ 同一個SCN的不同修改以seq編號

OP 操作碼,由兩部分組成,layer code. sub code

 

對於blockclass,常見類別如下

1 data block
2 sort block
3 deferred undo segment block
4 segment header block(table)
5 deferred undo segment header block
6 free list block
7 extent map block
8 space management bitmap block
9 space management index block
10 unused
11+2r segment header for undo segment,
其中rundo segment 的編號
12+2r data block for undo segment r

 

而對於操作碼,其layer code表示了操作的的型別,主要有

4 塊清除
5
事務管理,如commit/rollback
10
索引操作

11
行資料操作
13
段管理操作

14
區塊管理操作
17
表空間管理操作
18
塊映像(手工熱備期間產生)
19
直接路徑裝載
20 Compatibility Segment
22
本地管理表空間操作
23 block
寫出
24 DDL
語句

 

比較常見的操作碼,比如

4.1 塊清除

5.1 修改undo header中的事務資訊
5.2
事務開始
5.4 commit
5.19
事務審計
5.20
子事務審計

10.2 插入頁塊記錄
10.3
清除頁塊記錄
10.4
刪除頁塊中的記錄
10.5
還原頁塊日誌
10.6
鎖定索引塊
10.7
提交時清除塊中的操作碼
10.8
初始化頭部
10.9 ITL1
上應用XAT
10.10
設定頁塊指向下一個頁塊的指標

10.11
設定頁塊指向上一個頁塊的指標
10.12 root
塊分裂後重新初始化
10.13
清空頁塊
10.15
分支塊中插入記錄
10.16
清除分支塊中的記錄
10.18
更新記錄中的鍵值
10.19
清除分裂標誌
10.21
撤銷分支塊操作
10.22
撤銷頁塊操作
10.24
收縮ITL
10.30
更新非鍵值

10.31
建立/裝載索引
10.34
清空頁塊

11.2 插入一條資料
11.3
刪除一條資料
11.4
鎖定資料(select for update)
11.5
更新記錄

11.6
行連結
11.9 cluster
鍵索引操作
11.10
設定cluster鍵指標
11.11
插入多條記錄
11.12
刪除多條記錄

17.1 end backup
18.1 begin backup

19.1 直接路徑裝載(歸檔模式)
19.2 nologging
設定

23.1 dbwr寫出block(9.0.1開始)

 

6 相關views  

 

V$log

V$logfile

V$log_history

檢視redo log狀態:

idle> select a.group#,a.status, b.member from v$log a, v$logfile b where a.group# = b.group#;

 

    GROUP# STATUS

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

MEMBER

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

         1 INACTIVE

/u01/app/oracle/oradata/mydb/redo01.log

 

         2 INACTIVE

/u01/app/oracle/oradata/mydb/redo02.log

 

         3 CURRENT

/u01/app/oracle/oradata/mydb/redo03.log

 

 

 

7 Notes

1) What is transaction table?

 

2) Oracle 如何應用redo ?哪個程式做的,SMON? 過程怎麼樣的,checkpoint position

 

3) 如何來跟蹤一個事務產生undo/redo的過程?

參考<<一個事務的整個流程,datafile,undo,redo的內容_ 20091208.doc>>

 

4) 一個update 語句會產生多少個redo recordundo record ?

 

當我們發出一個update語句的時候, Oracle會完成以下幾步:

1. 生成一系列change vector.

2. redo buffer中儲存這一系列change vector組成的redo record, redo record最終將被寫入到redolog檔案中.

3. 更改資料快.

 

對於update語句, 典型情況下會包含3change vector. 首先, 為了保留before image以便undo,需要把資料塊的before image放入rollback segment, 放入到rollback segment, oracle會在rollback segmenttransaction(是哪個表呢??與前面的transaction table 同個問題)裡插入一條記錄儲存了被修改的資料塊的地址. 由於這個transaction表本身也是儲存在一個資料塊裡的, 因此, 這個操作本身也是對資料塊的修改, 因此, 這個修改需要生成一個change vector. 其次, oracle 把改動的資料塊寫入到rollback segment的目標塊也是一個資料塊, 因此, 對該塊也需要一個change vector. 第三個change vector就是被修改的資料塊本身了. 這是一條redo record

如果上述update語句剛好修改到了被索引的列, 索引也會被修改, 同樣需要生成一個包含多個change vectorredo record.

commit 會生成第三個redo record. 因此, 最簡單的一個update+commit, 會產生上面的三個redo record.

 

 

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

相關文章