知识卡片
pageLSN实现日志重放的幂等性
内容
崩溃恢复重放Redo Log时,有些Page可能已刷盘成功,重放会否覆盖新数据为旧数据?InnoDB给每个Page记pageLSN,代表最后一次刷盘的日志编号;重放某条日志时若其LSN小于等于当前pageLSN就跳过。这与TCP用递增seq number判重复是同一原理——单调递增编号能让”操作是否已生效”被精确判断。发散:”单调递增编号+只接受更新操作”是所有幂等设计的通用骨架。
参考来源
- 位置:第6章《数据库》6.5.7节「ARIES恢复算法」pageLSN相关小节(源文件:_epub-src/text/part0031.html)
- 结论依据:原文明确说明磁盘上每个Page有pageLSN字段记录最后一次修改它的日志LSN,重放日志时若日志LSN小于等于pageLSN就跳过该条日志不修改,直接支持卡片对pageLSN通过单调递增编号实现日志重放幂等性的论述。
- 原始内容:"磁盘上的每个Page有一个关键字段——pageLSN。这个LSN记录的是这个Page刷盘时最后一次修改它的日志对应的LSN。如果重放日志的时候,日志的LSN<=pageLSN,则不修改日志对应的Page,略过此条日志。"