您链接到的 WAL 设计文档提供了一个线索:
对数据文件的所有更改都记录在 WAL 中(在 InnoDB 中称为重做日志)。
这意味着 WAL 和重做日志是同一日志的两个不同术语。没有区别。
日志缓冲区是 RAM 中的分配。所有对重做日志的写入都首先保存在日志缓冲区中,因为在 RAM 中保存一些数据非常快。事务可以由影响许多单独行的许多更改组成,并且为这些行中的每一行写入磁盘将太慢。因此,对重做日志的更改首先保存在日志缓冲区中。定期将日志缓冲区中的一组更改保存到磁盘中的重做日志中。这发生在:
- 你提交了一笔交易
- 日志缓冲区已满(日志缓冲区大小固定)
- 无论日志缓冲区是否已满,每 1 秒
双写缓冲区的用途完全不同。它实际上是磁盘上 InnoDB 表空间的一部分,而不是 RAM(我认为术语“缓冲区”用于存储在 RAM 和磁盘中是令人困惑的)。
双写缓冲区的目的是防止部分页面写入导致数据损坏,同时将修改后的页面从 innodb 缓冲池复制到表空间。也就是说,如果 MySQL 服务器在 InnoDB 将给定页面写入磁盘时崩溃,它可能会部分覆盖磁盘上的页面。即使使用重做日志,也无法恢复此页面。
因此 InnoDB 首先将每个页面写入表空间的一个小子集,称为双写缓冲区。一旦它完成了该页面的写入,它就可以再次将该页面保存到表空间中的正确页面。如果这部分失败,没关系,因为该页面也已写入双写缓冲区。一旦页面被保存到表空间中的正确位置,就不需要双写缓冲区中该页面的副本,并且可以在下一次从缓冲池中刷新页面时覆盖它。