为什么autovacuum:VACUUM ANALYZE(防止环绕)运行?

时间:2013-08-09 01:04:00

标签: sql postgresql

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

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

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

2 个答案:

答案 0 :(得分: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;"

答案 1 :(得分:3)

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

我想知道“VACUUM(防止环绕)”是否会完成,或者它是否会在中途中断并因此重新启动而不会取得真正的进展。对日志文件进行一次很好的检查应该有助于澄清这一点(以及帮助澄清有关用尽打开文件的内容)。

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

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