ライブのトラフィックをブロックせずに古いパーティションをデタッチ(DETACH CONCURRENTLY)
PostgreSQLパーティション化コマンド
-- Must run outside a transaction block
ALTER TABLE sales DETACH PARTITION sales_2026_01 CONCURRENTLY;
-- If interrupted (cancel, lost connection) the partition stays 'detach pending'; complete it:
ALTER TABLE sales DETACH PARTITION sales_2026_01 FINALIZE;
-- Any pending detach?
SELECT inhrelid::regclass AS partition_name, inhparent::regclass AS parent
FROM pg_inherits
WHERE inhdetachpending;
-- The detached table is now standalone: archive or drop it
DROP TABLE sales_2026_01;概要
2つのトランザクションでパーティションをデタッチする。親表にはSHARE UPDATE EXCLUSIVEのみを取得するため実行中のクエリはブロックされず、デタッチした表にパーティション境界と同等のCHECK制約を追加する。
使用する場面
稼働中のシステムで保存期間/アーカイブのために古い期間をデタッチするときに(続いてDROP、別の表領域への移動、pg_dumpによるアーカイブ)。
注意
BEGIN ... COMMITブロック内では実行できず、親表にデフォルトパーティションがある場合は使用できない。親表を使用する、開始前に始まったすべてのトランザクションを待機するため、長いトランザクションがあると長引く。中断した場合、パーティションはクエリからは見えないがデタッチされていない状態('detach pending')のままとなり、FINALIZEで完了させる必要がある。CONCURRENTLYなしの通常のDETACHは高速だが親表にACCESS EXCLUSIVEが必要。lock_timeoutを付けて試す。