关于重做日志缓冲区(REDO Log Buffer)中内容的一点研究

    对于数据库内所有被更改的数据块(segment),Oracle会把所有更改内容清楚记录在REDO日志缓冲中。 所谓所有更改内容,当然包括数据段,还有索引段和回滚段(rollback segment)。 数据库内任意数据块所发生的一个更改,会被写成一个变更向量(Change Vector)。 修改向量里包含了更改的数据块的地址与更新的数据。

数据库的更改的最小记录单位是变更向量,一连串的变更向量集合起来称为重做记录 (REDO Record)。有些事务(transaction)会产生不止一个重做记录, 每个重做记录里都包含了一连串的变更向量。 接下来,我们就以下面的例子追踪变更向量和重做记录产生的过程。

──SQL语句──
*************************************************************
UPDATE WORK03
SET EMPNO = 9999
WHERE EMPNO = 1111 ;

※ EMPNO项目尚未创建索引
*************************************************************


运行上面的UPDATE语句之后,会产生下面的变更向量。

1. 对于回滚段的事务表(标题)的变更向量
当含有修改的数据块的地址、该事务的状态(commit或active)、 以及存有该事务的UNDO的回滚段的位置的事务表被修改的时候,就会产生变更向量。

2. 对于回滚段的数据块的变更向量
将修改前的值(1111)存储(修改)到回滚段里的数据块时,就会产生变更向量。

3. 对于WORK03表内的数据块的变更向量
将修改后的值(9999)覆盖(修改)到WORK03表内的数据块时,就会产生变更向量。

由上面的例子可知,对于这个事务,重做记录理会有三个修改向量。当然可能有其他情况会产生重做记录, 例如修改的项目如果有索引,就必须修改索引,这时候就会产生第二个重做记录。 这时候的重做记录还是和第一个重做记录一样,包含不止一个变更向量。此外, 在事务之后运行commit语句,就会产生第三个重做记录。

那么,重做日志缓冲区中的内容何时才被写进重做日志文件中呢,当满足以下4个条件任一条时:
(1).Commit操作
(2).Redo buffer log 使用超过1/3
(3).Redo buffer log 使用超过 1 MB
(4).在DBW0开始写之前

LGWR写进程就会被触发,从而把重做日志缓冲区中的内容写进重做日志文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值