長時間のロックなしで肥大化した表を再編成(pg_repack)
PostgreSQLメンテナンスコマンド
-- Once per target database (the pg_repack package must be installed on the server)
CREATE EXTENSION pg_repack;
# Dry run: show what would be done
pg_repack -h localhost -U postgres -d mydb --table=public.orders --dry-run
# Rewrite the table and its indexes: 2 parallel index builds, wait at most 60 s for locks
pg_repack -h localhost -U postgres -d mydb --table=public.orders --jobs=2 --wait-timeout=60 --no-kill-backend
# Rebuild indexes only
pg_repack -h localhost -U postgres -d mydb --table=public.orders --only-indexes概要
バックグラウンドで表の圧縮コピーを作成し、トリガーで同時実行の変更をログ表に取り込み、最後に短時間のACCESS EXCLUSIVEロックの下で表を入れ替える。VACUUM FULLと異なり、処理中に読み取り/書き込みをブロックしない。
使用する場面
VACUUMでは回収できない深刻な肥大化(pgstattupleで確認済み)を、稼働中のシステムで回収する必要があるときに。
注意
表にはPRIMARY KEY、またはNOT NULL列のUNIQUEインデックスが必要。表とインデックスの合計と同じ追加ディスク領域が一時的に必要で、大量のWALを生成する(レプリカ遅延、アーカイブ量)。開始時と終了時にACCESS EXCLUSIVEロックが必要。--wait-timeoutが経過すると、デフォルトでは競合するクエリを取り消し、必要に応じてそのセッションを終了する。--no-kill-backendを指定するとその表をスキップする。実行中は対象の表でDDLを実行しない。クライアントと拡張のバージョンは一致している必要がある。中断した場合は、DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack;で残存物をクリーンアップする。