为什么mysql,PostgreSQL需要Double write buffer,而ORACLE和DB2不需要?

1.双写缓冲区 Double write buffer是什么?

MySQL的buffer一页的大小是16K,但是底层文件系统一页的大小是4K,换句话说,MySQL将一页buffer数据刷入磁盘,需要写4个文件系统里的页。而操作系统只能保证一个4K页的原子性,不能保证4个4K页的原子性。假如MySQL内page=1的页准备刷入磁盘,才刷了2个(p1和p2)到文件系统里的页,这个时候停电或者机器宕机,当机器恢复后,buffer的一页数据完整性已经遭到破坏,这时MySQL通过double write buffer来解决数据损坏。数据写入的时候先写到doublewrite空间,然后再写入到磁盘,如果发生写入了一个page一半的时候断电,恢复后会自动从doublewrite中恢复。

InnoDB为什么知道什么时候页面损坏了?

因为每个页面在末尾都有校验值(Checksum)。校验值是最后写到页面的东西,所以如果页面的内容跟校验值不匹配,说明这个页面是损坏的。因此,在恢复的时候,InnoDB只需要读取double write buffer中每个页面并且验证校验值。如果一个页面的校验值不对,就从它的原始位置读取这个页面。

为什么mysql已经有了redolog,还需要Double write buffer?

因为MYSQL的redo log本质上是逻辑日志,虽然记录哪个page的变化是物理日志,但是对页内容的记录确实逻辑日志,比如insert一行数据,就会记录插入了一行数据,这一行记录是什么,然后page header的内容再做变化,比如记录的行数+1,但是如果这个是坏页了,你redo log插入一行,你能确保没有插入重复吗,即便没有插入重复,page header里记录的行数+1能保证准确吗?当然Page header会记录LSN号,如果redo的LSN号大于page的LSN号就跳过redo,但是坏页的page LSN号能保证准确吗?

而ORACLE和DB2不需要Double write buffer?

因为是完全的物理日志,page里的每一个位置的变化都会记录在redo log里。redo log能够保证数据的准确性。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值