파티셔닝할 때 외래키 제약조건 외에 조심해야할 부분이 여기 하나 더 있다.
문제 정의
reg_date 컬럼을 기준으로 alarm_data 테이블에 파티셔닝을 적용하려 했으나, 다음과 같은 오류가 발생했다.
ERROR 1503: A PRIMARY KEY must include all columns in the table's partitioning function
이는 파티셔닝에 사용되는 컬럼이 기본 키에 포함되어야 함을 의미한다.
시도했던 방법
- 기존 기본 키 유지한 채 파티셔닝 시도: 기존의 기본 키(ad_idx)를 유지하면서 reg_date를 기준으로 파티셔닝을 적용하려 했으나, 위와 동일한 오류가 발생했다.
- 기본 키 수정: 기본 키에 reg_date 컬럼을 추가하여 (ad_idx, reg_date) 형태로 변경한 후 파티셔닝을 적용했다.
해결 방법
기본 키를 (ad_idx, reg_date)로 수정한 후, reg_date를 기준으로 파티셔닝을 적용하여 문제를 해결했다.
-- 기존 PRIMARY KEY가 ad_idx만 포함되어 있다면,
-- 파티셔닝 기준인 reg_date를 포함한 복합 PK로 변경
ALTER TABLE alarm_data DROP PRIMARY KEY,
ADD PRIMARY KEY (ad_idx, reg_date);
-- 이후 파티셔닝 정상 적용 가능
ALTER TABLE alarm_data
PARTITION BY RANGE (YEAR(reg_date)) (
PARTITION p0 VALUES LESS THAN (2024),
PARTITION p1 VALUES LESS THAN (2025),
PARTITION p2 VALUES LESS THAN (2026),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
마무리
파티션은 MySQL 입장에서 데이터를 어떤 파티션에 넣을지 결정하는 기준 컬럼이 필요하다.
이 컬럼이 고유해야 데이터 정합성을 유지할 수 있기에 파티셔닝 키가 반드시 기본키에 포함되어야 한다.
'프로젝트 > 악취 포집기 앱' 카테고리의 다른 글
DB 마이그레이션 적용 (0) | 2025.04.01 |
---|---|
MySQL 파티셔닝과 외래 키 제약의 충돌 (0) | 2025.04.01 |
MySQL 성능 최적화 (0) | 2025.04.01 |