小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 guolijiegg 2012-01-05

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

參考文檔

<<concepts>>P52

<<Guides>>P227

<<RMAN>>

<<log buffer及日志管理深入分析及性能調整_20091119>>

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

<<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字節(jié)。

 

2 Redo logfile的結構

redo logfiledata filecontrol file一樣,都有一個文件頭信息。緊隨文件頭之后,是按照順序寫入的一個個redo record。一個redo record記錄的是一個原子操作的redo。

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

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

 

3 Redo logfile header

redo logfile頭信息中主要記錄了seq,low rbahigh rba,scn等信息,用來區(qū)分該文件中包含了哪個時間段內的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字節(jié),包括三部分組成,記錄的是redo record的起始地址。
RBA: 0x0001d5.00000002.0010

log sequence(0x1d5)

redo logfile block編號(0x2)

redo logfile block中的字節(jié)編號(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 vector。Change 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
區(qū)塊管理操作
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
創(chuàng)建/裝載索引
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狀態(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如何應用redo?哪個進程做的,SMON?過程怎么樣的,checkpoint position

 

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

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

 

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

 

當我們發(fā)出一個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.

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多