大型 table 的 Autovacuum 花费的时间太长
Autovacuum of a large table takes too long
我将我的 9.4 postgresql 集群升级到了 9.6。 (通过 pg_upgrade,所以我的数据库统计数据没有移动到新集群)
我有一个很大的 table(大约 450M 条记录)。这个 table 在我的代码中用得很多(很多选择和较少的更新)。
当我启动我的 postgres 服务时,Postgres 会自动启动 autovacuum,它会锁定我的 table。所以我什么也做不了:既不截断 table 也不手动分析它。
我试图在我的配置文件中设置 autovacuum=off,但它没有帮助(为什么?!我当然重新启动了服务器)
更新: 我的目标是尽快开始使用 table。 Truncate 会有所帮助(因为 table 将为空),ANALYZE 应该会有所帮助(Postgres 将开始使用正确的索引)
最快的方法是:
1) 截断 table
要么
2) 分析 table
?
任何帮助将不胜感激。
更新:
这是查看锁的查询的输出:
SELECT psa.pid,granted,query FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid where locktype='relation';
pid | granted | query
-------+---------+---------------------------
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
当我从我的 psql 控制台分析 table 并查看来自 pg_stat_activity 的数据时:
query | backend_start | xact_start | query_start | state_change | state | wait_event_type | wait_event
analyze ig_tasks_users;| 2017-01-19 10:03:30.287791+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683822+01 | active | Lock | relation
如果我理解正确,我的 VACUUM ANALYZE 锁定 table 并且我的手动 ANALYZE 任务被锁定。 (是吗?)
如果自动吸尘时间过长,实际上可能是因为您将其关闭了一段时间。
The usual goal of routine vacuuming is to do standard VACUUMs often
enough to avoid needing VACUUM FULL. The autovacuum daemon attempts to
work this way, and in fact will never issue VACUUM FULL.
缓慢真空的解决方案是vacuum more often! Also note that settnig autovaccum to off may not switch it off completely。
运行 t运行在一个会话中 cate 并保持其工作,然后打开新连接并使用 pg_terminate_backend(pid)
终止所有其他会话。
牢记
truncate
将从 table 中删除您的所有数据
- autovacuum 最好打开
This 会帮助你。尝试分阶段分析。
我将我的 9.4 postgresql 集群升级到了 9.6。 (通过 pg_upgrade,所以我的数据库统计数据没有移动到新集群) 我有一个很大的 table(大约 450M 条记录)。这个 table 在我的代码中用得很多(很多选择和较少的更新)。 当我启动我的 postgres 服务时,Postgres 会自动启动 autovacuum,它会锁定我的 table。所以我什么也做不了:既不截断 table 也不手动分析它。 我试图在我的配置文件中设置 autovacuum=off,但它没有帮助(为什么?!我当然重新启动了服务器)
更新: 我的目标是尽快开始使用 table。 Truncate 会有所帮助(因为 table 将为空),ANALYZE 应该会有所帮助(Postgres 将开始使用正确的索引)
最快的方法是: 1) 截断 table 要么 2) 分析 table ? 任何帮助将不胜感激。
更新: 这是查看锁的查询的输出:
SELECT psa.pid,granted,query FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid where locktype='relation';
pid | granted | query
-------+---------+---------------------------
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
当我从我的 psql 控制台分析 table 并查看来自 pg_stat_activity 的数据时:
query | backend_start | xact_start | query_start | state_change | state | wait_event_type | wait_event
analyze ig_tasks_users;| 2017-01-19 10:03:30.287791+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683822+01 | active | Lock | relation
如果我理解正确,我的 VACUUM ANALYZE 锁定 table 并且我的手动 ANALYZE 任务被锁定。 (是吗?)
如果自动吸尘时间过长,实际上可能是因为您将其关闭了一段时间。
The usual goal of routine vacuuming is to do standard VACUUMs often enough to avoid needing VACUUM FULL. The autovacuum daemon attempts to work this way, and in fact will never issue VACUUM FULL.
缓慢真空的解决方案是vacuum more often! Also note that settnig autovaccum to off may not switch it off completely。
运行 t运行在一个会话中 cate 并保持其工作,然后打开新连接并使用 pg_terminate_backend(pid)
终止所有其他会话。
牢记
truncate
将从 table 中删除您的所有数据
- autovacuum 最好打开
This 会帮助你。尝试分阶段分析。