8

我有一个在表上运行的 autovacuum VACUUM ANALYZE查询,它总是需要几个小时,甚至几天才能完成。我知道 Postgres 偶尔会运行 autovacuum 作业来执行清理和维护任务,这是必要的。然而,大多数表只是有一个 VACUUM,而不是 VACUUM ANALYZE。

为什么这个特定的表需要进行真空分析,我该如何解决它需要这么长时间的问题?

另外,几天前我没有注意到这个真空分析查询正在运行。这是当我试图创建一个索引时,它过早地失败了,说它用完了打开的文件(或类似的东西)。这会有助于真空分析运行这么长时间吗?

4

2 回答 2

4

从 PG 9.1 升级到 PG 9.5 会导致出现许多表达到其 XID 冻结限制的情况。结果,正在运行的系统在许多表上运行 autovacuum 进程,其中许多表示“(以防止回绕)”。到目前为止,这是一个非常繁忙的数据库,所以我并不感到惊讶。

由于我不能强制 autovacuum 不执行此操作,而且这样做不是一个好主意,因此我重新配置了原本空闲的数据库以高活动率运行 autovacuum,因此它会更快地完成(希望如此),我们可以得到回到正题。

我在我的 postgres.conf 中临时设置了以下内容,它似乎工作得很好。真正得到 I/O 启动。我省略了优化 WAL 大小和事务的其他设置,因为这高度依赖于系统:

# TEMPORARY -- aggressive autovacuum
autovacuum_max_workers = 16           # max number of autovacuum subprocesses
autovacuum_vacuum_cost_delay = 4ms    # default vacuum cost delay for
                                      #     autovacuum, in milliseconds;
autovacuum_vacuum_cost_limit = 10000  # default vacuum cost limit for autovacuum

我停止并启动数据库服务器,然后使用 shell 调用监视发生的事务,如下所示:

watch -d -n 300 psql -c "select query from pg_stat_activity;"
于 2016-08-18T20:44:06.247 回答
2

我认为 VACUUM ANALYZE 是一个红鲱鱼。该表同时用于 VACUUM 和 ANALYZE,因此它正在执行 VACUUM ANALYZE,但我真的怀疑 ANALYZE 是否会导致问题。

我想知道“VACUUM(防止环绕)”是否已经完成,或者它是否在中途被中断,因此重新启动而没有取得真正的进展。对日志文件的良好检查应该有助于澄清这一点(以及帮助澄清关于用完打开文件的确切含义)。

此外,根据桌子的大小和基于成本的吸尘设置,您应该能够估计吸尘需要多长时间并比较实际需要多长时间。

此外,系统上的事务吞吐量与环绕问题非常相关。环绕真空应该非常少见,除非您的数据库非常活跃。

于 2013-08-09T22:24:23.557 回答