杀死autovacuum的危险:VACUUM查询(以防止环绕)

时间:2013-08-04 23:55:17

标签: database postgresql autovacuum

有一个autovacuum查询需要很长时间才能运行,并阻止更改查询运行。

在完成之前杀死这个autovacuum进程有什么危险?

PID      QUERY
16967 | autovacuum: VACUUM public.articles (to prevent wraparound)

以下是我如何杀死它:

select pg_terminate_backend(16967) from pg_stat_activity;

3 个答案:

答案 0 :(得分:9)

你可以发出pg_cancel_backend(16967)而不是“pg_terminate_backend()”(我的理解并不严重)。一旦你杀死了那个autovacuum进程,它就会重新启动,因为你可能已经注意到了,特别是因为它是因为所述的原因而启动的(这是为了防止环绕)。如果手动发出VACUUM public.articles,真空将以更高的磁盘I / O为代价更快地完成。这是一个普遍的答案,但通常是结果。

答案 1 :(得分:3)

在情况恶化之前,最好先进行真空接种。在某个时间或其他时间,您必须这样做以防止数据丢失。当发生环绕式ID失败时,您可能想知道所有数据都消失了。数据仍然在数据库中,但它将被隐藏,并且在完成真空过程之前无法访问。所以,让它通过autovaccum或手动真空完成。

答案 2 :(得分:2)

如果你只需要一次改变一次表,那么一次杀死它可能没什么坏处。你应该在psql的同一行提交cancel和alter table,这样alter table就有机会在另一个autovacuum开始之前启动并再次阻止它。

取消autovacuum很可能会导致txid环绕并紧急关闭数据库,这将需要一些工作和停机时间进行清理。但如果发生这种情况,你几乎肯定已经处于死亡竞赛中了。

如果您经常这样做,那么您将为自己存储大量问题,包括上述死亡竞赛和紧急关闭。

顺便说一句,你的select pg_terminate_backend(16967)上不应该有一个FROM子句。