MySQL

redo log 的 checkpoint 什么时候往前走

redo log 是一圈循环写的文件:

  • write pos:当前写到哪,一边写一边往后挪,写到末尾绕回开头。
  • checkpoint:当前可以擦到哪。

我原本以为事务提交时 checkpoint 就会往前推。其实不是:它对应的脏页真正写进数据文件之后,checkpoint 才能往前推,在那之前这段 redo 还是崩溃恢复要用的。

平时后台线程慢慢刷脏页、慢慢推 checkpoint。如果更新太猛,write pos 追上了 checkpoint,redo 写满,新的更新就得停下来,先刷脏页把 checkpoint 推走。这时数据库会出现明显的卡顿。

顺带,redo 里记的是物理修改(哪个表空间、哪一页、页内哪个位置、改成什么字节),里面没有 SQL。

esc