mysql二次写缓存

,二次写缓存是innodb在刷新buffer pool中的数据到正确的位置之前,把页写到了系统表空间的存储上。只有在写入到二次写缓存后,innodb才会将页写入到合适的位置,如果操作系统或mysqld进程在写页的中途crash了,那么innodb在二次写缓存中能找到一个好的拷贝用来恢复。5.6的默认页大小是16k,现在很多的磁盘的块大小是4k,一次io的大小是io_chunk_size的大小,跟磁盘的块大小没有关系,也就是说一次io可以是4k,可以是8k等,这种情况下,一次innodb页可能需要几次io操作,这种情况下一个页在写入的中途,可能发生错误。如果一次io能写入16k一个页的大小,那么就不会有这个问题(个人理解)。
尽管数据要被写2次,但是io消耗并不是要额外的2倍,数据在写入二次写缓存的时候是大的连续的chunk,使用fsync()调用,可以使用innodb_doublewrite设置成0来禁用。
oracle中的redo是使用的逻辑和物理结合的方式记录的,所以能用redo来直接恢复块,mysql中的只是记录的逻辑的方式,所以无法使用redo来直接恢复块。
oracle中也会有数据块出现不一致的情况,oracle处理的方式是冻结数据块在redo,使用redo前滚重构块。oracle在是通过对比数据块中的开始scn+seq和结尾的版本号进行对比,如果不一致说明数据块是不一致的,Checksums allow Oracle to detect corruption caused by underlying disks, storage systems, or I/O systems.

mariadb对fusionio的支持,可以配置原子写,就不需要二次写缓存了:
https://www.kancloud.cn/taobaomysql/monthly/67113

在刷脏块的时候,是先刷到二次写缓存,那么脏块很多的情况下,要调整响应的二次写缓存的大小,二次写缓存的监控
show global status like ‘innodb_dblwr%’;

如果发生了这种断块的情况,需要恢复的时候,innodb先是在共享表空间中取出页,然后进行的恢复。

参数skip_innodb_doublewrite控制着二次写缓存是否生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值