在PostgreSQL中取消(AUTO)VACUUM进程是否会使所有工作无效?


13

在某些场合,并作出巨大的后updateinsertdelete从一个表,我已经开始了VACUUM FULL ANALYZE,以确保DB没有得到太臃肿。在生产数据库中进行操作使我发现这不是一个好主意,因为我可能会长时间阻塞该表。因此,我取消了此过程,可能只是尝试了一下VACUUM(未完成),或者AUTOVACUUM稍后再做任何可以做的事情。

问题是:如果我在中途停止VACUUM或AUTOVACUUM,是否已经完成所有处理?

例如,如果VACUUM已经找到1 M死行而我停止了,所有这些信息会丢失吗?VACUUM是否以完全事务性的方式工作(“全部或全部”,就像很多PostgreSQL进程一样)?

如果可以安全地中断VACUUM而不会丢失所有工作,那么有什么方法可以使vacuum工作逐步进行?[工作100毫秒,停止,等待10毫秒,以便不阻塞世界其他地方...依此类推]。我知道您可以通过调整自动真空参数来完成部分操作,但是我正在考虑能够以编程方式控制此操作,以便能够在特定时间/特定条件下执行此操作。


注意:在这种情况下,停止/取消/终止进程意味着:

  • 如果使用pgAdmin,请按“取消查询”按钮。
  • 如果以编程方式工作,请调用pg_cancel_backend()。

我认为两者是等效的。我还没有使用过任何shell /系统级的kill命令。

Answers:


8

中断的VACUUM FULL所完成的工作将完全丢失,因为它将简单地恢复为使用该表的先前版本,而丢弃该表的进行中版本。

常规(非全)VACUUM完成的工作可能不会完全丢失。它会分批清理索引,而完全清理过的任何批次都无需再次清理。它们仍然需要再次检查,但是下次将发现它们已经干净。因此,您可以节省一些不需要重复的写IO。


1
希望对此有更多细节,尤其是关于自动真空。我的服务器繁忙,数据库很多,有时自动清理可能要花很长时间。发生这种情况时,例如,由于自动真空具有锁定,因此不可能创建新索引。在某些情况下,最好是杀死自动真空并应用索引,然后希望当自动真空再次运行时,它不必运行很长时间。有什么方法可以查看已对表和索引执行了/正在执行的自动清理的详细信息吗?
Kurt Koller,

3
9.6引入了一个监视真空进度的视图:postgresql.org/docs/current/static/progress-reporting.html。我自己还没有玩过它,所以不知道它对您的效果如何。除非进行自动回卷,否则自动抽真空应自动屈服于锁。autovacuum的默认设置已被严格限制,因此下一次可能不会更快地运行,因为它正以相同的速度被限制。我经常设置vacuum_cost_page_hitvacuum_cost_page_miss为零。
jjanes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.