取消 PostgreSQL 中的 (AUTO)VACUUM 进程是否会使所有工作都变得无用?

joa*_*olo 14 postgresql maintenance vacuum autovacuum

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

问题是:如果我在“中途”停止 VACUUM 或 AUTOVACUUM,是否所有已经完成的处理都丢失了?

例如,如果VACUUM已经找到 1 M 个死行并且我停止它,那么所有这些信息都丢失了吗?VACUUM 是否以完全事务的方式工作(“全有或全无”,就像大量的 PostgreSQL 进程一样)?

如果可以安全地中断 VACUUM 而不会丢失所有工作,那么有什么方法可以vacuum增量工作吗?[工作 100 毫秒,停止,等待 10 毫秒以允许非阻塞世界其他地方......等等]。我知道您可以通过调整 autovacuum 参数来完成部分工作,但我正在考虑能够以编程方式控制这一点,以便能够在某些时间/在某些条件下执行此操作。


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

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

我假设两者是等价的。我没有使用任何 shell/系统级 kill 命令。

jja*_*nes 10

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

由常规(非完整)VACUUM 完成的工作可能不会完全丢失。分批清洗索引,完全清洗的批次不需要再次清洗。它们仍然需要再次检查,但下次会发现它们已经干净了。因此,您可能会节省一些不需要重复的写入 IO。

  • 9.6 引入了一个用于监控真空进度的视图:https://www.postgresql.org/docs/current/static/progress-reporting.html。我自己没有玩过它,所以不知道它对你的效果如何。Autovacuum 应该自动屈服于锁,除非它是为环绕而完成的。autovacuum 的默认设置受到严重限制,因此下次它可能不会运行得更快,因为它被限制为相同的速度。我经常将 `vacuum_cost_page_hit` 和 `vacuum_cost_page_miss` 设置为零。 (4认同)
  • 想要更多关于这方面的细节,特别是关于 autovacuum 的细节。我的服务器很繁忙,有很多数据库,有时自动清理可能需要很长时间。例如,当发生这种情况时,创建新索引是不可能的,因为 autovacuum 有锁。在某些情况下,理想的做法是终止 autovacuum 并应用索引,然后希望当 autovacuum 再次运行时,它不必运行那么长时间。有什么方法可以查看 autovacuum 已经/正在对表和索引执行的操作的详细信息吗? (2认同)