오늘의 주제는 “Partition Exchange” 입니다.
파티션 테이블의 경우, 이전 게시글에서 다룬 내용이지만 오늘은 Partition Exchange
기능에 대해서 알아보려 합니다.
select TABLE_NAME
, PARTITION_NAME
, TABLE_LOWS
from infomation_schema.PARTITIONS
where TABLE_SCHEMA = 'test'
and TABLE_NAME = 'test01'
;
/*
+------------+----------------+------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS |
+------------+----------------+------------+
| test01 | p_20221127 | 982053 |
| test01 | p_20221128 | 9922 |
| test01 | p_20221129 | 0 |
+------------+----------------+------------+
3 rows in set (0.01 sec)
*/
[root@905c91ef6de5 test]# ls -lh
total 199M
-rw-r----- 1 mysql mysql 92M Nov 27 05:46 test01#p#p_20221027.ibd
-rw-r----- 1 mysql mysql 10M Nov 27 05:44 test01#p#p_20221028.ibd
-rw-r----- 1 mysql mysql 144K Nov 27 05:44 test01#p#p_20221029.ibd
-rw-r----- 1 mysql mysql 144K Nov 27 05:59 test_1#p#p_20221028.ibd
-rw-r----- 1 mysql mysql 144K Nov 27 05:47 test_1#p#p_20221029.ibd
-rw-r----- 1 mysql mysql 96M Nov 27 05:59 st.ibd
DROP PARTITION
방식으로 27일 자의 데이터를 삭제했을 때와 PARTITION EXCHAGNE
방식을 사용했을 때를 비교해 보겠습니다.# 1.
alter table test01 drop partition p_20221027
; -- 0.53s
# 2.
create table test02 like test01
;
alter table test02 remove partitioning
;
alter table test01 exchange partition p_20221027 with table test02
; -- 0.08s
alter table test01 drop partition p_20221027
; -- 0.07s
DROP PARTITION
방식의 경우 약 0.53초의 시간이 소요됨을 확인할 수 있었으며,PARTITION EXCHAGNE
방식의 경우 약 6배 빠른 0.08초의 시간이 소요됨을 확인할 수 있었습니다.PARTITION EXCHAGNE
방식을 통해 데이터가 존재하지 않기 때문에 삭제 작업이 매우 빠른 것 또한 확인이 가능합니다.create table [temp_table_name] like [table_name] )
alter table [temp_table_name] remove partitioning
remove
/ drop
명령어가 존재remove partitioning
: 파티션만 삭제하고 해당 데이터는 유지drop partition
: 파티션과 데이터 모두 삭제alter table [table_name] exchange partition [partition_name] with table [temp_table_name] )
drop table [temp_table_name]
CREATE TABLE AS SELECT
구문을 사용하면 안되는 이유!1. CREATE TABLE test.temp ( idx int(11) NOT NULL, name varchar(50) NOT NULL, PRIMARY KEY(idx), UNIQUE KEY(name) ); 2. CREATE TABLE test.temp_a AS SELECT * FROM test.temp ; 3. CREATE TABLE test.temp_b LIKE test.temp ; 4. SHOW CREATE TABLE test.temp_a ; CREATE TABLE test.temp_a ( idx int(11) NOT NULL, name varchar(50) NOT NULL ); 5. SHOW CREATE TABLE test.temp_b ; CREATE TABLE test.temp_b ( idx int(11) NOT NULL, name varchar(50) NOT NULL, PRIMARY KEY(idx), UNIQUE KEY(name) );
create table like
방식과 달리create table as select
방식은
기존 테이블의 키를 가져오지 않습니다.
exchange partition
사용 시, 두개의 테이블 구조가 모두 동일하지 않으면 에러 발생하기 때문에create table like
방식을 통해서 구조가 동일한 테이블을 생성해야 합니다.
🚨 마지막 파티션(1개 이하) 테이블에 [
REMOVE
|DROP
] PARTITION 명령어를 사용할 경우Cannot remove all partitions, use DROP TABLE instead
에러가 발생한다.
자세한 원인은 알 수 없으나, MySQL의 오류가 아닐까 싶네요.
<해결방법>ALTER TABLE [TABLE NAME] REMOVE PARTITIONING ;
select TABLE_SCHEMA
, TABLE_NAME
, PARTITION_NAME
, PARTITION_ORDINAL_POSITION
, TABLE_ROWS
from information_schema.partitions
where TABLE_SCHEMA = ''
and TABLE_NAME = ''
;
💡 오늘은 파티션 테이블에 존재하는 데이터를
Partition Exchange
기능을 통해 안전하게 삭제하는 법을 알아보았습니다.
Partition Exchange
기능을 통해서 파티션 테이블의 데이터를 삭제하더라도 항상 서버의 상황을 고려하여 최대한 안전한 상황에서 작업을 진행해야 한다는 것을 잊지 말아야 합니다.