作者 · 2011-12-18 13:11
· 再论lowtran和minbuff 字数 2199 阅读 6298 评论 16 赞 1
看到帖子http://www.db2china.net/club/thread-16855-1-1.html。 其实lowtranlsn和minbufflsn的本质是WAL协议中的两个因子. WAL(write ahead logging),即写日志必须在写数据之前发生。 那么lowtranlsn和minbufflsn可以理解的更简单些。 从应用的角度看,数据写有两种情况:一种是主动写(事务提交),另一种是被动写(dirty page由于某种原因需要被写回磁盘)。 主动写在数据库中进行了优化,事务提交一般并不flush BP中dirty page,因为commit时已把相应的日志记录写到日志中。这样BP可以得到最大化利用。 那么lowtranlsn对应前者,代表the LSN of the log record of the oldest uncommitted transaction,随着并发事务不断提交,lowtranlsn会向前移动。控制lowtranlsn的参数有max_log, num_log_span minbufflsn对应后者,代表the LSN of the log record of the oldest dirty page in bufferpool。随着bp不断flush脏页,minbufflsn会向前移动。控制minbufflsn的参数有soft_max 其实只要是使用WAL的数据库都会有类似的情况。只不过在某些DB中flush bp的条件定的死一些。 ------------ 1219: 看到一些朋友回复之后,有必要澄清一下: 理论形式很简单,但细节还是比较复杂的: 1)对于rollforward recovery,因为db一开始就是consistent的,所以前滚从min(lowtranlsn,minbufflsn)开始,但可以选定任意PIT结束。在哪里结束都可以得到一个一致的db。 2)对于crash recovery,也是从min(lowtranlsn,minbufflsn)开始,但是结束位置必须满足以下条件。 在LFH文件中有记录一个log record LSN,它是崩溃之前db2最后写到日志里的log record lsn(db2在每次soft check point会更新它)。CR要至少达到这个位置才能保证数据库恢复到一致性状态。 另外lowtranlsn,minbufflsn只是指定了恢复的起始位置,它能保证从这个位置开始重做一定可以恢复db一致性。但是注意事务是并发的,lowtran只是定位了最老未提交的事务,lowtran<minbuff并不表示lowtran之后就都是未提交的事务,完全可以有已提交的。因此无论谁大谁小,redo阶段是一定有的。 当然对于那些lsn<minbufflsn的log record就不用重做,因为相应dirty page已被flush到disk上了。 ------ 1222: http://www.db2china.net/club/thread-23131-1-1.html mdkii钻研的精神很令人钦佩。不过从用户的角度,还是要先抓住基本概念和问题本质,尽量化繁为简。 其一,CR原理简单,但细节其实很多的,从细节信息反推设计是费力不讨好的事情,而且很容易推错。 其二,DB2发展了较长时间,随着新功能的不断添加,细节的东西也越来越多。搞懂每一个细节是比较难的。 再补充两点: 1)如上所述,CR就是简单的两个阶段:redo和undo。 db2中的recovery(crash recovery, online backup recovery, db rollforward recovery, HADR standby redo)本质上是一样的(tbspacle rollforward recovery稍有不同)。他们起始点都是min(lowtranlsn,minbufflsn)。分为redo和undo阶段。 redo阶段是不可省略的,除非 lowtran,minbuff已经指向log最新的位置,即没有未提交事务,也没有dirty page被flush。 如果没有未提交事务,undo阶段是可以省略的。 redo阶段就是读log record,根据log record中txn信息在内存中重建transaction table,然后重做它(重做阶段是由redow并行进行),如果该txn commit/abort了,那么就把它从txn table中删掉。 注意,lowtran,minbuff在redo过程中是跟着向前移动的。那么这就意味着,如果有下一次recovery,起点依然是min(lowtran,minbuff),但其位置已经向前移动了。不会再重复redo。 对于CR,undo阶段紧跟着redo阶段,这时内存txn table中只剩下了未提交事务,对每一个未提交事务,undo其对应的log record,abort;如果没有未提交事务,那就不用undo了。 关于lsn, 如果把log stream类比成计算机的内存空间,那么lsn相当于内存地址。 db2中各种lsn很多,没必要去明白每一个lsn的具体定义。他们的目的只有一个: 在log stream中定位各种所需的地址,比如log record地址
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
分享
添加新评论16 条评论
2012-04-10 09:13
2012-02-23 16:13
2012-02-23 09:09
2011-12-22 19:01
2011-12-22 18:33
2011-12-22 16:08
2011-12-22 15:41
2011-12-20 10:06
2011-12-20 09:54
2011-12-19 23:19
if l<m 都是未提交的,忽略
:)
2011-12-19 18:08
2011-12-19 15:28
2011-12-18 22:44
2011-12-18 22:44
2011-12-18 20:57
2011-12-18 20:56
if l<m 都是未提交的,忽略
:)