最近研究innodb的数据一致性,其中提到为了解决写磁盘的时候可能发生的页分裂,innodb使用了double write技术,因为redo log本身并不能恢复分裂的页
什么是页分裂(partial page write)
因为Innodb的数据页一般是16K,但是磁盘的页一般是4K,所以写一次磁盘数据,会有4次写磁盘的原子操作,在极端情况下就可能在磁盘写完前面4K后系统断点,此时4K是新数据,后面的12K是老数据,出现了数据被破坏的情况,这就叫做页分裂。
疑问
- 《MySQL技术内幕:InnoDB存储引擎(第2版》和《MySQL实战45讲》中都说redo log是物理日志,具有幂等性。那么innodb可以无视目标页的当前状态(是否分裂),都可以用物理的方式幂等恢复完整的页数据(物理操作一般是类似于SET操作)。为什么还需要额外使用double write技术呢?
- 如果redo log不是幂等的,那在redo log应用到一半的时候,系统崩溃,innodb又如何完成崩溃恢复呢?
答案
google了好久,遇到了有相同疑问的同学
因为redo是物理逻辑结合型的日志。物理到具体的哪个page,页内操作是逻辑的。这种方式既实现了物理日志带来的幂等性(以物理页为整体),又拥有逻辑日志带来的轻量性(物理页内修改是逻辑日志)。所以物理页内修改不是幂等的,需要使用double write技术来保证写入的成功