敲黑板:InnoDB的Double Write,你必须知道( 二 )
下面显示了一个由Double write进行恢复的情况:
090923 12:36:32 mysqld restarted090923 12:26:33 InnoDB: Database was not shut down normally!InnoDB: Starting crash recovery.InnoDB: Reading tablespace information from the .ibd files...InnoDB: Crash recovery may have faild for some .ibd files!InnoDB: Restoring possible half-written data pages from the doublewrite.InnoDB: buffer...
Double Write 的问题Double write buffer 它是在物理文件上的一个buffer, 其实也就是file , 所以它会导致系统有更多的fsync操作 , 而因为硬盘的fsync性能问题 , 所以也会影响到数据库的整体性能 。
Double write页是连续的 , 因此这个过程是顺序写的 , 开销并不是很大 。
在完成Double write页的写入后 , 再将Double write buffer中的页写入各个数据文件中 , 此时的写入则是离散的
总结
- 当commit 一个修改语句时 , 如果redo log有空闲区域 , 直接写redo log , 如果redo log没有空闲区域 , 那么需要把被覆盖的redo log对应的数据页刷新到data file 中 , 最后改pool buffer中的记录
- innodb的redo log 不会记录完整的一页数据 , 因为这样日志太大 , 它只会记录那次(sequence)如何操作了(update,insert)哪页(page)的哪行(row)
- 因为数据库使用的页(page , 默认16KB)大小和操作系统对磁盘的操作页(page , 默认4KB)不一样 , 当提交了一个页需要刷新到磁盘 , 会有多次IO ,此时刷了前面的8k时异常发生宕机 。 在系统恢复正常后 , 如果没有double write机制 , 此时数据库磁盘内的数据页已损坏 , 无法使用redo log进行恢复 。
- 如果有double write buffer , 会检查double writer的数据的完整性 , 如果不完整直接丢弃double write buffer内容 , 重新执行那条redo log , 如果double write buffer的数据是完整的 , 用double writer buffer的数据更新该数据页 , 跳过该redo log 。
出处:
- 苹果潜望式镜头敲定!或与三星合作,iPhone 14见
- 净利润|敲黑板!苏宁净利润大涨,双11狂补100亿就靠它?哪来的底气
- 升级|任正非正式宣布鸿蒙系统敲定名单,部分手机被淘汰无法升级
- 用实例给学生敲警钟!珠海召开“互联网+教育”主题活动
- 调整|正式敲定!华为任正非做出大调整
- 代码|软件行业正在变革:只输入流程图,不敲一行代码就实现后端开发
- 岩石|敲碎岩石 钻取样品 抱爪对接
- 长见识了|为什么黑客从不用鼠标,一直在敲键盘看完长见识了
- 小米米家液晶小黑板20英寸体验:更大画板,更方便的手写笔收纳
- 玩转MySQL:深入解析InnoDB引擎存储结构+特性分析