13.1.7.2 MySQL Cluster에서 ALTER TABLE 온라인 조작
이 섹션에서는 MySQL Cluster에서 구현 된 온라인 테이블 스키마 변경에 대해 설명합니다. InnoDB
스토리지 엔진 또한 MySQL Cluster에서 지원하는 것과 다른 구문을 사용하여 이러한 작업을 온라인으로 수행 할 수 있습니다. 자세한 내용은 섹션 14.11 "InnoDB와 온라인 DDL" 를 참조하십시오.
NDB
테이블의 가변 폭 컬럼에 인덱스를 추가 및 제거 작업은 온라인으로 실행됩니다. 온라인 작업은 복사하지 않고 있습니다. 즉, 인덱스를 다시 만들 필요가 없습니다. 변경되는 테이블은 MySQL Cluster 내의 다른 API 노드 액세스에서 고정 될 수는 없습니다 (단,이 섹션의 나머지 부분에있는 "제한"을 참조하십시오). 이러한 작업은 여러 API 노드를 포함하는 클러스터에서 열리는 NDB
테이블의 변경에 단일 사용자 모드는 필요하지 않습니다. 온라인 DDL 작업 중에도 트랜잭션은 중단없이 계속할 수 있습니다.
ONLINE
키워드를 사용하면 NDB
테이블에 대해 온라인 ADD COLUMN
, ADD INDEX
( CREATE INDEX
문을 포함) 및 DROP INDEX
작업을 수행 할 수 있습니다. 또한 NDB
테이블의 온라인 이름 변경도 지원됩니다.
ONLINE
및 OFFLINE
키워드는 MySQL Cluster에서만 지원됩니다. 표준 MySQL Server 5.6 릴리스에서는 ONLINE
또는 OFFLINE
키워드를 ALTER TABLE
, CREATE INDEX
또는 DROP INDEX
문에서 사용하려고하면 오류가 발생합니다.
ONLINE
및 OFFLINE
키워드는 MySQL Cluster NDB 7.3에서 비추천입니다. MySQL Cluster NDB 7.4에서 계속 지원되지만 이후 버전의 MySQL Cluster에서 삭제 될 수 있습니다.
현재 디스크 기반의 컬럼을 NDB
테이블에 온라인으로 추가 할 수 없습니다. 즉, 테이블 수준 STORAGE DISK
옵션을 사용하는 NDB
테이블에 인 메모리 컬럼을 추가 할 경우 새 컬럼을 메모리 기반 스토리지의 사용으로 명시 적으로 선언해야합니다. 예를 들어, 이미 테이블 스페이스 ts1
을 작성하고 있다고 가정하여 테이블 t1
을 다음과 같이 작성하면됩니다.
mysql>CREATE TABLE t1 (
>c1 INT NOT NULL PRIMARY KEY,
>c2 VARCHAR(30)
>)
>TABLESPACE ts1 STORAGE DISK
>ENGINE NDB;
Query OK, 0 rows affected (1.73 sec) Records : 0 Duplicates : 0 Warnings : 0
다음과 같이 새로운 인 메모리 컬럼이 테이블에 온라인으로 추가 할 수 있습니다.
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY;
Query OK, 0 rows affected (1.25 sec)
Records : 0 Duplicates : 0 Warnings : 0
STORAGE MEMORY
옵션이 생략되는 경우,이 문은 실패합니다.
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC;
ERROR 1235 (42000) : This version of MySQL does not yet support
'ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC'
COLUMN_FORMAT DYNAMIC
옵션을 생략하면 동적 컬럼 형식이 자동으로 사용되지만 다음과 같은 경고가 발행됩니다.
mysql>ALTER ONLINE TABLE t1 ADD COLUMN c3 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1478 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>SHOW CREATE TABLE t1\G
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` varchar(30) DEFAULT NULL, `c3` int(11) /*!50120 STORAGE MEMORY */ /*!50120 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, `t4` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL, PRIMARY KEY (`c1`) ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.03 sec)
STORAGE
및 COLUMN_FORMAT
키워드는 MySQL Cluster에서만 지원됩니다. 다른 어떤 버전의 MySQL에도이 두 가지 키워드를 CREATE TABLE
또는 ALTER TABLE
문에서 사용하려고하면 오류가 발생합니다.
NDB
테이블에서 문 ALTER ONLINE TABLE ... REORGANIZE PARTITION
을
옵션없이 사용할 수 있습니다. 이것을 사용하면 온라인 클러스터에 추가 된 새로운 데이터 노드 사이에서 MySQL Cluster 데이터를 재배포 할 수 있습니다. 이 문 자세한 내용은 섹션 13.1.7.1 "ALTER TABLE 파티션 작업" 을 참조하십시오. MySQL Cluster 데이터 노드를 온라인으로 추가하는 방법에 대한 자세한 내용은 섹션 18.5.13 "MySQL Cluster 데이터 노드의 온라인 추가" 를 참조하십시오. partition_names
INTO ( partition_definitions
)
MySQL Cluster 온라인 조작의 제한
온라인 DROP COLUMN
조작은 지원되지 않습니다.
컬럼을 추가하거나 인덱스를 추가 또는 삭제하는 온라인 ALTER TABLE
, CREATE INDEX
또는 DROP INDEX
문은 다음의 제한에 따릅니다.
특정 온라인
ALTER TABLE
에서ADD COLUMN
,ADD INDEX
,DROP INDEX
중 하나만 사용할 수 있습니다. 하나의 문에서 하나 이상의 컬럼을 온라인으로 추가 할 수 있습니다. 하나의 문에서 하나의 인덱스만을 온라인으로 만들거나 삭제할 수 있습니다.변경되는 테이블은 온라인
ALTER TABLE
ADD COLUMN
,ADD INDEX
또는DROP INDEX
조작 (또는CREATE INDEX
또는DROP INDEX
문)가 실행되는 API 노드 이외의 API 노드에 잠겨 없습니다. 그러나 온라인 작업이 실행되는 동안이 테이블은 동일한 API 노드에서 발생하는 다른 모든 작업에 잠겨 있습니다.변경되는 테이블에는 명시적인 기본 키가 존재해야합니다.
NDB
스토리지 엔진에 의해 생성 된 숨겨진 기본 키는이 목적으로는 충분하지 않습니다.테이블에 사용되는 스토리지 엔진을 온라인으로 변경할 수 없습니다.
MySQL Cluster 디스크 데이터 테이블에서 사용 된 경우, 컬럼의 저장 형 (
DISK
또는MEMORY
)를 온라인으로 변경할 수 없습니다. 즉, 조작이 온라인으로 수행되는 방식으로 인덱스를 추가하거나 제거 할 때 하나 이상의 컬럼의 저장 유형이 변경되도록하려면 인덱스를 추가 또는 삭제하는 명령문에서OFFLINE
키워드를 사용할 필요가 있습니다.
온라인으로 추가되는 컬럼은 BLOB
또는 TEXT
형을 사용할 수 없으며 다음의 조건을 충족해야합니다.
이 컬럼은 동적이어야합니다. 즉,
COLUMN_FORMAT DYNAMIC
를 사용하여 생성 할 수 있어야합니다.COLUMN_FORMAT DYNAMIC
옵션을 생략하면 동적 컬럼 형식이 자동으로 사용됩니다.이 컬럼은
NULL
값을 허용해야,NULL
이외의 명시적인 디폴트 값이 있어서는 안됩니다. 온라인으로 추가되는 컬럼은 다음과 같이DEFAULT NULL
로 자동으로 생성됩니다.mysql>
CREATE TABLE t1 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
>) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1
>ADD COLUMN c2 INT,
>ADD COLUMN c3 INT;
Query OK, 0 rows affected 2 warnings (0.93 sec) mysql>SHOW CREATE TABLE t1\G
*************************** 1. row ******************** ******* Table : t1 Create Table : CREATE TABLE`t1` ( `c1` int (11) NOT NULL AUTO_INCREMENT, `c2` int (11) DEFAULT NULL, `c3` int (11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE = ndbcluster DEFAULT CHARSET = latin1 1 row in set (0.00 sec)이 컬럼은 기존의 모든 컬럼 뒤에 추가해야합니다. 기존 하나의 컬럼 앞에 또는
FIRST
키워드를 사용하여 온라인으로 컬럼을 추가하려고하면이 문은 오류로 실패합니다.기존 테이블 컬럼을 온라인으로 정렬 할 수 없습니다.
이전 제한은 테이블 또는 컬럼의 이름을 변경하면 작업에는 적용되지 않습니다.
NDB
테이블에 대한 온라인 ALTER TABLE
조작의 경우, 고정 형식의 열은 다음과 같이 온라인으로 추가하거나 인덱스를 온라인으로 만들거나 삭제 된 경우 동적 열로 변환됩니다.
mysql>CREATE TABLE t1 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
>) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT;
Query OK, 0 rows affected, 2 warnings (0.93 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 2 rows in set (0.00 sec)
기존의 열 (테이블의 기본 키를 포함)은 동적 일 필요는 없습니다. 동적 인 필요가있는 것은 온라인으로 추가되는 하나 이상의 컬럼뿐입니다.
mysql>CREATE TABLE t2 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
>) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec) mysql>ALTER ONLINE TABLE t2 ADD COLUMN c2 INT;
Query OK, 0 rows affected, 1 warning (0.78 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
이름 변경 작업으로 인해 열이 FIXED
에서 DYNAMIC
컬럼 형식으로 변환되는 것은 아닙니다. COLUMN_FORMAT
대한 자세한 내용은 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오.
KEY
, CONSTRAINT
및 IGNORE
키워드는 ONLINE
키워드를 사용하는 ALTER TABLE
문에서 지원됩니다.