在某些情况下,在制作了一个巨大update
的insert
或delete
从一张桌子之后,我开始了一个VACUUM FULL ANALYZE
以确保数据库不会变得过于臃肿。在生产数据库中执行此操作让我发现这不是一个好主意,因为我可能会长时间阻塞该表。所以,我取消了这个过程,也许只是尝试VACUUM
(不完整)或者让AUTOVACUUM
以后做任何可以做的事情。
问题是:如果我“中途”停止 VACUUM 或 AUTOVACUUM,是否所有处理都已经丢失?
例如,如果VACUUM
已经找到 1 M 死行并且我停止它,那么所有这些信息都会丢失吗?VACUUM 是否以完全事务的方式工作(“全有或全无”,就像大量的 PostgreSQL 进程一样)?
如果 VACUUM 可以安全地中断而不会丢失所有工作,那么有什么方法可以vacuum
增量工作吗?[工作 100 毫秒,停止,等待 10 毫秒以允许不阻塞世界其他地方......等等]。我知道您可以通过调整 autovacuum 参数来完成其中的一部分,但我正在考虑能够以编程方式控制这一点,以便能够在特定时间/特定条件下执行此操作。
注意:在这种情况下,停止/取消/终止进程意味着:
- 如果使用 pgAdmin,请按“取消查询”按钮。
- 如果以编程方式工作,请调用 pg_cancel_backend()。
我假设两者是等价的。我没有使用任何 shell/系统级别的 kill 命令。
由中断的 VACUUM FULL 完成的工作将完全丢失,因为它将简单地恢复为使用表的先前版本并丢弃正在进行的表版本。
由常规(非完整)VACUUM 完成的工作可能不会完全丢失。它分批清洗索引,任何被完全清洗的批次都不需要再次清洗。它们仍然需要再次检查,但下次会发现它们已经干净了。因此,您可能会节省一些不需要重复的写入 IO。