关系型数据库预写日志
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` 能大幅提升写吞吐,代价是崩溃可能丢最后几百毫秒的事务。