Azure PostgreSQL服务TOAST表Autovacuum未运行及手动VACUUM可行性咨询
结论
你完全可以对TOAST表手动执行VACUUM操作,这是解决你当前场景下空间异常占用的标准方案。
问题原因
PostgreSQL中基表和其对应的TOAST表的autovacuum触发规则是相互独立的。你删除300GB旧数据时,关联的TOAST数据也会被标记为死亡元组,但如果TOAST表的死亡元组占比没有达到autovacuum默认的触发阈值(默认是死亡元组占表总大小20%),autovacuum就不会主动对TOAST表执行清理,这也是你基表死亡元组已经清0,但整体数据库空间仍持续增长的核心原因。
操作步骤
- 先查询基表对应的TOAST表名,执行以下SQL,将
你的基表名替换为实际的业务表名即可:
SELECT relname AS toast_table_name FROM pg_class WHERE oid = (SELECT reltoastrelid FROM pg_class WHERE relname = '你的基表名');
- 按需执行VACUUM清理:
- 仅需要将死亡元组占用的空间回收给PostgreSQL内部复用,不需要归还操作系统:
VACUUM VERBOSE 上一步查询得到的TOAST表名;
- 需要将释放的空间归还操作系统,直接降低磁盘占用:
-- 不会锁表,建议业务低峰期执行即可 VACUUM (VERBOSE, ANALYZE) 上一步查询得到的TOAST表名; -- 可接受短时间TOAST表锁、需要更快完成空间回收时使用 VACUUM FULL VERBOSE 上一步查询得到的TOAST表名;
后续优化建议
为了避免后续再出现同类问题,你可以调低该TOAST表的autovacuum触发阈值,比如设置为死亡元组占比达到5%就触发清理,配置语句如下:
ALTER TABLE 你的TOAST表名 SET (autovacuum_vacuum_scale_factor = 0.05);
内容的提问来源于stack exchange,提问作者remo
相关产品推荐
相关产品推荐

