中间件速查手册
关系型数据库预写日志

WAL 是什么?

先写日志再改数据页,崩溃后靠它重放恢复

类比:先记账再动钱,账本在就不怕断电

提交时到底写了什么

事务提交时,PG 只保证 WAL 刷到磁盘(fsync),数据页仍是内存里的脏页。所以提交很快,即使此刻断电,重启时重放 WAL 就能把数据补回来。

这个机制和 Oracle 的 Redo、MySQL 的 redo log 是同一个思路:把随机写变成顺序写。

WAL 撑起了哪些能力

几乎所有高可用能力都建立在它上面。

  • 崩溃恢复:重放未落盘的事务
  • 流复制:主库把 WAL 发给备库,备库持续重放
  • PITR:全量备份 + WAL 归档,可以恢复到任意时间点
  • 逻辑复制:解析 WAL 得到行级变更(需要 wal_level = logical)

调优要点

`wal_level` 决定日志详细程度,复制场景要设成 replica 或 logical;`max_wal_size` 太小会导致频繁 checkpoint,写性能抖动;`synchronous_commit=off` 能大幅提升写吞吐,代价是崩溃可能丢最后几百毫秒的事务。

它出现在这些中间件里

相关概念