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


13

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

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

たとえば、VACUUMすでに100万のデッド行が見つかって停止した場合、この情報はすべて失われますか?VACUUMは完全にトランザクション的な方法で動作しますか(非常に多くのPostgreSQLプロセスのように、「すべてまたは何もない」)?

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


注:プロセスを停止/キャンセル/強制終了するとは、次のことを意味します。

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

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

回答:


8

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

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


1
これについて、特にautovacuumについてもっと詳しく知りたいと思います。多くのデータベースを備えた忙しいサーバーがあり、自動バキュームに時間がかかる場合があります。その場合、自動バキュームにはロックが設定されているため、たとえば新しいインデックスを作成することはできません。場合によっては、autovacuumを強制終了してインデックスを適用するのが理想的であり、うまくいけば、autovacuumが再び実行されたときに、ほぼ同じ時間実行する必要はありません。自動バキュームがテーブルとインデックスに対して行った/行っていることの詳細を確認する方法はありますか?
カートコラー

3
9.6真空の進行状況を監視するためのビューが導入されました:postgresql.org/docs/current/static/progress-reporting.html。私はそれを自分でいじりませんでしたので、それがあなたのためにどれほどうまくいくかわかりません。自動バキュームは、ラップアラウンドのために行われていない限り、自動的にロックに譲るべきです。autovacuumのデフォルト設定は大幅に調整されているため、同じ速度に調整されているからといって、次回はより速く実行されない可能性があります。私は日常的にゼロに設定vacuum_cost_page_hitvacuum_cost_page_missています。
jjanes 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.