PostgreSQL日志中vacuum清理表产生WAL使用记录的原因是什么?
PostgreSQL VACUUM操作访问WAL的原因
你给出的PostgreSQL VACUUM运行统计日志如下:
pages: 0 removed, 1640 remain, 0 skipped due to pins, 0 skipped frozen tuples: 0 removed, 99960 remain, 0 are dead but not yet removable, oldest xmin: 825 index scan not needed: 0 pages from table (0.00% of total) had 0 dead item identifiers removed avg read rate: 8.878 MB/s, avg write rate: 0.000 MB/s buffer usage: 48 hits, 1 misses, 0 dirtied WAL usage: 1 records, 0 full page images, 229 bytes system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
日志中WAL usage项记录了本次清理操作产生的WAL日志量,VACUUM需要写入WAL的核心原因如下:
- 遵循PostgreSQL预写日志的基础规则:所有对数据页的修改都必须先写WAL再落盘,确保数据库崩溃后可以通过WAL恢复到一致状态。VACUUM清理过程中对表数据页、索引页的修改,比如标记死元组占用空间为可复用、移除无用的行指针,都属于数据变更,必须记录WAL保证修改的持久性。
- 元信息更新也需要记录WAL:就算本次VACUUM没有实际清理死元组,就像示例日志中
tuples: 0 removed的情况,VACUUM也可能会更新页面的可见性映射(用来加速索引扫描和后续VACUUM执行)、冻结旧事务ID、更新表的统计元数据,这类元数据页的修改同样需要生成WAL记录,示例日志中的1条WAL记录大概率就是这类元信息更新产生的。 - 保证主备数据一致:如果数据库配置了流复制或WAL归档,VACUUM产生的WAL记录会同步到备库、归档存储,确保备库上的表也同步完成清理动作,避免主备实例的数据状态不一致。
内容的提问来源于stack exchange,提问作者Fabrice Chapuis
相关产品推荐
相关产品推荐

