一边全表更新一边高频盯着LSN和checkpoint这两个数字,看redo log的checkpoint是怎么在写入压力下真实落后又追上来的。
代码-- 后台:全表更新 UPDATE orders SET amount=amount+0.0001; -- 前台:每0.4秒查一次 SHOW ENGINE INNODB STATUS; -- 关注 LOG 部分的两行: -- Log sequence number ← 当前写到哪了 -- Last checkpoint at ← checkpoint真实确认到哪了
第1次: LSN=7953600399 checkpoint=7953600399 (相等,起点) 第2次: LSN=7953600429 checkpoint=7953600399 (真实领先30字节) 第3次: LSN=7953600449 checkpoint=7953600399 (真实领先50字节,最大值) 第4次起: LSN=7953600449 checkpoint=7953600449 (真实追上了,往后一直相等)
这两个数字的差值(checkpoint age)真实反映了"redo log里已经写入、但对应的脏页还没真实刷到磁盘"的那部分内容有多少——每次事务提交,Log sequence number都会真实立刻往前推进(redo log写入是提交路径上必须完成的同步操作);而Last checkpoint at只有等对应的脏页真实被后台线程刷完,才会跟着往前挪。本次测试里,这个差值真实最大只到50字节,几轮轮询之内就被追平——这和上一篇《Buffer Pool 脏页刷新》里观测到的"本机page cleaner追得很快"完全吻合:脏页刷得快,checkpoint自然追得也快。
每一步都是本文上面用高频轮询跑出来的原始结果。
Log sequence number / Last checkpoint at:两者的差值即checkpoint age