DBAtlas · 데이터베이스 운영 아틀라스

RANGE 파티션 유지보수: 미래 파티션 추가, 오래된 파티션 아카이브/삭제

MySQL파티셔닝

명령어

-- Current partitions
SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'events_log' ORDER BY PARTITION_ORDINAL_POSITION;

-- Add a new month by splitting the empty pmax
ALTER TABLE shop.events_log REORGANIZE PARTITION pmax INTO (
  PARTITION p2026_11 VALUES LESS THAN ('2026-12-01'),
  PARTITION pmax VALUES LESS THAN (MAXVALUE));

-- Move the old month into an archive table (instant), then drop the empty partition
CREATE TABLE shop.events_log_2026_08 LIKE shop.events_log;
ALTER TABLE shop.events_log_2026_08 REMOVE PARTITIONING;
ALTER TABLE shop.events_log EXCHANGE PARTITION p2026_08 WITH TABLE shop.events_log_2026_08;
ALTER TABLE shop.events_log DROP PARTITION p2026_08;

-- Pruning check: the partitions column should list a single partition
EXPLAIN SELECT * FROM shop.events_log WHERE created >= '2026-10-01' AND created < '2026-11-01';

하는 일

날짜 기반 RANGE 파티션 테이블에 다음 기간의 파티션을 추가하고, EXCHANGE로 오래된 기간을 밀리초 만에 별도 테이블로 옮기며, DELETE보다 훨씬 저렴하게 파티션을 삭제한다.

사용 시점

로그, 이벤트, 감사 추적처럼 시간이 지나며 커지는 테이블의 월 단위 보존 및 아카이빙.

주의

파티션 컬럼은 모든 unique key(PK 포함)에 포함되어야 한다. REORGANIZE PARTITION pmax는 pmax의 데이터를 다시 쓰므로 pmax를 비워 두고 파티션을 미리(예: 3개월) 만든다. DROP PARTITION은 되돌릴 수 없고 행 단위로 로깅되지 않으며 replica에서는 DDL로 실행된다. EXCHANGE 대상은 구조가 같고 파티션이 없어야 하며, 범위 밖의 행은 오류를 일으킨다(WITHOUT VALIDATION은 빠르지만 잘못된 데이터가 들어올 수 있음). 파티션 DDL은 테이블 수준 메타데이터 락을 잡는다. pruning을 위해 WHERE에서 파티션 컬럼을 함수로 감싸지 말고 사용한다.

DBAtlas에서 열기 →