Ano*_*ude 5 mysql innodb binlog
我想清楚地了解数据从触发查询到进入磁盘的确切方式。(我有一个粗略的想法,它会进入缓冲区,然后重做日志,然后是磁盘文件)但是如何使用 bin_log_cache 。
我已经用谷歌搜索了这个,但没有找到关于这个主题的太多内容。我希望在这个社区的人之间有一些解释。
谷歌的“peter zaitsev”缓冲双写文件系统提供了一些很好的参考(Peter Zaitsev 为 Percona 工作,Percona 是MySQL 领域的重量级人物。
\n\n其中,我挑选了 4 个特别感兴趣的[ 1 , 2 , 3 , 4 ]。
\n\n在第一篇参考文献中,Zaitsev 详细介绍了可能发生部分页写入的各种原因(标题为“现在让我们谈谈部分页写入”的部分)。
\n\nZaitsev 然后继续讨论双重写入如何工作的部分,但我认为可以在参考文献 2 中找到更好的解释 - 特别是这一点:
\n\n\n\n\n如果数据文件中发生部分页写入,如果数据文件中页的校验和与双写缓冲区中页的校验和不同,InnoDB / XtraDB 将检查恢复,从而知道页面是否损坏。如果损坏,恢复过程将使用双写缓冲区中存储的页面来恢复正确的数据。
\n\n如果双写缓冲区中发生部分写入,则原始页\n 不会受到影响,并且可以与重做日志一起使用来恢复数据。
\n
基本上,此行为由名为innodb_flush_log_at_trx_commit的系统参数控制。本节太大,无法在此处完整引用,我仅引用有关默认值的部分:(我强烈建议您完整阅读它以获得良好的概述)。
\n\n\n\n\n\xe2\x97\xbe 完全符合 ACID 需要默认值 1。使用此值,InnoDB 日志缓冲区的内容将在每次事务提交时写入日志文件,并将日志文件刷新到磁盘。
\n
然而,手册的这一部分还说:
\n\n\n\n\n控制提交操作的严格 ACID 合规性与重新安排并批量完成提交相关 I/O 操作时可能实现的更高性能之间的平衡。您可以通过更改默认值来获得更好的性能,但是您可能会在崩溃时丢失最多一秒的事务。
\n
用简单的英语来说,这意味着“一分钱一分货”——即数据完整性和性能之间需要取得平衡。尽管进行了高低搜索,但我无法找到比这更多的细节 - 除非你想翻遍代码(恐怕高于我的工资等级:-))。
\n\n您可以关闭参数innodb_doublewrite,然后这会导致另一个系统参数innodb_flush_method - 同样,这都是关于性能与数据完整性的。我的参考文献 3 和 4 对此进行了详细介绍 - 基本上,这两个参考文献中的争论是关于如果您有事务性文件系统,关闭双写是否是一个好主意。
\n\n共识似乎是,如果您使用 ZFS(以及其他可能深奥的文件系统/设备),则可以安全地关闭双写 - 假设 RAID 具有电池供电的磁盘缓存。参考文献 4 恕我直言,关于 ext4 是否安全的争论仍然存在 - 另请参阅此处。
\n\n下图很好地概述了MySQL 的 InnoDB 架构。
\n\n\n