반응형

파티션 관련 문의가 있어 정리해 놓는다.

 

아래와 같은 테이블 파티셔닝을 구성한다면 (RANGE는 보통 날짜를 많이 사용한다)

CREATE TABLE `TB_TEST` (
`SEQ` int(11) NOT NULL AUTO_INCREMENT,
`xxx_DATE` datetime NOT NULL,
`xxx_NO` bigint(15) unsigned NOT NULL,
`xxx_ID` varchar(20) NOT NULL,
`xxx__CD` varchar(2) DEFAULT NULL,
`xx_DATE` datetime DEFAULT NULL,
PRIMARY KEY (`SEQ`,`xxx_DATE`),
KEY `IDX_TEST_01` (`xxx_DATE`,`xxx_CD`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8
PARTITION BY RANGE (to_days(`xxx_DATE`))
(PARTITION `p201909` VALUES LESS THAN (737698) ENGINE = InnoDB,
PARTITION `p201910` VALUES LESS THAN (737729) ENGINE = InnoDB,
PARTITION `p201911` VALUES LESS THAN (737759) ENGINE = InnoDB,
PARTITION `p201912` VALUES LESS THAN (737790) ENGINE = InnoDB,
PARTITION `pExt` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
;

위처럼 파티셔닝을 사용할 컬럼은 반드시 PK로 구성되어 있어야 한다.

그럼 테이블 자체에 PK가 없으면 파티션 구성이 안되나?

-> 아니다 파티셔닝을 할 수는 있다. MariaDB든 Mysql이든 pk가 없으면 옵티마이져가 후보군 컬럼중에 하나를 pk처럼 사용하기 때문이다. 하지만 제대로 성능이 나오지 않는다.

 

1) 파티션 추가

p201912 이후 신규로 파티션을 추가한다면 pExt를 삭제하고 p202001을 추가한 후 다시 pExt를 생성해야한다.

이것을 한번에 할수 있는 명령어는 REORGANIZE !

/* 파티션 추가 */
ALTER TABLE TB_TEST REORGANIZE PARTITION pExt INTO (
PARTITION p202001 VALUES LESS THAN (TO_DAYS('2020-02-01')),
PARTITION pExt VALUES LESS THAN MAXVALUE
);

파티션 추가는 기존파티션 사이에 넣을 수는 없고 가장 이후 파티션 뒤로 생성이 가능하다.

이런 점 때문에 혹시 파티션을 생성했는데.. range 범위를 잘못 생성했을 경우 삭제하고 재구성해야할 수도 있다.

 

2) 파티션 삭제

/* 파티션 삭제 */
ALTER TABLE TB_TEST DROP PARTITION pExt;

맨아래서부터 순서대로 삭제하고 잘못구성한 파티션까지 삭제후 재구성한다.

 

만약 p202001을 TO_DAY('2020-03-01')로 잘못구성했다고 가정하면 pExt, p202001 순으로 순차적으로 삭제하면된다.

이럴 경우 파티션 여러 개 한번에 삭제하려면?

<-- 서버에 한번에 삭제하도록 구성하고 싶다는 문의가 있었고 아래와 같이 명령어를 사용하면 적용가능했다.

ALTER TABLE TB_TEST DROP PARTITION pExt, p202001;

 

3) 파티션 생성

ALTER TABLE TB_TEST add PARTITION (
PARTITION p202001 VALUES LESS THAN (TO_DAYS('2020-02-01')),
PARTITION pExt VALUES LESS THAN MAXVALUE
);

MAXVAULE 는 사용하는 것이 좋다. 어떤 이유에서든 테이블에 데이터가 스키마구성에 의해 에러가 나서 쌓이지 않는 경우는 예방해야하기 때문이다.

반응형
블로그 이미지

dung beetle

취미는 데이터 수집 직업은 MYSQL과 함께 일하는 DBA의 소소한 일상 이야기

,