我在 Postgres 8.2.15 数据库中有一个表。该表膨胀到近 25GB,但在运行完真空和集群后,表的大小显着变小,远低于 1GB。几周后,它又回到了 3.5GB 并且还在攀升。
这不是一个经常删除的表,所以我不知道是什么导致了膨胀。
这仅发生在单个表上。我有一个单独的、结构相同的数据库,为相同的软件提供服务;该数据库中的表没有显示任何膨胀。
有任何想法吗?
您应该升级到更新的版本,最好是当前版本,至少有三个主要原因。
作为由@a_horse_with_no_name提到的自动清理机制在很多地方,因为8.2版本进行了改进。
你没有看到频繁的DELETE
s,所以表膨胀很可能来自@Milen 评论的UPDATE
s 。8.3 版引入了一个新功能,从根本上解决了这个问题:Heap-Only Tuples,我引用了发行说明:
Heap-Only Tuples (HOT) 加速了大多数
UPDATE
s 和DELETE
s 的空间重用(Pavan Deolasee,来自许多其他人的想法)
UPDATE
s 和DELETE
s 会留下死元组,失败的INSERT
s 也是如此。以前只能VACUUM
回收死元组占用的空间。使用 HOT 时,死元组空间可以在索引列未更改时INSERT
或未UPDATE
更改时 自动回收。这允许更一致的性能。此外,HOT 避免添加重复的索引条目。
强调我的。
PostgreSQL 8.2 已于2011 年 12 月终止。没有更多的安全更新。尽快升级到更新的版本。
要找出是否有很多UPDATE
s 启动,请使用配置参数log_statement
并检查您的数据库日志。也许一个错误配置应用程序或触发启动了很多更UPDATE
比你认为呢?
如果您SET
在会话中使用该参数,则它只会在此会话中更改:
SET log_statement = 'all';
Run Code Online (Sandbox Code Playgroud)
所以,宁可在你的postgresql.conf
:
log_statement = all
Run Code Online (Sandbox Code Playgroud)
并重新加载。例如与pg_ctl reload
. 但是不要忘记将其改回(并重新加载),否则您的日志文件可能会变得很大。然后检查日志文件以查看实际发生的情况。