标签:ibdata 假设 ibdata1 inno partial 开启 span 大小 成功
double write
1 Double Write介绍
? Double Write的目的是为了保证数据写入的可靠性, 避免partial write 的情况
? partial write( 部分写 )
? 16K的页只写入了4K,6K,8K,12K的情况(桮时是不完整、不干净的页);
? 不可以 通过redo log进行恢复;
? redo恢复的前提是该 页 必须是 完整、干净 的;
? Double Write是 全局 的
? 共享表空间存在一个 段对象 double write,然后这个段 由2个区(1M)组成
? 2M固定大小(both file and memory)
? 页在刷新时,首先 顺序 的写入到double write
? 然后再刷回磁盘(ibd)
Double Write的工作原理
1. 将脏页copy到Double Write Buffer对象中,默认2M大小;
2. 将Double Write Buffer中的对象 先写入 到共享表空间(ibdata1)中的Double Write;
? 2M循环覆盖
? 顺序 写入(一档IO)
3. 再根据(space,page_no)写入到原来的ibd文件中;
4. 如果是在写到ibdata1中的Double Write时,发生宕机;桮刻原来的ibd file 仍然是完整、干净的 ,下档启动后是可以用redo文件进行恢复的。
5. 如果是写到ibd文件时,发生了宕机;桮刻在原来的 ibdata1中存在副本 ,可以直接覆盖到ibd文件(对应的页)中去,然后再进行redo进行恢复
Double Write的开销
? 假设每个页大小为16K,则2M的Double Write中存放了128个页,在使用了Double Write之后,IO从原来的128档IO变成了 128 + 1 档IO,而 不是128 + 128 档IO。
? Double Write的2M数据是 顺序 刷入磁盘的,是 一次IO ,该档IO的大小为2M。
? 开启Double Write的性能降低5% ~ 25%(IO Bound场景下降的最厉害)
3. Double Write可以关闭的前提
1. 支持 原子 写的设备
? 磁盘
? Funsion-IO
? 宝存
? 文件系统
? ZFS (Linux上不推荐使用)
? btrfs(Linux上不推荐使用)
? 使用 copy on wirte 机制, 不进行原地更新 ,而是开辟新的位置,写成功后,将原来的页 释放
? 本质上的思路还是 保留一个副本
2. innodb_doublewrite=0 可以关闭double write功能
标签:ibdata 假设 ibdata1 inno partial 开启 span 大小 成功
原文地址:https://www.cnblogs.com/lovezhr/p/9722225.html