Loading...
MySQL 9.5 Reference Manual 9.5의 25.6.12 Online Operations with ALTER TABLE in NDB Cluster의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL NDB Cluster는
ALTER TABLE ... ALGORITHM=DEFAULT|INPLACE|COPY를 사용하여 online 테이블 스키마 변경을 지원합니다. NDB Cluster는
다음 단락들에서 설명하는 대로 COPY 및 INPLACE를 처리합니다.
ALGORITHM=COPY의 경우,
mysqld NDB Cluster 핸들러는 다음 작업을 수행합니다:
데이터 노드에 빈 테이블 복사본을 생성하고, 이 복사본에 필요한 스키마 변경을 적용하도록 지시합니다.
원본 테이블에서 행을 읽어 복사본에 씁니다.
데이터 노드에 원본 테이블을 드롭한 다음 복사본의 이름을 변경하도록 지시합니다.
이는 때때로 “copying” 또는 “offline” ALTER TABLE이라고 부릅니다.
DML 작업은 copying ALTER TABLE과 동시에 수행될 수 없습니다.
copying ALTER TABLE 문장이 실행되는
mysqld는 메타데이터 락을 획득하지만,
이는 해당 mysqld에만 실제로 영향을 미칩니다. 다른
NDB 클라이언트는 copying ALTER TABLE
중에 행 데이터를 수정할 수 있으며, 그 결과 일관성이 깨질 수 있습니다.
ALGORITHM=INPLACE의 경우, NDB Cluster 핸들러는
데이터 노드에 필요한 변경을 적용하도록 지시하며, 데이터 복사를 수행하지 않습니다.
이는 “non-copying” 또는
“online” ALTER TABLE이라고도 합니다.
non-copying ALTER TABLE은 동시 DML
작업을 허용합니다.
ALGORITHM=INSTANT는 NDB
9.5에서 지원되지 않습니다.
사용된 알고리즘에 관계없이,
mysqld는 ALTER TABLE을 실행하는 동안 Global Schema Lock (GSL)을
획득합니다. 이는 클러스터 내 이 SQL 노드 또는 다른 어떤 SQL 노드에서도
동시에 다른 DDL이나 백업을 실행하는 것을 방지합니다.
이는 일반적으로 문제가 되지 않지만,
ALTER TABLE이 매우 오랫동안 실행되는 경우는 예외입니다.
참고
이전의 일부 NDB Cluster 릴리스는 online ALTER TABLE 작업에 대해
NDB에 특화된 구문을 사용했습니다.
해당 구문은 이후 제거되었습니다.
가변 길이 컬럼에 대한 인덱스를 추가 및 삭제하는
NDB 테이블에 대한 작업은 online으로 수행됩니다.
online 작업은 noncopying이며, 즉 인덱스를 다시 생성할 필요가 없습니다.
이들은 변경되는 테이블에 대해 다른 API 노드가 접근하는 것을
차단하지 않습니다(그러나 이 섹션의 뒷부분에 나오는
Limitations of NDB online operations를 참조하십시오).
이러한 작업은 여러 API 노드가 있는 NDB 클러스터에서
NDB 테이블 변경을 위해 단일 사용자 모드를
요구하지 않습니다. online DDL 작업 동안에도 트랜잭션은
끊김 없이 계속될 수 있습니다.
ALGORITHM=INPLACE는 online으로
ADD COLUMN, ADD INDEX
(CREATE INDEX 문장 포함),
DROP INDEX 작업을
NDB 테이블에 대해 수행하는 데 사용할 수 있습니다.
NDB 테이블의 online 이름 변경도 지원됩니다.
디스크 기반 컬럼은 online으로
NDB 테이블에 추가할 수 없습니다.
이는 테이블 수준의 STORAGE DISK 옵션을 사용하는
NDB 테이블에 인메모리 컬럼을 추가하려는 경우,
새 컬럼이 명시적으로 메모리 기반 스토리지를 사용하도록 선언해야 함을 의미합니다.
예를 들어—이미 테이블스페이스 ts1을 생성했다고 가정하면—
다음과 같이 테이블 t1을 생성한다고 가정합니다:
1mysql> CREATE TABLE t1 ( 2 > c1 INT NOT NULL PRIMARY KEY, 3 > c2 VARCHAR(30) 4 > ) 5 > TABLESPACE ts1 STORAGE DISK 6 > ENGINE NDB; 7Query OK, 0 rows affected (1.73 sec) 8Records: 0 Duplicates: 0 Warnings: 0
다음과 같이 online으로 이 테이블에 새로운 인메모리 컬럼을 추가할 수 있습니다:
1mysql> ALTER TABLE t1 2 > ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY, 3 > ALGORITHM=INPLACE; 4Query OK, 0 rows affected (1.25 sec) 5Records: 0 Duplicates: 0 Warnings: 0
STORAGE MEMORY
옵션을 생략하면 이 문장은 실패합니다:
1mysql> ALTER TABLE t1 2 > ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC, 3 > ALGORITHM=INPLACE; 4ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: 5Adding column(s) or add/reorganize partition not supported online. Try 6ALGORITHM=COPY.
COLUMN_FORMAT DYNAMIC 옵션을 생략하면
동적 컬럼 포맷이 자동으로 사용되지만,
다음과 같이 경고가 발생합니다:
1mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY; 2Query OK, 0 rows affected, 1 warning (1.17 sec) 3Records: 0 Duplicates: 0 Warnings: 0 4 5mysql> SHOW WARNINGS\G 6*************************** 1. row *************************** 7 Level: Warning 8 Code: 1478 9Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will 10become FIXED 11 12mysql> SHOW CREATE TABLE t1\G 13*************************** 1. row *************************** 14 Table: t1 15Create Table: CREATE TABLE `t1` ( 16 `c1` int(11) NOT NULL, 17 `c2` varchar(30) DEFAULT NULL, 18 `c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, 19 `c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL, 20 PRIMARY KEY (`c1`) 21) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 221 row in set (0.03 sec)
참고
STORAGE 및
COLUMN_FORMAT 키워드는
NDB Cluster에서만 지원됩니다. 다른 어떤 MySQL 버전에서든
CREATE TABLE 또는
ALTER TABLE
문장에서 이 키워드 중 하나라도 사용하려 하면 오류가 발생합니다.
또한 ALTER TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE 문장을
partition_names INTO (partition_definitions)
옵션 없이 NDB 테이블에 사용할 수도 있습니다.
이는 online으로 클러스터에 새로 추가된 데이터 노드 사이에서
NDB Cluster 데이터를 재분배하는 데 사용할 수 있습니다.
이는 어떠한 디프래그먼테이션도 수행하지 않으며,
디프래그먼테이션에는 OPTIMIZE TABLE 또는
널 ALTER TABLE 문장이 필요합니다.
자세한 내용은
Section 25.6.7, “Adding NDB Cluster Data Nodes Online”을 참조하십시오.
online DROP COLUMN 작업은
지원되지 않습니다.
컬럼을 추가하거나 인덱스를 추가 또는 삭제하는 online
ALTER TABLE,
CREATE INDEX 또는
DROP INDEX 문장은
다음과 같은 제한 사항이 있습니다:
주어진 online [ALTER TABLE](https://dev.mysql.com/doc/refman/9.5/en/alter-table.html "15.1.11 ALTER TABLE Statement)은
ADD COLUMN, ADD INDEX, DROP INDEX 중
하나만 사용할 수 있습니다. 하나의 문장에서 여러 컬럼을
online으로 추가할 수 있지만, 하나의 문장에서 online으로
생성되거나 드롭될 수 있는 인덱스는 하나뿐입니다.
변경되는 테이블은 online
ALTER TABLE ADD COLUMN, ADD INDEX, 또는
DROP INDEX 작업(또는
CREATE INDEX 또는
DROP INDEX 문장)이 실행되는
API 노드 이외의 노드에 대해서는 락되지 않습니다.
그러나 online 작업이 실행되는 동안에는
같은 API 노드에서 발생하는 다른 어떤 작업에 대해서도
해당 테이블은 락됩니다.
변경할 테이블에는 명시적인 프라이머리 키가 있어야 합니다;
NDB 스토리지 엔진이 생성하는
숨겨진 프라이머리 키는 이 목적에 충분하지 않습니다.
테이블에 사용되는 스토리지 엔진은 online으로 변경할 수 없습니다.
테이블에서 사용되는 테이블스페이스는 online으로 변경할 수 없습니다.
다음과 같은 문장은
ALTER TABLE\\ ndb_table ... ALGORITHM=INPLACE,\\ TABLESPACE=new_tablespace
형태로 명시적으로 허용되지 않습니다.
NDB Cluster Disk Data 테이블과 함께 사용하는 경우,
컬럼의 스토리지 타입(DISK 또는
MEMORY)을 online으로 변경할 수 없습니다.
즉, online으로 수행될 작업 방식으로 인덱스를 추가 또는 삭제하면서
컬럼의 스토리지 타입을 변경하려는 경우,
인덱스를 추가하거나 삭제하는 문장에서
ALGORITHM=COPY를 사용해야 합니다.
online으로 추가할 컬럼은
BLOB 또는
TEXT 타입을 사용할 수 없으며,
다음 기준을 충족해야 합니다:
컬럼은 동적이어야 합니다. 즉,
COLUMN_FORMAT DYNAMIC을 사용하여
생성할 수 있어야 합니다. COLUMN_FORMAT DYNAMIC
옵션을 생략하면 동적 컬럼 포맷이 자동으로 사용됩니다.
컬럼은 NULL 값을 허용해야 하며,
NULL 이외의 어떤 명시적 기본값도
가질 수 없습니다. online으로 추가된 컬럼은
자동으로 DEFAULT NULL로 생성되며,
다음에서 볼 수 있습니다:
1mysql> CREATE TABLE t2 ( 2 > c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY 3 > ) ENGINE=NDB; 4Query OK, 0 rows affected (1.44 sec) 5 6mysql> ALTER TABLE t2 7 > ADD COLUMN c2 INT, 8 > ADD COLUMN c3 INT, 9 > ALGORITHM=INPLACE; 10Query OK, 0 rows affected, 2 warnings (0.93 sec) 11 12mysql> SHOW CREATE TABLE t1\G 13*************************** 1. row *************************** 14 Table: t1 15Create Table: CREATE TABLE `t2` ( 16 `c1` int(11) NOT NULL AUTO_INCREMENT, 17 `c2` int(11) DEFAULT NULL, 18 `c3` int(11) DEFAULT NULL, 19 PRIMARY KEY (`c1`) 20) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 211 row in set (0.00 sec)
컬럼은 기존 컬럼 뒤에 추가되어야 합니다.
기존 컬럼 앞에 컬럼을 online으로 추가하거나
FIRST 키워드를 사용하려 하면,
해당 문장은 오류와 함께 실패합니다.
기존 테이블 컬럼은 online으로 재정렬할 수 없습니다.
NDB 테이블에 대한 online
ALTER TABLE 작업에서는,
online으로 컬럼이 추가되거나 인덱스가 online으로
생성 또는 삭제될 때 고정 포맷 컬럼이 동적으로 변환됩니다.
이는(명확성을 위해 바로 앞에서 보인 CREATE TABLE 및
ALTER TABLE 문장을 반복하여) 다음과 같습니다:
1mysql> CREATE TABLE t2 ( 2 > c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY 3 > ) ENGINE=NDB; 4Query OK, 0 rows affected (1.44 sec) 5 6mysql> ALTER TABLE t2 7 > ADD COLUMN c2 INT, 8 > ADD COLUMN c3 INT, 9 > ALGORITHM=INPLACE; 10Query OK, 0 rows affected, 2 warnings (0.93 sec) 11 12mysql> SHOW WARNINGS; 13*************************** 1. row *************************** 14 Level: Warning 15 Code: 1478 16Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN 17*************************** 2. row *************************** 18 Level: Warning 19 Code: 1478 20Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN 212 rows in set (0.00 sec)
online으로 추가될 컬럼만 동적이어야 합니다.
기존 컬럼은 그럴 필요가 없습니다.
이는 테이블의 프라이머리 키도 포함하며,
다음에서 볼 수 있듯이 FIXED일 수도 있습니다:
1mysql> CREATE TABLE t3 ( 2 > c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED 3 > ) ENGINE=NDB; 4Query OK, 0 rows affected (2.10 sec) 5 6mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE; 7Query OK, 0 rows affected, 1 warning (0.78 sec) 8Records: 0 Duplicates: 0 Warnings: 0 9 10mysql> SHOW WARNINGS; 11*************************** 1. row *************************** 12 Level: Warning 13 Code: 1478 14Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN 151 row in set (0.00 sec)
컬럼은 이름 변경 작업에 의해
FIXED에서 DYNAMIC 컬럼 포맷으로
변환되지 않습니다. COLUMN_FORMAT에 대한 자세한 내용은
Section 15.1.24, “CREATE TABLE Statement”을 참조하십시오.
KEY, CONSTRAINT,
IGNORE 키워드는
ALGORITHM=INPLACE를 사용하는
ALTER TABLE 문장에서
지원됩니다.
online ALTER TABLE 문장을 사용하여
MAX_ROWS를 0으로 설정하는 것은 허용되지 않습니다.
이 작업을 수행하려면 copying ALTER TABLE을
사용해야 합니다. (Bug #21960004)
25.6.11 NDB Cluster Disk Data Tables
25.6.13 Privilege Synchronization and NDB_STORED_USER