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 Oracle的redo機(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 logfile和data 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 block,undo 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 record的instance的thread編號(hào) RBA:redo byte address redo record的地址 LEN:該redo record的大小 SCN:產(chǎn)生該redo record時(shí)的SCN 其中,RBA長(zhǎng)10字節(jié),包括三部分組成,記錄的是redo record的起始地址。 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ì)于block的class,常見類別如下 1 data block 而對(duì)于操作碼,其layer code表示了操作的的類型,主要有 4塊清除 比較常見的操作碼,比如 4.1塊清除 5.1修改undo header中的事務(wù)信息 10.2插入頁(yè)塊記錄 11.2插入一條數(shù)據(jù) 17.1 end backup 19.1直接路徑裝載(歸檔模式) 23.1 dbwr寫出block( 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 record和undo 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 segment的transaction表(是哪個(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 vector的redo record. commit會(huì)生成第三個(gè)redo record.因此,最簡(jiǎn)單的一個(gè)update+commit,會(huì)產(chǎn)生上面的三個(gè)redo record. |
|