web-dev-qa-db-ja.com

自動バキュームはDROPまたはTRUNCATEをブロックしますか?

自動バキュームプロセスが大きなテーブルをバキュームする場合、バキュームが完了するまで、DROPやTRUNCATEなどのクエリはブロックされますか?ドキュメントでは、それは言う

また、VACUUMの標準形式は、本番データベースの操作と並行して実行できます。 (SELECT、INSERT、UPDATE、DELETEなどのコマンドは引き続き正常に機能しますが、バキュームされている間は、ALTER TABLEなどのコマンドを使用してテーブルの定義を変更することはできません。)

しかし、DROPまたはTRUNCATEが含まれているのでしょうか。

5
Bill Greens

自動バキュームとバキュームの動作は異なります。どちらも同じロックを取得しますが、自動バキュームが何かをブロックしていることが検出された場合、自動バキュームはキャンセルされます。 DROPまたはTRUNCATEはブロックされますが、autovacuumの場合は最大で1秒間(または「deadlock_timeout」が設定されているもの)だけです。

これの例外は、「ラップアラウンドを防止するための」自動バキュームです。それらはキャンセルされません。これは大きな問題になる可能性があります。特にDROPまたはTRUNCATEの場合は、それらを許可すると、そもそもラップアラウンドのバキュームが不要になるためです。

(技術的な詳細が好きな場合:ロックモードはsrc/backend/commands/vacuum.cの1590行で設定され、自動または手動(12dev HEAD上)に依存しません。キャンセルはsrc/backend /で行われます。 src/backend/storage/lmgr/deadlock.cで設定されたフラグに基づくstorage/lmgr/proc.c。デッドロックをチェックするコードは、autovacによってブロックされているかどうかをチェックするのに便利な場所であるため、そこで行われます。

6
jjanes