日誌緩衝區的內部管理分為兩部分,一部分是產生重做記錄,另一部分就是重做記錄寫入聯機記錄檔。這兩部分不是孤立的,沒有關聯的。在產生重做記錄的過程中,可能會觸發LGWR將重做記錄寫入聯機記錄檔。
我們先用一個例子來說明在日誌緩衝區中的操作過程,並使用[file# , blk#]來表示某個資料區塊;file#表示檔案號;blk#表示資料區塊號。
假設session 1發出更新語句:update redo_test set name='cdf' where id=1;
Oracle首先找出id=1所在的資料區塊(假設為[file#4,blk#120])放入buffer cache,然後找出一個可用的復原段資料區塊(假設為[file#2,blk#19]),將舊值'abc'放入該塊,同時產生重做記錄。然後將'cdf'放入表的資料區塊,再產生重做記錄。這時日誌緩衝區的結構可以簡單地表示為下面的形式(我們在前面描述日誌緩衝區的記憶體結構時,知道重做記錄中最重要的就下面列的這幾列內容。同時,下面的一行就表示一個重做記錄):
行號 事務id file# block# row column value
1 T1 2 19 - - abc
2 T1 4 120 1 2 cdf
這時假設session 2發出其他更新語句:update t set c1=10 where c1=9;
同樣的道理,Oracle找到該資料區塊(假設為[file#5,blk#200])放入buffer cache,並找到復原段資料區塊(假設為[file#2,blk#30])存放舊值,產生重做記錄,更新表的資料區塊,再次產生重做記錄。這時日誌緩衝區的結構類似如下形式:
行號 事務id file# block# row column value
1 T1 2 19 - - abc
2 T1 4 120 1 2 cdf
3 T20 2 30 - - 9
4 T20 5 200 20 1 10
這時,session 1又發出更新語句:update redo_test set name='xyz1' where id=2,並提交(commit)。同樣的方式處理復原段和資料區塊,並產生重做記錄。假設這時組建記錄檔緩衝區為:
行號 事務id file# block# row column value
1 T1 2 19 - - abc
2 T1 4 120 1 2 cdf
3 T20 2 30 - - 9
4 T20 5 200 20 1 10
5 T1 2 19 - - abc
6 T1 4 120 2 2 xyz1
7 T1 commit SCN timestamp
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
這時我們可以注意到,提交標記也被記錄到了重做記錄中。每次提交時,都會產生一個SCN號,SCN號越小,說明發生得越早,其所屬的重做記錄就越排在前面。一旦使用者發出commit語句,系統就會觸發LGWR進程。這時,LGWR進程會將上面所顯示的所有重做記錄都寫入聯機記錄檔中。注意,其中也包括尚未提交的事務T20。
SCN號就是Oracle資料庫內部的原子鐘,可以認為是精確到秒後9位小數的時間資訊。SCN號記錄了資料庫內部各個事件發生的先後順序,比如DML、commit、DBWn寫髒塊等都會引起SCN號的增加。
在LGWR寫這些重做記錄的過程中,又有其他session 發出更新語句,並提交。這時的日誌緩衝區假設如下所示:
行號 事務id file# block# row column value
1 T1 2 19 - - abc
2 T1 4 120 1 2 cdf
3 T20 2 30 - - 9
4 T20 5 200 20 1 10
5 T1 2 19 - - abc
6 T1 4 120 2 2 xyz1
7 T1 commit SCN timestamp
以上的重做日誌正在由LGWR寫入, 在LGWR寫時產生以下的重做日誌
-----------------------------------------------------
8 T20 2 39 - - 289
9 T20 5 498 220 3 190
10 T9 2 90 - - hhh
11 T9 9 100 20 9 xxx
12 T9 commit SCN timestamp
13 T18 2 189 - - 18
14 T18 10 29 300 10 20
15 T18 commit SCN timestamp
當LGWR寫完第一批重做記錄(第1到第7行)以後,就會立即開始寫第二批重做記錄(第8行到第15行)。注意,第二批重做記錄中,存在兩個commit,但LGWR不會分成兩次來寫,而是一次就將它們全部寫入。當LGWR在寫完第1到第7行的改動向量以後,這部分的日誌緩衝區記憶體就被釋放了,可以被新產生的重做記錄所覆蓋。