首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL InnoDB: WAL、双写缓冲区、日志缓冲区、重做日志之间的区别

MySQL InnoDB: WAL、双写缓冲区、日志缓冲区、重做日志之间的区别
EN

Stack Overflow用户
提问于 2019-06-30 08:52:38
回答 1查看 3.9K关注 0票数 6

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

有四个概念我不太明白:

  • 双写缓冲器
  • 日志缓冲器
  • 预写日志
  • 重做日志

我从许多文档中看到,预写日志(WAL)是数据库持久性的一种机制.MySQL WAL设计 维基百科

与上面的映像一样,当将数据从内存缓冲池刷新到磁盘时,有两种类型的缓冲区:双写缓冲区和日志缓冲区。为什么我们需要两个缓冲区,它们与WAL有什么关系?

最后但并非最不重要的是,重做日志和WAL之间有什么区别。我认为,在发生错误时,WAL可以帮助数据库恢复(例如:停电、服务器崩溃.)。我们需要和WAL一起重做日志吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-30 15:25:06

您链接到的WAL设计文档提供了一个线索:

对数据文件的所有更改都记录在WAL中(在InnoDB中称为重做日志)。

这意味着WAL和redo日志是同一日志的两个不同的术语。没有什么不同。

日志缓冲区是RAM中的分配。所有对重做日志的写入都首先保存在日志缓冲区中,因为将一些数据保存在RAM中非常快。一个事务可以由影响到多个单独行的许多更改进行,并且为这些行中的每一行写入磁盘的速度太慢。因此,在返回重做日志的过程中,首先将更改保存在日志缓冲区中。定期将日志缓冲区中的一组更改保存到重做日志中的磁盘中。这种情况发生在以下情况:

  • 你提交了一个交易
  • 日志缓冲区已满(日志缓冲区有固定大小)
  • 每1秒,而不管日志缓冲区是否已满

双写缓冲区有一个完全不同的用途。它实际上是磁盘上的InnoDB表空间的一部分,而不是内存中的一个部分(我认为“缓冲器”一词用于内存和磁盘中的存储是令人困惑的)。

双写缓冲区的目的是防止部分页写入造成的数据损坏,而修改后的页则从innodb缓冲池复制到表空间。也就是说,如果MySQL服务器在InnoDB将给定页写入磁盘时崩溃,它可能会部分覆盖磁盘上的页。即使使用重做日志,也无法恢复此页面。

因此,InnoDB首先将每个页面写入表空间的一个小子集,称为双写缓冲区。一旦完成了该页的编写,它就可以再次将该页保存到表空间中的适当页中。如果这部分失败了,就可以了,因为页面也被写入了双写缓冲区。一旦将页面保存到表空间中的正确位置,就不需要双写缓冲区中该页的副本,下次从缓冲池刷新页面时可以覆盖该副本。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56823591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档