确定 Autovacuum 当前是否正在运行以及运行时长
如果需要手动对表执行 vacuum 操作,确保确定 autovacuum 当前是否正在运行。如果它当前正在运行,则您可能需要调整参数以使其更高效地运行,或者暂时禁用 autovacuum 以便手动运行 VACUUM。
使用以下查询来确定 Autovacuum 是否正在运行、它已运行的时长以及它是否正在等待其他会话。
SELECT datname, usename, pid, state, wait_event, current_timestamp - xact_start AS xact_runtime, query FROM pg_stat_activity WHERE upper(query) LIKE '%VACUUM%' ORDER BY xact_start;
在运行查询后,您应看到类似以下内容的输出。
datname | usename | pid | state | wait_event | xact_runtime | query --------+----------+-------+--------+------------+-------------------------+-------------------------------------------------------------------------------------------------------- mydb | rdsadmin | 16473 | active | | 33 days 16:32:11.600656 | autovacuum: VACUUM ANALYZE public.mytable1 (to prevent wraparound) mydb | rdsadmin | 22553 | active | | 14 days 09:15:34.073141 | autovacuum: VACUUM ANALYZE public.mytable2 (to prevent wraparound) mydb | rdsadmin | 41909 | active | | 3 days 02:43:54.203349 | autovacuum: VACUUM ANALYZE public.mytable3 mydb | rdsadmin | 618 | active | | 00:00:00 | SELECT datname, usename, pid, state, wait_event, current_timestamp - xact_start AS xact_runtime, query+ | | | | | | FROM pg_stat_activity + | | | | | | WHERE query like '%VACUUM%' + | | | | | | ORDER BY xact_start; +
有多个问题可能会导致长时间运行 Autovacuum 会话(即,多天)。最常见的问题是,对于表的大小或更新速率来说,设置的 maintenance_work_mem
建议您使用以下公式来设置 maintenance_work_mem
参数值。
GREATEST({DBInstanceClassMemory/63963136*1024},65536)
短时间运行的 Autovacuum 会话还可以指示以下问题:
-
它可以指示,对于工作负载而言,
autovacuum_max_workers
不足。在这种情况下,您将需要指示工作线程数。 -
它可以指示存在索引损坏(autovacuum 将发生崩溃并在同一关系上重新启动,但毫无进展)。在这种情况下,运行手动
vacuum freeze verbose
以查看准确原因。table