p {
text-indent:28px;
}
记得刚开始看InnoDB文档的时候,Double Write一节(其实只有一小段)就让我很困惑。无奈当时内力太浅,纠缠了很久也没弄明白。时隔几个月,重新来整理一下。
涉及到的概念:Buffer Pool简称BP,Dirty Page,Log file,Flush,innodb tablespace。
1. 什么是Double Write
在InnoDB将BP中的Dirty Page刷(flush)到磁盘上时,首先会将Page刷到InnoDB tablespace的一个区域中,我们称该区域为Double write Buffer。在向Double write Buffer写入成功后,再择机将数据拷贝到正在的数据文件对应的位置。
咋一看,这个过程有些多余
2. 为什么需要Double Write
InnoDB中有记录(Row)被更新时,先将其在Buffer Pool(简称BP)中的page更新,并将这次更新记录到Log file中,这时候BP中的该page就是被标记为Dirty。在适当的时候(BP不够、系统闲置等),这些Dirty Page会被flush到磁盘上。
试想,在某个Dirty Page(一般是16K)flush的过程中,发生了系统断电(或者OS崩溃),16K的数据只有8K被写到磁盘上,这种现象被称为(partial page writes、torn pages、fractured writes)。一旦partial page writes发生,那么在InnoDB恢复时就很尴尬:在InnoDB的Log file中虽然知道这个数据页被修改了,但是却无法知道这个页被修改到什么程度,和这个页面相关的redo也就无法应用了。
举个例子:在InnoDB的log file中有如下Log:
Log sequence number 0 4285149977
Log sequence number 0 4287355447
Log sequence number 0 4289260680
Log sequence number 0 4291279900
Log sequence number 0 4293359020
其中第1、3个Log修改了该page,但是在断电时,BP中该page只被flush了一部分。那么InnoDB是无法决定上面的Log是否应该被应用的。这时,数据就出现了不一致。
所以,Log file的有效应用,前提是InnoDB的数据文件中的Page是一致的。
简而言之,Double …
转载请注明:爱开源 » InnoDB Double write