我找到了一百万个关于如何设置 Autovacuum 配置设置的示例,但似乎无法找到如何列出当前配置。
Postgres 9.1 是我最感兴趣的版本。
我试图让 PostgreSQL 积极地自动清空我的数据库。我目前已按如下方式配置自动真空吸尘器:
我注意到自动真空仅在数据库未加载时才会启动,因此我遇到死元组比活元组多得多的情况。有关示例,请参阅随附的屏幕截图。其中一张表有 23 个活动元组,但有 16845 个死元组等待真空。这太疯狂了!

当测试运行完成并且数据库服务器空闲时,自动真空开始,这不是我想要的,因为我希望自动真空在死元组数量超过 20% 活元组 + 50 时启动,因为数据库已经配置。服务器空闲时的自动真空对我来说是无用的,因为生产服务器预计会在持续时间内达到 1000 次更新/秒,这就是为什么即使服务器负载不足我也需要自动真空运行。
有什么我想念的吗?如何在服务器负载较重时强制运行自动吸尘器?
更新
这可能是一个锁定问题吗?有问题的表是通过插入后触发器填充的汇总表。这些表以 SHARE ROW EXCLUSIVE 模式锁定,以防止并发写入同一行。
我有一张桌子占用了我们服务器上接近 90% 的高清空间。我决定删除几列以释放空间。但我需要将空间归还给操作系统。但是,问题是我不确定如果我运行 VACUUM FULL 并且没有足够的可用空间来制作表的副本会发生什么。
我知道不应使用 VACUUM FULL,但我认为这是这种情况下的最佳选择。
任何想法,将不胜感激。
我正在使用 PostgreSQL 9.0.6
我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE仍然推荐预定,还是 autovacuum 足以满足所有需求?
如果答案是“视情况而定”,那么:
我问是因为预定的时间VACUUM ANALYZE会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres不会报告数据库有任何显着膨胀,所以这不是真正的问题。
从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE吗?
VACUUM通常不会将磁盘空间返回给操作系统,除非在某些特殊情况下。
从文档:
VACUUM删除表和索引中的死行版本并标记可用空间以供将来重用的标准形式。但是,它不会将空间返回给操作系统,除非在表末尾的一个或多个页面完全空闲并且可以轻松获得排他表锁的特殊情况下。相比之下,VACUUM FULL通过编写一个没有死空间的完整新版本的表文件来主动压缩表。这最大限度地减少了表的大小,但可能需要很长时间。它还需要额外的磁盘空间用于表的新副本,直到操作完成。
问题是:如何实现这个数据库状态one or more pages at the end of a table become entirely free?这可以通过 完成VACUUM FULL,但我没有足够的空间来实现它。那么还有没有其他可能呢?
我管理一个大型(数百个演出)数据库,其中包含具有各种角色的表,其中一些包含数百万条记录。一些表只接收大量插入和删除,其他一些插入和大量更新。
数据库在 Debian 6.0 amd64 系统上的 PostgreSQL 8.4 上运行,具有 16 GB 的 RAM。
问题有时是桌子上的 autovacuum 过程,需要很长时间(几天)才能完成。我希望能够粗略地判断一个特定的vacuum 命令需要多长时间,以便能够决定是否取消它。此外,如果有 postgres 真空操作的进度指示器,那将非常有帮助。
编辑:
我不是在寻找防弹解决方案。对死元组的数量或必要的 I/O 字节数的粗略提示就足以决定。不知道什么时候VACUUM结束真的很烦人,无论如何。
我已经看到pg_catalog.pg_stat_all_tables有一个列表示死元组的数量。所以有可能有一个估计,即使这意味着一个人必须ANALYZE在之前的桌子上。在另一方面,autovacuum_vacuum_threshold与autovacuum_vacuum_scale_factor设置单独证明Postgres的本身知道一些有关变化对表的数量,并可能将其放在了DBA手中了。
我不确定要运行什么查询,因为当我运行时VACUUM VERBOSE,我看到不仅表,而且它们的索引也在被处理。
有人可以解释VACUUMPostgreSQL 中这些类型之间的区别吗?
我阅读了文档,但它只是说FULL锁定表并FREEZE“冻结”元组。我认为那是一样的。我错了吗?
在 2015 年的 re:Invent 演讲中,AWS 提到真空不仅应该在更新或删除之后运行,而且还应该在插入之后运行。这是谈话的相关部分:
http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s
据说即使块只收到插入,也必须对块进行一些清理,并且可以在第一次选择块时(减慢读取速度)或在真空期间进行清理。这是真的吗?如果是这样,究竟必须进行哪些清理工作?
我使用的软件,这使得一个很大的PostgreSQL数据库(有一个表中有一个百万行)和开发商说我应该VACUUM和ANALYZE周期性。但是 PostgreSQL 数据库默认是autovacuum开启的。
我应该抽真空/分析吗?有什么好处?自动抽真空和手动抽真空有什么区别
例如,在 Pgadmin3 中,我有这个:

我有一个表,其中数据占用 200 GB 大小,其上的 6 个索引占用 180 GB 大小。它膨胀了 30%,所以我想回收它占用的不需要的空间。它聚集在job_id_idx 索引上。
那么要回收空间我需要使用cluster命令还是vacuum full命令?
这两个命令有什么区别?
是vacuum full为了通过一些列相同cluster的命令?
两个命令中是否都重新创建了索引?
在我的情况下,哪一个会更快?
PostgreSQL 数据库版本为 9.1
postgresql ×10
vacuum ×10
maintenance ×2
performance ×2
alter-table ×1
delete ×1
disk-space ×1
etl ×1