Postgresql

取消 PostgreSQL 中的 (AUTO)VACUUM 程序是否會使完成的所有工作變得毫無用處?

  • January 7, 2017

在某些情況下,在製作了一個巨大updateinsertdelete從一張桌子之後,我開始了一個VACUUM FULL ANALYZE以確保數據庫不會變得過於臃腫。在生產數據庫中執行此操作讓我發現這不是一個好主意,因為我可能會長時間阻塞該表。所以,我取消了這個過程,也許只是嘗試VACUUM(不完整)或者讓AUTOVACUUM以後做任何可以做的事情。

問題是:如果我“中途”停止 VACUUM 或 AUTOVACUUM,是否所有處理都已經失去?

例如,如果VACUUM已經找到 1 M 死行並且我停止它,那麼所有這些資訊都會失去嗎?VACUUM 是否以完全事務的方式工作(“全有或全無”,就像大量的 PostgreSQL 程序一樣)?

如果 VACUUM 可以安全地中斷而不會失去所有工作,那麼有什麼方法可以vacuum增量工作嗎?

$$ Work for 100 ms, stop, wait 10 ms to allow for non-blocking the rest of the world… and so on $$. 我知道您可以通過調整 autovacuum 參數來完成其中的一部分,但我正在考慮能夠以程式方式控制這一點,以便能夠在特定時間/特定條件下執行此操作。


注意:在這種情況下,停止/取消/終止程序意味著:

  • 如果使用 pgAdmin,請按“取消查詢”按鈕。
  • 如果以程式方式工作,請呼叫 pg_cancel_backend()。

我假設兩者是等價的。我沒有使用任何 shell/系統級別的 kill 命令。

由中斷的 VACUUM FULL 完成的工作將完全失去,因為它會簡單地恢復使用表的先前版本並丟棄正在進行的表版本。

由正常(非完整)VACUUM 完成的工作可能不會完全失去。它分批清洗索引,任何被完全清洗的批次都不需要再次清洗。它們仍然需要再次檢查,但下次會發現它們已經乾淨了。因此,您可能會節省一些不需要重複的寫入 IO。

引用自:https://dba.stackexchange.com/questions/159647