有一个 autovacuum 查询需要很长时间才能运行,并且会阻止更改查询运行。
在这个 autovacuum 进程完成之前杀死它有什么危险?
PID查询 16967 | autovacuum: VACUUM public.articles(防止环绕)
这是我杀死它的方法:
select pg_terminate_backend(16967) from pg_stat_activity;
有一个 autovacuum 查询需要很长时间才能运行,并且会阻止更改查询运行。
在这个 autovacuum 进程完成之前杀死它有什么危险?
PID查询 16967 | autovacuum: VACUUM public.articles(防止环绕)
这是我杀死它的方法:
select pg_terminate_backend(16967) from pg_stat_activity;
您可以发出pg_cancel_backend(16967)
而不是“pg_terminate_backend()”(我的理解没有那么严重)。一旦你杀死了那个 autovacuum 进程,它就会重新启动,正如你可能已经注意到的那样,特别是因为它是出于上述原因(这是为了防止回绕)而启动的。如果您VACUUM public.articles
手动发出,则以更高的磁盘 I/O 为代价来更快地完成清理。这是一个笼统的答案,但结果通常是这样。
最好在情况变得更糟之前进行真空吸尘。有时,您必须这样做以防止数据丢失。您可能想知道当 wraparound id 发生故障时所有数据都去了哪里。数据仍将在数据库中,但将被隐藏,直到 vaccum 过程完成后才能访问。所以让它通过自动真空或手动真空来完成。
如果您只需要执行一次更改表,则将其杀死一次可能没有什么坏处。您应该在 psql 中的同一行提交取消和更改表,以便更改表有机会在另一个自动真空启动并再次阻止它之前启动。
取消 autovacuum 很有可能会导致 txid 回绕和数据库紧急关闭,这将需要一些工作和停机时间来清理。但如果发生这种情况,你几乎可以肯定已经在一场死亡竞赛中了。
如果您经常这样做,那么您将为自己存储大量问题,包括前面提到的死亡竞赛和紧急关闭。
顺便说一句,您的选择 pg_terminate_backend(16967) 上不应有 FROM 子句。