我正在学习MySQL体系结构。我想出了以下插图:
有4个我不太了解的概念:
我从许多文档中读取,预写日志(WAL)是数据库持久性的一种机制。 MySQL WAL Design Wikipedia WAL
如上图所示,将数据从内存缓冲池刷新到磁盘时,有两种类型的缓冲区:双写缓冲区和日志缓冲区。为什么我们需要2个缓冲区,它们与WAL有什么关系?
最后但并非最不重要的一点是,重做日志和WAL之间有什么区别。我认为WAL可以在发生错误时(例如:停电,服务器崩溃...)帮助数据库恢复。与WAL一起需要什么重做日志?
答案 0 :(得分:2)
您链接到的WAL设计文档提供了一个线索:
对数据文件的所有更改都记录在WAL中(在InnoDB中称为重做日志)。
这意味着WAL和重做日志是同一日志的两个不同术语。没有区别。
日志缓冲区是RAM中的分配。首先,所有对重做日志的写操作都保存在日志缓冲区中,因为将某些数据保存在RAM中非常快。事务可以由影响许多单独行的许多更改组成,并且为这些行中的每一行写入磁盘都太慢。因此,它们对重做日志的更改将首先保存在日志缓冲区中。定期将日志缓冲区中的一组更改保存到磁盘中的重做日志中。发生这种情况的时间是:
双重写入缓冲区的用途完全不同。实际上,它实际上是磁盘上InnoDB表空间的一部分,而不是RAM中的一部分(我认为将术语“缓冲区”用于在RAM和磁盘中的存储是令人困惑的。)
双重写入缓冲区的目的是防止修改的页面从innodb缓冲池复制到表空间时,由于部分页面写入而导致数据损坏。也就是说,如果在InnoDB将给定页面写入磁盘时MySQL服务器崩溃,它可能会部分覆盖磁盘上的页面。即使使用重做日志,也无法恢复此页面。
因此,InnoDB首先将每个页面写入表空间的一小部分,称为双写缓冲区。一旦完成该页面的编写,它便可以将该页面再次保存到表空间中的正确页面。如果此操作部分失败,则可以,因为该页面也已写入了doublewrite缓冲区。将页面保存到表空间中的正确位置后,就不再需要该页面在doublewrite缓冲区中的副本,并且在下次从缓冲池中刷新页面时可以将其覆盖。