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;

하는 일

파티션을 두 트랜잭션에 걸쳐 분리한다. 부모에 SHARE UPDATE EXCLUSIVE만 잡으므로 실행 중인 쿼리가 블로킹되지 않으며, 분리된 테이블에 파티션 경계와 동등한 CHECK 제약 조건을 추가한다.

사용 시점

운영 시스템에서 보존/아카이브를 위해 오래된 기간을 분리할 때(이후 DROP, 다른 테이블스페이스로 이동, pg_dump 아카이브).

주의

BEGIN ... COMMIT 블록 안에서 실행할 수 없고 부모에 default 파티션이 있으면 사용할 수 없다. 이 명령 이전에 시작되어 부모를 사용하는 모든 트랜잭션을 기다리므로 장시간 트랜잭션이 있으면 길어진다. 중단되면 파티션은 쿼리에서 숨겨지지만 분리되지 않은 상태('detach pending')로 남으며 FINALIZE로 완료해야 한다. CONCURRENTLY 없는 일반 DETACH는 더 빠르지만 부모에 ACCESS EXCLUSIVE가 필요하므로 lock_timeout과 함께 시도한다.

DBAtlas에서 열기 →

관련 항목