Oracle中log buffer的內部管理機制概述

來源:互聯網
上載者:User

日誌緩衝區的內部管理分為兩部分,一部分是產生重做記錄,另一部分就是重做記錄寫入聯機記錄檔。這兩部分不是孤立的,沒有關聯的。在產生重做記錄的過程中,可能會觸發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行的改動向量以後,這部分的日誌緩衝區記憶體就被釋放了,可以被新產生的重做記錄所覆蓋。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.