파티션 관련 문의가 있어 정리해 놓는다.
아래와 같은 테이블 파티셔닝을 구성한다면 (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 는 사용하는 것이 좋다. 어떤 이유에서든 테이블에 데이터가 스키마구성에 의해 에러가 나서 쌓이지 않는 경우는 예방해야하기 때문이다.
'RDB > mariadb' 카테고리의 다른 글
mariadb 10.4.17 upgrade 이후 장애 1 (0) | 2021.03.12 |
---|---|
MariaDB 10.2 to 10.4 upgrade (0) | 2020.11.10 |
xtrabackup과 Mariabackup 차이점 (0) | 2020.10.30 |
MariaDB 10.4.13 mysql계정으로 stop 안되는 현상 해결 (0) | 2020.10.22 |
[튜닝] MariaDB where 조건절에 OR 연산인데 빠르게 가능할까? (0) | 2020.10.17 |