DBAtlas · データベース運用アトラス

ライブのトラフィックをブロックせずに古いパーティションをデタッチ(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を付けて試す。

DBAtlas で開く →

関連項目