什么时块裂呢?
这就涉及到OS(操作系统)的原子写的大小,一般情况下OS原子写是4K,硬盘一个扇区是512字节,4K需要写8个扇区。
假如写了4个扇区发生了断电,或者其他的意外,那么不就是丢失了另外4个扇区的数据吗?是另外2K字节没有写入!
这是OS和磁盘之间的故事,属于硬件工程师或者叫存储工程师操心的事,不过一般采用UPS或者是RAID卡上的电池来保证。
RAID卡10模式采用写两份来保证,RAID5 采用奇偶校验方式。
那么DATABASE(数据库) 与OS 这两者咋办呢?DATABASE MYSQL是16K一个数据页,ORACLE是8K一个块。远比OS4K原子写要大得多。
如何保证断电的时候数据页只写入了一半?
要么靠硬件来保证,要么靠软件机制来保证!
MYSQL 双写机制
当修改页的事务提交后,通过MEMCPY把该脏页复制到DOUBLE WRITE BUFFER中,DWB不是内存而是硬盘一个区域
它在共享表空间IBDATA分配的连续空间。大小2MB,分两个部分每个部分1MB,根据16K可以分128个页。
DWB 写满后或者刷脏行为,则把DWB写入数据文件中。
当断电时候,MYSQL会检查数据文件的页的CHECKSUM有问题,则从DWB拷贝完整的页来覆盖,然后再根据REDO恢复。