MySQL 파티션 추가 삭제 - Error Code: 1493 - 파티션 테이블 - REORGANIZE PARTITION

Last Updated on 6월 12, 2021 by 태랑(정현호)



월별로 되어있는 range 파티션에 파티션 추가 관련하여 maxvalue 유무, 앞에 추가 또는 뒤에 추가에 따른 명령어 사용 등을 확인 해보도록 하겠습니다.


1. 테스트 테이블 생성

아래와 같이 테스트 테이블을 생성하여 사용하겠습니다.

mysql> use test_db;

mysql> CREATE TABLE `tb_part_test` (
  `seq` int(11) NOT NULL AUTO_INCREMENT,
  `col1` decimal(3,1) DEFAULT NULL,
  `col2` decimal(5,1) DEFAULT NULL,
  `col3` decimal(5,1) DEFAULT NULL,
  `col4` varchar(20) DEFAULT NULL,
  `datetime` varchar(13) NOT NULL COMMENT '날짜(yyyy-mm-dd;hh)',
  PRIMARY KEY (`seq`,`datetime`),
  KEY `datetime_01` (`datetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE  COLUMNS(`datetime`)
(PARTITION p202101 VALUES LESS THAN ('2021-02-01:00') ENGINE = InnoDB,
 PARTITION p202102 VALUES LESS THAN ('2021-03-01:00') ENGINE = InnoDB,
 PARTITION p202103 VALUES LESS THAN ('2021-04-01:00') ENGINE = InnoDB,
 PARTITION p202104 VALUES LESS THAN ('2021-05-01:00') ENGINE = InnoDB,
 PARTITION p202105 VALUES LESS THAN ('2021-06-01:00') ENGINE = InnoDB,
 PARTITION p202106 VALUES LESS THAN ('2021-07-01:00') ENGINE = InnoDB,
 PARTITION p202107 VALUES LESS THAN ('2021-08-01:00') ENGINE = InnoDB,
 PARTITION p202108 VALUES LESS THAN ('2021-09-01:00') ENGINE = InnoDB,
 PARTITION p202109 VALUES LESS THAN ('2021-10-01:00') ENGINE = InnoDB,
 PARTITION p202110 VALUES LESS THAN ('2021-11-01:00') ENGINE = InnoDB,
 PARTITION p202111 VALUES LESS THAN ('2021-12-01:00') ENGINE = InnoDB,
 PARTITION p202112 VALUES LESS THAN ('2022-01-01:00') ENGINE = InnoDB,
 PARTITION p999999 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)
 ;





2. 파티션 앞에 추가

파티션 앞에 추가시 에는 maxvalue 파티션 의 유무와 상관없이 add partition 사용시 1493 에러가 발생되게 됩니다.

mysql> alter table test_db.tb_part_test add partition (
    partition p202012 values less than ('2021-01-01:00') engine=innodb 
);

SQL Error [1493] [HY000]: VALUES LESS THAN value must be strictly increasing for each partition


maxvalue 파티션 유무와 상관없이 맨 앞에 파티션추가시 Error Code: 1493 가 발생하며 이러한 경우 reorganize table 을 통해 진행해야 합니다.

p202101 파티션을 지정하여 REORGANIZE PARTITION 를 수행 합니다.

mysql> alter table test_db.tb_part_test
REORGANIZE PARTITION p202101 into (
    partition p202012 values less than ('2021-01-01:00') engine=innodb,
    partition p202101 values less than ('2021-02-01:00') engine=innodb
);


참고로 8.0 에서는 Online DDL 기능이 강회되어 range 파티션에 대한 REORGANIZE PARTITION 작업도 INPLACE ALGORITHM 사용이 가능합니다.

mysql> alter table test_db.tb_part_test ALGORITHM=INPLACE,
REORGANIZE PARTITION p202101 into (
    partition p202012 values less than ('2021-01-01:00') engine=innodb,
    partition p202101 values less than ('2021-02-01:00') engine=innodb
);


MySQL Online DDL 관련된 내용은 아래 포스팅을 참조하시면 됩니다.


MySQL 5.7 에서 range 파티션에 대해서 reorganize partition 작업은 COPY 방식으로 수행 됩니다(ALGORITHM=INPLACE 사용시 에러, INPLACE 방식을 미지원)

Error Code: 1846. ALGORITHM=COPY/INPLACE is not supported. Reason: Partition specific operations do not yet support LOCK/ALGORITHM. Try ALGORITHM=DEFAULT.




3. 파티션 끝에 추가

이번에는 파티션 끝에 추가를 진행 하겠습니다 p202112 이 있고 p202201 파티션 추가가 필요한 상황 입니다.

이 경우 maxvalue 파티션 유무에 따라 수행 방법이 달라 지게 됩니다. maxvalue 파티션이 없을 경우 아래와 같이 alter table 로 추가할 수 있습니다.

mysql> alter table test_db.tb_part_test 
add partition (
 PARTITION p202201 VALUES LESS THAN ('2022-02-01:00') ENGINE = InnoDB
 );

이 경우도 MySQL 8.0 에서는 ALGORITHM=INPLACE 를 사용 할 수 있습니다.



maxvalue 파티션이 있는 경우에 add partition 로 추가 하게 되면 Error Code: 1493 가 발생되게 됩니다

mysql> alter table test_db.tb_part_test
add partition (
 PARTITION p202201 VALUES LESS THAN ('2022-02-01:00') ENGINE = InnoDB
 );

Error Code: 1493. VALUES LESS THAN value must be strictly increasing for each partition



이럴 경우 REORGANIZE PARTITION 를 사용해야 합니다.
maxvalue 파티션은 p999999 에 대해서 REORGANIZE PARTITION 를 수행을 하면 됩니다.

mysql> ALTER TABLE test_db.tb_part_test
REORGANIZE PARTITION p999999 into (    
  partition p202201 values less than ('2022-02-01:00') engine=innodb,
  PARTITION p999999 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
);


이 경우도 MySQL 8.0 에서는 ALGORITHM=INPLACE 를 사용 할 수 있습니다.



4. 파티션 삭제

위에서 생성한 파티션을 다시 삭제 하도록 하겠습니다. 삭제는 maxvalue 파티션과 무관하게 아래의 명령어로 삭제를 할 수 있습니다.

-- 문법 : ALTER TABLE 테이블명 DROP PARTITION 파티션명;
mysql> ALTER TABLE test_db.tb_part_test DROP PARTITION p202012;

mysql> ALTER TABLE test_db.tb_part_test DROP PARTITION p202201;




연관된 다른 글

 

답글 남기기