Sybil Asked: 2017-04-23 00:05:07 +0800 CST2017-04-23 00:05:07 +0800 CST 2017-04-23 00:05:07 +0800 CST 什么是 InnoDB 页面校验和? 772 InnoDBPage checksum究竟是什么?是否Page checksum只在写入或读取页面/块时检测底层存储的问题? mysql innodb 1 个回答 Voted Best Answer Rick James 2017-04-23T05:42:15+08:002017-04-23T05:42:15+08:00 (我想这就是你要问的。) InnoDB“块”是 16KB。但是大多数磁盘子系统都以较小的单位工作——4KB 或 512 字节。为了使 InnoDB 数据保持完整,磁盘需要将所有 16KB 作为一个单元写入——要么全部写入,要么不写入。可能发生的情况是,16KB 的碎片一个接一个地写,中途断电。这会导致“撕裂页面”(“页面”指的是 16KB 块)。 为了从损坏的页面中恢复,InnoDB 做了两件事。它对每个块进行校验和以发现它,并使用“双写”进行恢复。块(或至少某些关键块)被写入两次 - 写入某个相对恒定的位置,然后写入磁盘上的所需位置(在数据或索引中)。 从崩溃中恢复时,检查“双写缓冲区”以查看它是否导致“撕裂页面”;在这种情况下,它会被修复。 顾名思义,双写成本很高。(我没有关于成本的指标;我怀疑成本在很大程度上取决于 HDD 与 SSD 和 RAID 控制器。)关闭它是获得更快速度的一种方法,但有风险。FusionIO 是(已被收购)唯一保证 16KB 原子写入的驱动器制造商;我希望其他人已经添加了这个功能。 具有电池备份写缓存的 RAID 应该使双写几乎为零成本。 不同的校验和... Percona 工具包对数据使用“校验和”。由于行在 Master 和 Slave 之间的布局不一定相同,因此对文件进行校验和对于查看表是否匹配没有用。我怀疑它涉及以可重复的顺序读取行,并对每一行或每一行行进行校验和。 “rsync”做类似的事情,但在文件级别。
(我想这就是你要问的。)
InnoDB“块”是 16KB。但是大多数磁盘子系统都以较小的单位工作——4KB 或 512 字节。为了使 InnoDB 数据保持完整,磁盘需要将所有 16KB 作为一个单元写入——要么全部写入,要么不写入。可能发生的情况是,16KB 的碎片一个接一个地写,中途断电。这会导致“撕裂页面”(“页面”指的是 16KB 块)。
为了从损坏的页面中恢复,InnoDB 做了两件事。它对每个块进行校验和以发现它,并使用“双写”进行恢复。块(或至少某些关键块)被写入两次 - 写入某个相对恒定的位置,然后写入磁盘上的所需位置(在数据或索引中)。
从崩溃中恢复时,检查“双写缓冲区”以查看它是否导致“撕裂页面”;在这种情况下,它会被修复。
顾名思义,双写成本很高。(我没有关于成本的指标;我怀疑成本在很大程度上取决于 HDD 与 SSD 和 RAID 控制器。)关闭它是获得更快速度的一种方法,但有风险。FusionIO 是(已被收购)唯一保证 16KB 原子写入的驱动器制造商;我希望其他人已经添加了这个功能。
具有电池备份写缓存的 RAID 应该使双写几乎为零成本。
不同的校验和... Percona 工具包对数据使用“校验和”。由于行在 Master 和 Slave 之间的布局不一定相同,因此对文件进行校验和对于查看表是否匹配没有用。我怀疑它涉及以可重复的顺序读取行,并对每一行或每一行行进行校验和。
“rsync”做类似的事情,但在文件级别。