我正在学习MySQL架构。我想出了以下例子:

有四个概念我不太明白:
我从许多文档中看到,预写日志(WAL)是数据库持久性的一种机制.MySQL WAL设计 维基百科
与上面的映像一样,当将数据从内存缓冲池刷新到磁盘时,有两种类型的缓冲区:双写缓冲区和日志缓冲区。为什么我们需要两个缓冲区,它们与WAL有什么关系?
最后但并非最不重要的是,重做日志和WAL之间有什么区别。我认为,在发生错误时,WAL可以帮助数据库恢复(例如:停电、服务器崩溃.)。我们需要和WAL一起重做日志吗?
发布于 2019-06-30 15:25:06
您链接到的WAL设计文档提供了一个线索:
对数据文件的所有更改都记录在WAL中(在InnoDB中称为重做日志)。
这意味着WAL和redo日志是同一日志的两个不同的术语。没有什么不同。
日志缓冲区是RAM中的分配。所有对重做日志的写入都首先保存在日志缓冲区中,因为将一些数据保存在RAM中非常快。一个事务可以由影响到多个单独行的许多更改进行,并且为这些行中的每一行写入磁盘的速度太慢。因此,在返回重做日志的过程中,首先将更改保存在日志缓冲区中。定期将日志缓冲区中的一组更改保存到重做日志中的磁盘中。这种情况发生在以下情况:
双写缓冲区有一个完全不同的用途。它实际上是磁盘上的InnoDB表空间的一部分,而不是内存中的一个部分(我认为“缓冲器”一词用于内存和磁盘中的存储是令人困惑的)。
双写缓冲区的目的是防止部分页写入造成的数据损坏,而修改后的页则从innodb缓冲池复制到表空间。也就是说,如果MySQL服务器在InnoDB将给定页写入磁盘时崩溃,它可能会部分覆盖磁盘上的页。即使使用重做日志,也无法恢复此页面。
因此,InnoDB首先将每个页面写入表空间的一个小子集,称为双写缓冲区。一旦完成了该页的编写,它就可以再次将该页保存到表空间中的适当页中。如果这部分失败了,就可以了,因为页面也被写入了双写缓冲区。一旦将页面保存到表空间中的正确位置,就不需要双写缓冲区中该页的副本,下次从缓冲池刷新页面时可以覆盖该副本。
https://stackoverflow.com/questions/56823591
复制相似问题