午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

redo log file 物理結(jié)構(gòu)學(xué)習(xí)與測(cè)試

 guolijiegg 2012-01-05

redo log file 物理結(jié)構(gòu)學(xué)習(xí)與測(cè)試

參考文檔

<<concepts>>P52

<<Guides>>P227

<<RMAN>>

<<log buffer及日志管理深入分析及性能調(diào)整_20091119>>

<<How to Dump and Analyze Redo Log File Information_20091208.doc>>

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

<<一個(gè)事務(wù)的整個(gè)流程,datafile,undo,redo的內(nèi)容_20091208.doc>>

 

目錄

1 redo log file overview

2 Redo logfile的結(jié)構(gòu)

3 Redo logfile header

4 Redo record header

6相關(guān)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. (一個(gè)change vectors描述一個(gè)block的變化,多個(gè)change vectors構(gòu)成一個(gè)redo record,通過Dump命令可以看到詳細(xì))

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.(以升序的方式應(yīng)用日志?假定有3,4,5日志要應(yīng)用,從3開始應(yīng)用)

 

1.5 Oracleredo機(jī)制是一種邏輯和物理日志結(jié)合的機(jī)制,其內(nèi)容包括:

DML語(yǔ)句導(dǎo)致的數(shù)據(jù)庫(kù)變更,但是不包括DML語(yǔ)句本身;

DDL語(yǔ)句導(dǎo)致的數(shù)據(jù)字典的變更,同時(shí)包含DDL語(yǔ)句本身;

遞歸語(yǔ)句導(dǎo)致的數(shù)據(jù)庫(kù)變更

 

redo logfile是按順序?qū)懭氲奈募?,其塊大小不同于數(shù)據(jù)塊大小是有db_block_size參數(shù)設(shè)置的,而是在Oracle源代碼中固定的,和os相關(guān),大部分os中都是512字節(jié)。

 

2 Redo logfile的結(jié)構(gòu)

redo logfiledata file,control file一樣,都有一個(gè)文件頭信息。緊隨文件頭之后,是按照順序?qū)懭氲囊粋€(gè)個(gè)redo record。一個(gè)redo record記錄的是一個(gè)原子操作的redo

redo record的結(jié)構(gòu),則是由一個(gè)redo record頭記錄加上一個(gè)個(gè)change vector。一個(gè)change vector就是對(duì)一個(gè)block的一次修改的redo。一個(gè)原子操作可能包含對(duì)相關(guān)的幾個(gè)block的修改,比如data block,undo blockundo header block等,所以包含了幾條change vector

Oracle提供了dump redo logfile的功能,可以看到redo file中保存的具體信息。

 

3 Redo logfile header

redo logfile頭信息中主要記錄了seq,low rba,high rba,scn等信息,用來區(qū)分該文件中包含了哪個(gè)時(shí)間段內(nèi)的redo記錄。另外還包括了當(dāng)前實(shí)例中可用的所有redo logfile的一個(gè)鏈表,主要用于日志切換時(shí)找到下一個(gè)可用的redo logfile。

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

redo logfile header也可以單獨(dú)的dump出來(包括整個(gè)實(shí)例中可用的redo logfile header

 

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

System altered.

 

4 Redo record header

 

redo record header中的信息比較簡(jiǎn)單,主要包括:

Thread:產(chǎn)生該redo recordinstancethread編號(hào)

RBAredo byte address redo record的地址

LEN:該redo record的大小

SCN:產(chǎn)生該redo record時(shí)的SCN

其中,RBA長(zhǎng)10字節(jié),包括三部分組成,記錄的是redo record的起始地址。
RBA: 0x0001d5.00000002.0010

log sequence號(hào)(0x1d5)

redo logfile block編號(hào)(0x2)

redo logfile block中的字節(jié)編號(hào)(0x10)

 

5 Change vector

 

Change vector包含哪些信息呢?基本上,它包含了來自于數(shù)據(jù)塊的版本號(hào),操作的類型以及數(shù)據(jù)塊的地址.每個(gè)redo record是由多個(gè)change vector組成的. oracle在恢復(fù)過程中,會(huì)保證一個(gè)transaction要么被全部恢復(fù),要么全部不恢復(fù),實(shí)際上就是通過恢復(fù)redo record中的全部change vector來做到的,只要有一個(gè)change vector恢復(fù)失敗,這個(gè)redo record的所有change vector都將失敗.

 

change vector保存的是對(duì)單個(gè)block的修改記錄,這些block可以是:

數(shù)據(jù)塊data block

回滾塊undo block

數(shù)據(jù)段頭塊data segment header block

回滾段頭塊undo header block

每次修改cache buffer中的這些block時(shí),需要先在PGA中生成對(duì)應(yīng)的change vector。Change vector的結(jié)構(gòu),包含一個(gè)頭信息,和一組修改記錄的長(zhǎng)度加上修改的值信息。

change vector header主要包括:

change #n同一個(gè)redo record中的change vector的編號(hào)

TYP變更類型

CLS本次修改對(duì)應(yīng)的block的類別,等于x$bh.class

AFN絕對(duì)文件號(hào)

DBA本次修改對(duì)應(yīng)的block的地址

SCN修改時(shí)的SCN

SEQ同一個(gè)SCN的不同修改以seq編號(hào)

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

 

對(duì)于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的編號(hào)
12+2r data block for undo segment r

 

而對(duì)于操作碼,其layer code表示了操作的的類型,主要有

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

11
行數(shù)據(jù)操作
13
段管理操作

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

 

比較常見的操作碼,比如

4.1塊清除

5.1修改undo header中的事務(wù)信息
5.2
事務(wù)開始
5.4 commit
5.19
事務(wù)審計(jì)
5.20
子事務(wù)審計(jì)

10.2插入頁(yè)塊記錄
10.3
清除頁(yè)塊記錄
10.4
刪除頁(yè)塊中的記錄
10.5
還原頁(yè)塊日志
10.6
鎖定索引塊
10.7
提交時(shí)清除塊中的操作碼
10.8
初始化頭部
10.9 ITL1
上應(yīng)用XAT
10.10
設(shè)置頁(yè)塊指向下一個(gè)頁(yè)塊的指針

10.11
設(shè)置頁(yè)塊指向上一個(gè)頁(yè)塊的指針
10.12 root
塊分裂后重新初始化
10.13
清空頁(yè)塊
10.15
分支塊中插入記錄
10.16
清除分支塊中的記錄
10.18
更新記錄中的鍵值
10.19
清除分裂標(biāo)志
10.21
撤銷分支塊操作
10.22
撤銷頁(yè)塊操作
10.24
收縮ITL
10.30
更新非鍵值

10.31
創(chuàng)建/裝載索引
10.34
清空頁(yè)塊

11.2插入一條數(shù)據(jù)
11.3
刪除一條數(shù)據(jù)
11.4
鎖定數(shù)據(jù)(select for update)
11.5
更新記錄

11.6
行鏈接
11.9 cluster
鍵索引操作
11.10
設(shè)置cluster鍵指針
11.11
插入多條記錄
11.12
刪除多條記錄

17.1 end backup
18.1 begin backup

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

23.1 dbwr寫出block(9.0.1開始)

 

6相關(guān)views  

 

V$log

V$logfile

V$log_history

查看redo log狀態(tài):

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如何應(yīng)用redo?哪個(gè)進(jìn)程做的,SMON?過程怎么樣的,checkpoint position

 

3)如何來跟蹤一個(gè)事務(wù)產(chǎn)生undo/redo的過程?

參考<<一個(gè)事務(wù)的整個(gè)流程,datafile,undo,redo的內(nèi)容_ 20091208.doc>>

 

4)一個(gè)update語(yǔ)句會(huì)產(chǎn)生多少個(gè)redo recordundo record ?

 

當(dāng)我們發(fā)出一個(gè)update語(yǔ)句的時(shí)候, Oracle會(huì)完成以下幾步:

1.生成一系列change vector.

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

3.更改數(shù)據(jù)快.

 

對(duì)于update語(yǔ)句,典型情況下會(huì)包含3個(gè)change vector.首先,為了保留before image以便undo,需要把數(shù)據(jù)塊的before image放入rollback segment,放入到rollback segment時(shí), oracle會(huì)在rollback segmenttransaction(是哪個(gè)表呢??與前面的transaction table同個(gè)問題)里插入一條記錄保存了被修改的數(shù)據(jù)塊的地址.由于這個(gè)transaction表本身也是存儲(chǔ)在一個(gè)數(shù)據(jù)塊里的,因此,這個(gè)操作本身也是對(duì)數(shù)據(jù)塊的修改,因此,這個(gè)修改需要生成一個(gè)change vector.其次, oracle把改動(dòng)的數(shù)據(jù)塊寫入到rollback segment的目標(biāo)塊也是一個(gè)數(shù)據(jù)塊,因此,對(duì)該塊也需要一個(gè)change vector.第三個(gè)change vector就是被修改的數(shù)據(jù)塊本身了.這是一條redo record。

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

commit會(huì)生成第三個(gè)redo record.因此,最簡(jiǎn)單的一個(gè)update+commit,會(huì)產(chǎn)生上面的三個(gè)redo record.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多