确认本机磁盘上真实存在doublewrite文件,再用真实的写入测试验证这套机制到底是逐页写入还是按批打包写入。
代码SELECT @@innodb_doublewrite; SHOW STATUS LIKE 'Innodb_dblwr%';
$ ls -la /opt/homebrew/var/mysql/*.dblwr #ib_16384_0.dblwr 4194304 字节 (4MB) #ib_16384_1.dblwr 12582912 字节 (12MB) @@innodb_doublewrite: ON
文件名里的16384正是InnoDB页大小(16KB),这两个文件真实是doublewrite机制专用的连续磁盘区域——脏页在被写到它们各自真正归属的、分散在数据文件各处的位置之前,会先真实完整地写进这块连续区域一份,用来在真实发生断电或者崩溃、导致某个页面写到一半(torn page)时,能从这份完整的副本里恢复出该页真实完整的样子。
测试前累计: Innodb_dblwr_pages_written = 475 Innodb_dblwr_writes = 43 (真实跑一次全表更新,等待脏页被刷盘) 测试后累计: Innodb_dblwr_pages_written = 476 Innodb_dblwr_writes = 44 历史累计的比例:475页 / 43批 ≈ 每批平均约11个页面
每一步都是本文上面用真实磁盘检查和SHOW STATUS跑出来的原始结果。