您的位置:首页 > 数据库 > Oracle

Oracle教程之log buffer的内部管理机制

2013-04-18 10:45 295 查看
日志缓冲区的内部管理分为两部分,一部分是生成重做记录,另一部分就是重做记录写入联机日志文件。这两部分不是孤立的,没有关联的。在生成重做记录的过程中,可能会触发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 value1 T1 2 19 - - abc2 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 value1 T1 2 19 - - abc2 T1 4 120 1 2 cdf3 T20 2 30 - - 94 T20 5 200 20 1 10 这时,session 1又发出更新语句:update redo_test set name='xyz1' where id=2,并提交(commit)。同样的方式处理回滚段和数据块,并生成重做记录。假设这时生成日志缓冲区为: 行号 事务id file# block# row column value1 T1 2 19 - - abc2 T1 4 120 1 2 cdf3 T20 2 30 - - 94 T20 5 200 20 1 105 T1 2 19 - - abc6 T1 4 120 2 2 xyz17 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 value1 T1 2 19 - - abc2 T1 4 120 1 2 cdf3 T20 2 30 - - 94 T20 5 200 20 1 105 T1 2 19 - - abc6 T1 4 120 2 2 xyz17 T1 commit SCN timestamp 以上的重做日志正在由LGWR写入, 在LGWR写时生成以下的重做日志-----------------------------------------------------8 T20 2 39 - - 289 9 T20 5 498 220 3 19010 T9 2 90 - - hhh11 T9 9 100 20 9 xxx12 T9 commit SCN timestamp13 T18 2 189 - - 1814 T18 10 29 300 10 2015 T18 commit SCN timestamp 当LGWR写完第一批重做记录(第1到第7行)以后,就会立即开始写第二批重做记录(第8行到第15行)。注意,第二批重做记录中,存在两个commit,但LGWR不会分成两次来写,而是一次就将它们全部写入。当LGWR在写完第1到第7行的改动向量以后,这部分的日志缓冲区内存就被释放了,可以被新生成的重做记录所覆盖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息