web-dev-qa-db-ja.com

PostgreSQLで(AUTO)VACUUMプロセスをキャンセルすると、すべての作業が無駄になりますか?

場合によっては、テーブルからupdateinsert、またはdeleteを大量に作成した後、VACUUM FULL ANALYZE DBが肥大化していないことを確認します。本番データベースでこれを行うと、長期間テーブルをブロックすることができたため、これは良いアイデアではなかったことがわかりました。そのため、プロセスをキャンセルしました。たぶんVACUUM(完全ではない)を試してみるか、後でAUTOVACUUMにできることは何でもできるようにします。

問題は、VACUUMまたはAUTOVACUUMを「途中」で停止すると、すでに実行されたすべての処理が失われるのですか?

たとえば、VACUUMがすでに100万のデッド行を見つけて停止した場合、この情報はすべて失われますか? VACUUMは完全にtransactionalの方法で機能しますか(非常に多くのPostgreSQLプロセスのように「すべてまたは何もない」)?

すべての作業を失うことなくVACUUMを安全に中断できる場合、vacuumを段階的に機能させる方法はありますか? [100 ms動作し、停止し、10 ms待機して、残りの世界をブロックしないようにします...]。 autovacuumパラメータを調整することでこれの一部を実行できることはわかっていますが、これをプログラムで制御して、特定の時間に特定の条件下で制御できるようにすることを考えています。


注:プロセスを停止/キャンセル/強制終了するとは、このコンテキストでは

  • PgAdminを使用している場合は、[クエリのキャンセル]ボタンを押します。
  • プログラムで作業する場合は、pg_cancel_backend()を呼び出します。

どちらも同等だと思います。シェル/システムレベルのkillコマンドを使用していません。

13
joanolo

中断されたVACUUM FULLによって行われた作業は、以前のバージョンのテーブルを使用するように戻り、進行中のバージョンのテーブルを破棄するため、完全に失われます。

通常の(FULLではない)VACUUMによって行われた作業は、完全に失われるとは限りません。インデックスはバッチでクリーンアップされ、完全にクリーンアップされたバッチを再度クリーンアップする必要はありません。それらはまだ再度検査する必要がありますが、次回はすでにクリーンであることがわかります。だからあなたはいくつかの書き込みを保存するかもしれませんIOこれは繰り返す必要はありません。

8
jjanes