[不懂就问] MySQL Redo log 的相关问题

2022-08-30 16:18:16 +08:00
 wuxi889

众所周知,当每次刷盘 redo log 记录到日志文件组中,write pos 位置就会后移更新。 每次 MySQL 加载日志文件组恢复数据时,会清空加载过的 redo log 记录,并把 checkpoint 后移更新。 write pos 和 checkpoint 之间的还空着的部分可以用来写入新的 redo log 记录。

如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录,MySQL 得停下来,把 checkpoint 推进一下,清空一些记录。

问题来了:如果 write pos 追上 checkpoint 时,新的记录无法进入需要等待 checkpoint 推进,那么此时 MySQL 宕机了,是不是说此时正在等待进入 write pos 的记录就会消失?

1330 次点击
所在节点    MySQL
8 条回复
xilou31
2022-08-30 16:24:40 +08:00
确实会消失,但是在客户端的视角看来,这次写操作根本没有完成,是需要在客户端来进行处理的。
wuxi889
2022-08-30 16:36:59 +08:00
@xilou31 但是对于客户端来说,缓存池中已经更新了数据,是不是意味着已经得到了更新成功的反馈,而 redo log 没有写入的数据之后会与缓存更新成功的反馈有差异?
xilou31
2022-08-30 16:50:40 +08:00
应该是写入 Redo Log 和 binlog 后,才能收到更新成功的反馈吧。
wuxi889
2022-08-30 16:54:14 +08:00
@xilou31 哦哦,好的谢谢,这里的流程上没有弄清楚
hushulin
2022-08-30 16:54:19 +08:00
WAL, 日志先行, 写入 log 才有返回
hushulin
2022-08-30 16:59:21 +08:00
MySQL 的 redo log 很奇妙,完全是个黑盒。稳定运行三个月后,突然某一天 redo log write 每秒达到 4000+ (平时也就是 10 左右),fsync 每秒达到 600+(平时 1 左右)。当时应用程序 io. cpu. 毫无变化。排查未果后认定为 mysql 抽风。
7911364440
2022-08-30 17:27:37 +08:00
写完日志才会给客户端响应成功
wuxi889
2022-08-30 17:56:17 +08:00
@hushulin
@7911364440

好的,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876500

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX