13.1.7.1 ALTER TABLE 파티션 작업
ALTER TABLE
의 분할 관련 조항은 다시 분할 파티션의 추가, 삭제, 병합 및 분할, 분할의 유지 관리 수행 등을 위해 파티션 된 테이블에서 사용할 수 있습니다.
단순히 파티션 된 테이블에
ALTER TABLE
에서partition_options
절을 사용하는 것만으로partition_options
에 정의 된 파티셔닝 방법에 따라 그 테이블을 다시 분할됩니다. 이 절은 항상PARTITION BY
로 시작하고CREATE TABLE
의partition_options
절에 적용되는 것과 동일한 구문 및 기타 규칙을 따릅니다 (자세한 내용은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오). 또한 아직 분할되지 않은 기존 테이블의 분할에도 사용할 수 있습니다. 예를 들어, 다음과 같이 정의 된 (분할되지 않은) 테이블을 생각해 보겠습니다.CREATE TABLE t1 ( id INT, year_col INT );
이 테이블은 다음 문을 사용하여
id
컬럼을 파티셔닝 키를 사용하여HASH
의해 8 개의 파티션으로 분할 할 수 있습니다.ALTER TABLE t1 PARTITION BY HASH (id) PARTITIONS 8;
MySQL 5.6.11 이후에서는
[SUB]PARTITION BY [LINEAR] KEY
로ALGORITHM
옵션이 지원됩니다.ALGORITHM=1
을 지정하면 서버는 파티션 내의 행의 위치를 계산할 때 MySQL 5.1과 같은 키 해시 함수를 사용합니다.ALGORITHM=2
는 서버가 MySQL 5.5 이상에서 구현되고KEY
에 의해 분할 된 새 테이블에서 기본적으로 사용되는 키 해시 함수를 사용하는 것을 나타냅니다. (MySQL 5.5 이상에서 채택 된 키 해시 함수에 의해 생성 된 파티션 된 테이블을 MySQL 5.1 서버에서 사용할 수 없습니다.)이 옵션을 지정하지 않는 경우는ALGORITHM=2
를 사용하는 것과 같은 효과 수 있습니다. 이 옵션은 주로[LINEAR] KEY
로 파티션 된 테이블을 MySQL 5.1 이후의 MySQL 버전간에 업그레이드하거나 다운 그레이드 할 때 사용하거나 MySQL 5.5 이후의 서버에서 MySQL 5.1 서버에서 사용할 수있는KEY
또는LINEAR KEY
로 파티션 된 테이블을 만드는 것을 목적으로하고 있습니다.MySQL 5.1에서 생성 된
KEY
로 파티션 된 테이블을 업그레이드하려면 먼저SHOW CREATE TABLE
을 실행하고 표시되는 정확한 컬럼 및 파티션 수를 기록합니다. 다음은CREATE TABLE
문과 동일한 컬럼 목록 및 파티션 수를 사용하여ALTER TABLE
문을 실행하지만 그 때PARTITION BY
키워드 직후ALGORITHM=2
를 추가합니다. (원래 테이블 정의에LINEAR
키워드가 사용 된 경우 해당 키워드 포함되어야합니다.) mysql 클라이언트 세션의 예를 보여줍니다.mysql>
SHOW CREATE TABLE p\G
*************************** 1. row ******************** ******* Table : p Create Table : CREATE TABLE`p` ( `id` int (11) NOT NULL AUTO_INCREMENT, `cd` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1 / *! 50100 PARTITION BY LINEAR KEY (id) PARTITIONS 32 * / 1 row in set (0.00 sec) mysql>ALTER TABLE p
PARTITION BY LINEAR KEY ALGORITHM = 2 (id) PARTITIONS 32;
Query OK, 0 rows affected (5.34 sec) Records : 0 Duplicates : 0 Warnings : 0 mysql>SHOW CREATE TABLE p\G
*************************** 1. row ******************** ******* Table : p Create Table : CREATE TABLE`p` ( `id` int (11) NOT NULL AUTO_INCREMENT, `cd` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = latin1 / *! 50100 PARTITION BY LINEAR KEY (id) PARTITIONS 32 * / 1 row in set (0.00 sec)MySQL 5.5 이상에서 사용되는 기본 키 해시를 사용하여 생성 된 테이블을 MySQL 5.1 서버에서 사용할 수 있도록 다운 그레이드하는 경우에도 마찬가지입니다. 그러나이 경우 해당 테이블의 파티션이 강제로 MySQL 5.1의 키 해시 함수를 사용하여 재 구축되도록
ALGORITHM=1
을 사용하도록하십시오. MySQL 5.5 이상에서 기본적으로 사용되는 개선 된KEY
해시 함수는 이전 구현에서 발견 된 많은 문제에 대한 수정 프로그램이 제공되기 때문에 MySQL 5.1 서버와의 호환성을 위해 필요한 경우를 제외하고 이에 은하지 않도록하는 것이 좋습니다.참고ALTER TABLE ... PARTITION BY ALGORITHM=2 [LINEAR] KEY ...
를 사용하여 업그레이드 된 테이블은 MySQL 5.1 서버에서는 사용할 수 없습니다. (이러한 테이블을 MySQL 5.1 서버에서 다시 사용할 수 있도록하려면ALTER TABLE ... PARTITION BY ALGORITHM=1 [LINEAR] KEY ...
를 사용하여 다운 그레이드해야합니다.)ALTER TABLE ... PARTITION BY
문을 사용하여 작성된 테이블은CREATE TABLE ... PARTITION BY
를 사용하여 작성된 테이블과 같은 규칙을 따라야합니다. 여기에는 테이블에 포함되어있을 가능성이있는 모든 고유 키 (모든 기본 키를 포함)와 분할 식으로 사용되는 하나 이상의 열 사이의 관계를 관리 규칙이 포함됩니다. 이 내용은 섹션 19.6.1 "파티셔닝 키, 기본 키 및 고유 키" 로 설명되어 있습니다. 또한 파티션의 수를 지정하기위한CREATE TABLE ... PARTITION BY
규칙도ALTER TABLE ... PARTITION BY
에 적용됩니다.ALTER TABLE ADD PARTITION
의partition_definition
절은CREATE TABLE
문에 같은 이름의 어구와 같은 옵션을 지원합니다. (구문과 설명은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.) 다음과 같이 생성 된 파티션 된 테이블이 있다고합니다.CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991) PARTITION p1 VALUES LESS THAN (1995) PARTITION p2 VALUES LESS THAN (1999) );
이 테이블에
2002
보다 작은 값을 저장하기위한 새로운 파티션p3
를 다음과 같이 추가 할 수 있습니다.ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
DROP PARTITION
을 사용하면 하나 이상의RANGE
또는LIST
파티션을 삭제할 수 있습니다. 이 문을HASH
또는KEY
파티션에 사용할 수 없습니다. 대신에COALESCE PARTITION
을 사용합니다 (아래를 참조하십시오).partition_names
목록에 이름이 지정되어 삭제 된 파티션에 저장되어 있던 데이터는 모두 삭제됩니다. 예를 들어, 이전에 정의 된 테이블t1
의 경우,p0
및p1
이라는 이름의 파티션을 다음과 같이 삭제할 수 있습니다.ALTER TABLE t1 DROP PARTITION p0, p1;
참고DROP PARTITION
는NDB
스토리지 엔진을 사용하는 테이블에서는 작동하지 않습니다. 섹션 19.3.1 "RANGE 및 LIST 파티션 관리" 및 섹션 18.1.6 "MySQL Cluster의 알려진 제한 사항" 을 참조하십시오.ADD PARTITION
와DROP PARTITION
은 현재IF [NOT] EXISTS
를 지원하지 않습니다.파티션 된 테이블의 이름 변경을 지원하고 있습니다.
ALTER TABLE ... REORGANIZE PARTITION
을 사용하여 간접적으로 개별 파티션의 이름을 변경할 수 있습니다. 그러나이 작업은 파티션의 데이터 복사본이 생성됩니다.MySQL 5.6에서는
TRUNCATE PARTITION
옵션을 사용하여 선택한 파티션의 행을 삭제할 수 있습니다. 이 옵션은 하나 이상의 파티션 이름의 쉼표로 구분 된 목록을받습니다. 예를 들어, 다음과 같이 정의 된 테이블t1
을 생각해 보겠습니다.CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991) PARTITION p1 VALUES LESS THAN (1995) PARTITION p2 VALUES LESS THAN (1999) PARTITION p3 VALUES LESS THAN (2003) PARTITION p4 VALUES LESS THAN (2007) );
파티션
p0
의 모든 행을 삭제하려면 다음 문을 사용할 수 있습니다.ALTER TABLE t1 TRUNCATE PARTITION p0;
지금 나타낸 문은 다음
DELETE
문과 같은 효과가 있습니다.DELETE FROM t1 WHERE year_col <1991;
여러 파티션을 절약 경우 파티션이 연속하고있을 필요는 없습니다. 이는 일반적으로
DELETE
문에서 실행 된 경우는 매우 복잡한WHERE
조건이 필요할 파티션 된 테이블에서 삭제 작업이 간소화 될 수 있습니다. 예를 들어, 다음 명령문은 파티션p1
과p3
의 모든 행을 삭제합니다.ALTER TABLE t1 TRUNCATE PARTITION p1, p3;
동등한
DELETE
문을 보여줍니다.DELETE FROM t1 WHERE (year_col> = 1991 AND year_col <1995) OR (year_col> = 2003 AND year_col <2007);
파티션 이름 목록 대신
ALL
키워드를 사용할 수 있습니다. 이 경우,이 문은 테이블의 모든 파티션에 대해 작동합니다.TRUNCATE PARTITION
행을 삭제하면됩니다. 테이블 자체 나 어떤 파티션의 정의도 변경되지 않습니다.참고TRUNCATE PARTITION
하위 파티션에서는 작동하지 않습니다.다음과 같은 쿼리를 사용하여
INFORMATION_SCHEMA.PARTITIONS
테이블을 확인하여 행이 삭제 된 것을 확인할 수 있습니다.SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1';
TRUNCATE PARTITION
은MyISAM
,InnoDB
또는MEMORY
스토리지 엔진을 사용하는 파티션 된 테이블에서만 지원됩니다. 또한BLACKHOLE
테이블에서도합니다 (그러나 아무런 효과도 없습니다).ARCHIVE
테이블에서는 지원되지 않습니다.HASH
또는KEY
로 파티션 된 테이블에서COALESCE PARTITION
을 사용하면 파티션의 수를number
만 줄일 수 있습니다. 다음의 정의를 사용하여 테이블t2
을 만들었다 고합니다.CREATE TABLE t2 ( name VARCHAR (30) started DATE ) PARTITION BY HASH (YEAR (started)) PARTITIONS 6;
t2
에서 사용되는 파티션의 수를 다음 문을 사용하여 6-4로 줄일 수 있습니다.ALTER TABLE t2 COALESCE PARTITION 2;
마지막
number
개의 파티션에 들어있는 데이터는 나머지 파티션 병합됩니다. 이 경우 파티션 4와 5가 첫 4 개의 파티션 (0,1,2 및 3의 번호를 가진 각 파티션)에 병합됩니다.파티션 된 테이블에서 사용되는 (전부는 아니지만) 일부 파티션을 변경하려면
REORGANIZE PARTITION
을 사용할 수 있습니다. 이 문은 다음의 몇 가지 방법으로 사용할 수 있습니다.일련의 파티션을 단일 파티션으로 병합합니다. 이것은
partition_names
목록에 여러 파티션의 이름을 지정하고partition_definition
에 하나의 정의를 지정하여 실행할 수 있습니다.기존의 파티션을 여러 파티션으로 분할합니다. 이것은
partition_names
단일 파티션을 지정하고 여러partition_definitions
을 지정하여 실행할 수 있습니다.VALUES LESS THAN
를 사용하여 정의 된 파티션의 부분 집합의 범위를 변경하거나VALUES IN
을 사용하여 정의 된 파티션의 부분 집합의 값 목록을 변경합니다.이 문은 또한
HASH
파티셔닝을 사용하여 자동으로 분할 된 테이블에
옵션없이 사용하면 데이터를 강제로 재배포 할 수 있습니다. (현재 이렇게 자동으로 분할되는 것은partition_names
INTO (partition_definitions
)NDB
테이블뿐입니다.) 이것은 기존의 MySQL Cluster 새로운 MySQL Cluster 데이터 노드를 온라인으로 추가 한 후 기존의 MySQL Cluster 테이블 데이터를 새로운 데이터 노드에 다시 배포해야 MySQL Cluster에 도움이됩니다. 이러한 경우ONLINE
옵션을 사용하여이 문을 호출하도록하십시오. 즉, 다음과 같이합니다.ALTER ONLINE TABLE
table
REORGANIZE PARTITION;온라인 테이블 재구성과 동시에 다른 DDL을 수행 할 수 없습니다. 즉,
ALTER ONLINE TABLE ... REORGANIZE PARTITION
문이 실행되는 동안 다른 DDL 문을 발행 할 수 없습니다. MySQL Cluster 데이터 노드를 온라인으로 추가하는 방법에 대한 자세한 내용은 섹션 18.5.13 "MySQL Cluster 데이터 노드의 온라인 추가" 를 참조하십시오.ALTER ONLINE TABLE ... REORGANIZE PARTITION
은MAX_ROWS
옵션을 사용하여 작성된 테이블에서는 작동하지 않습니다. 이 문은 원래CREATE TABLE
문에서 지정된 일정의MAX_ROWS
값을 사용하여 필요한 파티션의 수를 결정하기 위해 새로운 파티션을 생성하지 않기 때문입니다. 테이블 행의 최대 수를 늘리려면ALTER ONLINE TABLE ... MAX_ROWS=
를 사용할 수 있습니다. 이 후rows
ALTER ONLINE TABLE ... REORGANIZE PARTITION
이 커진 새로운 값을 사용하여 파티션의 수를 늘릴 수 있습니다. 이 기능하려면rows
값을 원래CREATE TABLE
문에서MAX_ROWS
에 지정된 값보다 커야합니다.명시 적으로 분할 된 테이블에 대해
REORGANIZE PARTITION
을
옵션없이 사용하려고하면 REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH partitioning 오류가 발생합니다.partition_names
INTO (partition_definitions
)
참고명시 적으로 이름이 지정되지 않은 파티션에 대해 MySQL은 자동으로
p0
,p1
,p2
등의 기본 이름을 지정합니다. 같은 일이 서브 파티션에 적용됩니다.ALTER TABLE ... REORGANIZE PARTITION
문의 자세한 내용 및 예제는 섹션 19.3.1 "RANGE 및 LIST 파티션 관리" 를 참조하십시오.MySQL 5.6에서는
ALTER TABLE ... EXCHANGE PARTITION
문을 사용하여 테이블 파티션 또는 서브 파티션을 다른 테이블과 교환 할 수 있습니다. 즉, 파티션 또는 서브 파티션의 기존의 모든 행을 분할되지 않은 테이블로 이동하거나 분할되지 않은 테이블에서 기존의 모든 행을 테이블 파티션 또는 서브 파티션으로 이동 할 수 있습니다 .사용 방법 및 예제는 섹션 19.3.3 "파티션과 서브 파티션 테이블로 교체" 를 참조하십시오.
몇 가지 추가 옵션에 따라 분할되지 않은 테이블에 대한
CHECK TABLE
과REPAIR TABLE
과 같은 명령문에 의해 구현되는 기능 (이 작업은 파티션 된 테이블에서 지원됩니다. 자세한 내용은 섹션 13.7. 2 "테이블 유지 보수 문" 을 참조하십시오)과 유사한 파티션의 유지 보수 및 수리 기능이 제공됩니다. 여기에는ANALYZE PARTITION
,CHECK PARTITION
,OPTIMIZE PARTITION
,REBUILD PARTITION
및REPAIR PARTITION
이 포함됩니다. 이러한 각 옵션은 하나 이상의 파티션 이름 갖춰진 쉼표로 구분 된partition_names
절을받습니다. 이 파티션은 변경 될 테이블에 이미 존재해야합니다.partition_names
대신ALL
키워드를 사용할 수 있습니다. 그 경우,이 문은 테이블의 모든 파티션에서 작동합니다. 자세한 내용 및 예제는 섹션 19.3.4 "파티션 관리" 를 참조하십시오.InnoDB
등의 일부 MySQL 스토리지 엔진은 각 파티션의 최적화를 지원하지 않습니다. 이러한 스토리지 엔진을 사용하여 파티션 된 테이블에 대해ALTER TABLE ... OPTIMIZE PARTITION
은 전체 테이블을 재구성합니다. 이것은 알려진 문제입니다. MySQL 5.6.9에서이 같은 테이블에이 문을 실행하면 테이블 전체가 재 구축 및 분석하고 해당 경고가 발행됩니다. (Bug # 11751825, Bug # 42822)이 문제를 해결하려면 대신 문
ALTER TABLE ... REBUILD PARTITION
및ALTER TABLE ... ANALYZE PARTITION
을 사용합니다.ANALYZE PARTITION
,CHECK PARTITION
,OPTIMIZE PARTITION
및REPAIR PARTITION
옵션은 분할되지 않은 테이블에는 허용되지 않습니다.REMOVE PARTITIONING
을 사용하면 테이블의 분할을 삭제할 수 있으며, 그 테이블이나 데이터는 그렇지 영향을받지 않습니다. 이 옵션은 컬럼이나 인덱스의 추가, 삭제, 이름 변경 등을 위해 사용되는 기타ALTER TABLE
옵션과 함께 사용할 수 있습니다.ALTER TABLE
에서ENGINE
옵션을 사용하면 파티션에 영향을주지 않고 테이블에 사용되는 스토리지 엔진이 변경됩니다.
MySQL 5.6.6 이전에는 MyISAM
(또는 테이블 수준의 잠금을 사용하는 다른 스토리지 엔진)을 사용하는 파티션 된 테이블에 ALTER TABLE ... EXCHANGE PARTITION
또는 ALTER TABLE ... TRUNCATE PARTITION
이 실행되면 그 분할 된 테이블 전체가 락되었습니다. MySQL 5.6.6 이후에서는 이러한 경우 실제로 읽은 파티션 만 고정됩니다. 이것은 행 레벨 락을 채용하고있다 ( InnoDB
등) 스토리지 엔진을 사용하는 파티션 된 테이블에 영향을주지 않았다 (현재도 영향을주지 않습니다). 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.
ALTER TABLE
문에는 다른 변경 지정 이외에 PARTITION BY
또는 REMOVE PARTITIONING
절을 포함 할 수 있지만 PARTITION BY
또는 REMOVE PARTITIONING
절은 다른 어떤 지정보다 앞으로의 마지막에 지정해야 있습니다.
ADD PARTITION
, DROP PARTITION
, COALESCE PARTITION
, REORGANIZE PARTITION
, ANALYZE PARTITION
, CHECK PARTITION
및 REPAIR PARTITION
옵션은 개별 파티션에 대해 작동하므로 하나의 ALTER TABLE
내에서 다른 변경 지정과 함께 사용할 수 없습니다. 자세한 내용은 섹션 13.1.7.1 "ALTER TABLE 파티션 작업" 을 참조하십시오.
특정 ALTER TABLE
문은 다음 중 하나의 옵션의 단일 인스턴스 만 사용할 수 있습니다. PARTITION BY
, ADD PARTITION
, DROP PARTITION
, TRUNCATE PARTITION
, EXCHANGE PARTITION
, REORGANIZE PARTITION
또는 COALESCE PARTITION
, ANALYZE PARTITION
, CHECK PARTITION
, OPTIMIZE PARTITION
, REBUILD PARTITION
, REMOVE PARTITIONING
.
예를 들어, 다음 두 명령문은 유효하지 않습니다.
ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2; ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;
첫 번째 경우는 다음과 같이 분석되는 두 파티션을 나열하는 하나의 ANALYZE PARTITION
옵션을 포함하는 하나의 문을 사용하여 테이블 t1
파티션 p1
과 p2
를 동시에 분석 할 수 있습니다.
ALTER TABLE t1 ANALYZE PARTITION p1, p2;
두 번째 경우는 같은 테이블의 다른 파티션에 대한 ANALYZE
작업 및 CHECK
작업을 동시에 수행 할 수 없습니다. 대신 다음과 같이 두 개의 개별 문을 실행해야합니다.
ALTER TABLE t1 ANALYZE PARTITION p1; ALTER TABLE t1 CHECK PARTITION p2;
ANALYZE
, CHECK
, OPTIMIZE
, REBUILD
, REPAIR
및 TRUNCATE
조작은 서브 파티션은 지원되지 않습니다.