作者·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 条评论

xu5762173xu5762173数据库管理员Ess
2012-04-10 09:13
l<m,m-l这段都是未提交的,所以redo从m开始,undo的结束点是l...这样理解是对的吗?
nanjing_2013nanjing_2013系统架构师北京卓望
2012-02-23 16:13
txn是什么咚咚???
xiewenpengxiewenpeng数据库开发工程师河南众品
2012-02-23 09:09
田强,真强
weiruan85weiruan85数据库管理员ibm
2011-12-22 19:01
wp28556259: 田老师,有没有可能L>M呢?没有提交的东西会写到BUFFER里吗?他们的LSN和PAGE LSN完全对应吗
谢谢,搞明白了,有commit的还没有写到磁盘,所以需要redo .

2011-12-22 18:33
wp28556259: 田老师,有没有可能L>M呢?没有提交的东西会写到BUFFER里吗?他们的LSN和PAGE LSN完全对应吗
当然有可能。
wp28556259wp28556259软件架构设计师CMBC
2011-12-22 16:08
田老师,有没有可能L>M呢?没有提交的东西会写到BUFFER里吗?他们的LSN和PAGE LSN完全对应吗

2011-12-22 15:41
weiruan85: 学习了,l<m 有可能有已经提交的事务,因此还是需要undo的,redo就不需要了
还是不对,请重新体会lowtran,minbuff的定义。redo是一定有的。
weiruan85weiruan85数据库管理员ibm
2011-12-20 10:06
田强: 这样理解是不对的。又添加了些内容
学习了,l<m 有可能有已经提交的事务,因此还是需要undo的,redo就不需要了
wp28556259wp28556259软件架构设计师CMBC
2011-12-20 09:54
谢谢分享~

2011-12-19 23:19
weiruan85: if l>m   m-l 之间是已经提交的,需要重做,l之后的时未提交的,需要undo
if l<m   都是未提交的,忽略

:)
这样理解是不对的。又添加了些内容
weiruan85weiruan85数据库管理员ibm
2011-12-19 18:08
IBMER_JAY: 跟田老师在ST聊过,受益匪浅
st 能否私下share下
IBMER_JAYIBMER_JAY数据库管理员IBM
2011-12-19 15:28
跟田老师在ST聊过,受益匪浅
xxzmxxxxzmxx软件开发工程师招行软件中心
2011-12-18 22:44
或者说如何去产生这些信息呢?请教。
xxzmxxxxzmxx软件开发工程师招行软件中心
2011-12-18 22:44
好文,这个东西我目前都还没接触过?是如何看到的呢
weiruan85weiruan85数据库管理员ibm
2011-12-18 20:57
写的真好,:)
weiruan85weiruan85数据库管理员ibm
2011-12-18 20:56
if l>m   m-l 之间是已经提交的,需要重做,l之后的时未提交的,需要undo
if l<m   都是未提交的,忽略

:)
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广