最近研究innodb的数据一致性,其中提到为了解决写磁盘的时候可能发生的页分裂,innodb使用了double write技术,因为redo log本身并不能恢复分裂的页
因为Innodb的数据页一般是16K,但是磁盘的页一般是4K,所以写一次磁盘数据,会有4次写磁盘的原子操作,在极端情况下就可能在磁盘写完前面4K后系统断点,此时4K是新数据,后面的12K是老数据,出现了数据被破坏的情况,这就叫做页分裂。
google了好久,遇到了有相同疑问的同学
因为redo是物理逻辑结合型的日志。物理到具体的哪个page,页里面是逻辑的。这种方式既实现了物理日志带来的幂等性(以物理页为整体),又拥有逻辑日志带来的轻量性(物理页内修改是逻辑日志)。所以物理页内修改不是幂等的,需要使用double write技术来保证写入的成功