您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

log buffer的内部管理机制

 

日志缓冲区的内部管理分为两部分,一部分是生成重做记录,另一部分就是重做记录写入联机日志文件。这两部分不是孤立的,没有关联的。在生成重做记录的过程中,可能会触发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

 

这时我们可以注意到,提交标记也被记录到了重做记录中。每次提交时,都会生成一个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行的改动向量以后,这部分的日志缓冲区内存就被释放了,可以被新生成的重做记录所覆盖。

 

源文档 <http://book.51cto.com/art/200806/75616.htm>

相关文章 [上一篇] log buffer的内存结构
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号