扼杀自动真空的危险:真空查询(防止缠绕)



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

在自动真空过程完成之前扼杀它的危险是什么?

PID查询16967|自动真空:真空公共物品(防止包裹)

以下是我如何杀死它:

select pg_terminate_backend(16967) from pg_stat_activity;

您可以发出pg_cancel_backend(16967)而不是"pg_terminate_backend()"(我的理解没有那么严重)。一旦你终止了自动真空过程,它就会重新启动,正如你可能注意到的那样,特别是因为它是出于所述的原因启动的(这是为了防止包装)。如果手动发出VACUUM public.articles,真空将以更高的磁盘I/O为代价更快地完成。这是一个笼统的答案,但通常都是这样。

如果只需要对一个表进行一次更改,那么这次杀死它可能没有什么害处。您应该在psql中的同一行提交cancel和alter表,这样alter表就有机会在另一个自动真空开始并再次阻止它之前启动。

取消自动真空很可能会导致txid回绕和数据库紧急关闭,这将需要一些工作和停机时间来清理。但如果发生这种情况,你几乎肯定已经陷入了死亡竞赛。

如果你经常这样做,那么你将为自己积累大量问题,包括前面提到的死亡竞赛和紧急关闭。

顺便说一句,您选择的pg_terminate_backend(16967)上不应该有FROM子句。

最好在情况恶化之前先进行真空吸尘。无论何时,您都必须这样做以防止数据丢失。你可能会想,当全面id失败时,所有的数据都去了哪里。数据仍将在数据库中,但它将被隐藏,在vaccum过程完成之前无法访问。所以让它通过自动真空或手动真空来完成。

最新更新