Pavel Borisov:Postgres 膨胀最小化

Pavel Borisov:Postgres 膨胀最小化

💡 原文英文,约1400词,阅读约需5分钟。
📝

内容提要

Postgres使用“堆”方法存储数据,每个表分为8Kb的页面。Vacuum过程释放页面上的空间并更新表的空闲空间图和可见性图。Vacuum可以自动或手动执行。为了释放文件系统空间,可以使用更积极的VACUUM FULL模式。可以调整自动清理参数来控制何时和多久自动清理运行。长时间运行的事务和锁可能会阻止自动清理成功。其他优化包括调整自动清理工作进程的数量和增加autovacuum_work_mem参数。Vacuum和自动清理是维护表和防止膨胀的有效方法。

🔎

延伸解读

VACUUM FULL 与 pg_repack 的权衡

VACUUM FULL 能重建表并释放文件系统空间,但需要排他锁,期间无法修改表,适合在低峰期执行。pg_repack 扩展提供类似效果,且不需要完全锁定,对在线业务更友好。选择时需权衡锁影响与操作复杂度。

自动清理未生效的常见原因

自动清理可能因长时间运行的事务或锁而无法成功。长事务会阻止旧行版本被标记为死行,导致膨胀;SHARE UPDATE EXCLUSIVE 锁也会阻碍 vacuum。可通过查询 pg_stat_activity 找到并取消空闲事务,或手动执行 VACUUM。

调整自动清理参数以应对大表

默认的 autovacuum_vacuum_scale_factor 为 20%,对大表可能过高,导致自动清理启动过晚。可针对大表降低该值,例如设为 0.05,使自动清理更频繁、每次运行时间更短。同时可增加 autovacuum_max_workers 和 autovacuum_work_mem 来提升清理效率。

监控膨胀与自动清理状态

通过 Supabase CLI 的 bloat 命令或查询 pg_stat_user_tables 中的 n_dead_tup 和活行数,可判断表是否膨胀。若死行数超过活行数两倍,可能自动清理未运行或未完成。检查 last_autovacuum 并开启日志有助于诊断。

❓

Q&A

Postgres中的Vacuum过程是如何工作的?

Vacuum过程会遍历所有表文件,寻找已完成事务更新或删除的行版本,并释放页面上的空间,同时更新表的空闲空间图和可见性图。

如何手动执行Vacuum以释放文件系统空间?

可以使用更积极的VACUUM FULL模式来重建表,从而释放文件系统空间,但这需要独占锁,不能在执行时修改表。

什么情况下会导致Postgres数据库膨胀?

长时间运行的事务和锁可能会阻止自动清理成功,从而导致数据库膨胀。

如何优化Postgres的自动清理过程?

可以通过增加autovacuum工作进程的数量和调整autovacuum_work_mem参数来优化自动清理过程。

如何检查数据库的膨胀情况?

可以通过Supabase CLI运行特定命令来检查数据库的膨胀情况,例如使用'supabase inspect db bloat'命令。

Vacuum和自动清理的主要作用是什么?

Vacuum和自动清理是维护表和防止膨胀的有效方法,能够释放空间并提高查询性能。

🏷️

标签

➡️

继续阅读