Loading...
MySQL 9.5 Reference Manual 9.5의 17.12.1 Online DDL Operations의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이 섹션의 다음 주제들에서 DDL operation에 대한 online 지원 세부사항, 구문 예제, 사용상 주의사항을 제공합니다.
다음 표는 index operation에 대한 online DDL 지원 개요를 제공합니다. 별표는 추가 정보, 예외, 또는 의존성이 있음을 나타냅니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.13 Online DDL Support for Index Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Creating or adding a secondary index | No | Yes | No | Yes | No |
| Dropping an index | No | Yes | No | Yes | Yes |
| Renaming an index | No | Yes | No | Yes | Yes |
Adding a FULLTEXT index | No | Yes* | No* | No | No |
Adding a SPATIAL index | No | Yes | No | No | No |
| Changing the index type | Yes | Yes | No | Yes | Yes |
1CREATE INDEX name ON table (col_list);
1ALTER TABLE tbl_name ADD INDEX name (col_list);
index가 생성되는 동안에도 table은 읽기 및 쓰기 operation에 사용할 수 있습니다.
CREATE INDEX 구문은 table에 접근하는 모든 트랜잭션이 완료된 후에야 끝나므로, index의 초기 상태는 table의 최신 내용을 반영합니다.
secondary index 추가에 대한 online DDL 지원은, 일반적으로 secondary index가 없는 상태에서 table과 관련 index를 생성 및 로딩한 후, 데이터 로딩이 끝난 뒤에 secondary index를 추가하는 방식으로 전체적인 처리 속도를 높일 수 있음을 의미합니다.
새로 생성된 secondary index에는 CREATE INDEX 또는 ALTER TABLE 구문이 실행을 마칠 당시 table에 존재하는 커밋된 데이터만 포함됩니다. 이 index에는 커밋되지 않은 값, 값의 오래된 버전, 혹은 삭제 대상으로 표시되었지만 아직 기존 index에서 제거되지 않은 값은 포함되지 않습니다.
여러 요소가 이 operation의 성능, 공간 사용량, 의미론에 영향을 줍니다. 자세한 내용은 Section 17.12.8, “Online DDL Limitations”을 참조하십시오.
1DROP INDEX name ON table;
1ALTER TABLE tbl_name DROP INDEX name;
index가 drop되는 동안에도 table은 읽기 및 쓰기 operation에 사용할 수 있습니다.
DROP INDEX 구문은 table에 접근하는 모든 트랜잭션이 완료된 후에야 끝나므로, index의 초기 상태는 table의 최신 내용을 반영합니다.
1ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
FULLTEXT index1CREATE FULLTEXT INDEX name ON table(column);
첫 번째 FULLTEXT index를 추가할 때, user-defined FTS_DOC_ID column이 없으면 table을 리빌드합니다. 이후 추가되는 FULLTEXT index는 table을 리빌드하지 않고 추가할 수 있습니다.
SPATIAL index1CREATE TABLE geom (g GEOMETRY NOT NULL); 2ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
USING {BTREE | HASH})1ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
다음 표는 primary key operation에 대한 online DDL 지원 개요를 제공합니다. 별표는 추가 정보, 예외, 또는 의존성이 있음을 나타냅니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.14 Online DDL Support for Primary Key Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a primary key | No | Yes* | Yes* | Yes | No |
| Dropping a primary key | No | No | Yes | No | No |
| Dropping a primary key and adding another | No | Yes | Yes | Yes | No |
1ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
table을 in-place로 리빌드합니다. 데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
컬럼을 NOT NULL로 변환해야 하는 조건에서는 ALGORITHM=INPLACE가 허용되지 않습니다.
clustered index를 재구조화하는 작업은 항상 table data 복사를 필요로 합니다. 따라서 table을 생성할 때 [ALTER TABLE ... ADD PRIMARY KEY]를 나중에 실행하는 대신, 처음부터 primary key를 정의하는 것이 가장 좋습니다.
UNIQUE 또는 PRIMARY KEY index를 생성할 때, MySQL은 일부 추가 작업을 수행해야 합니다. UNIQUE index의 경우, MySQL은 key에 대해 중복된 값이 table에 존재하지 않는지 확인합니다. PRIMARY KEY index의 경우, MySQL은 추가로 PRIMARY KEY 컬럼들에 NULL 값이 없는지도 확인합니다.
ALGORITHM=COPY 절을 사용해서 primary key를 추가할 때, MySQL은 관련 컬럼의 NULL 값을 기본값으로 변환합니다. 숫자형은 0, 문자 기반 컬럼 및 BLOB은 빈 문자열, DATETIME은 0000-00-00 00:00:00으로 변환됩니다. 이는 비표준 동작이므로 Oracle에서는 이를 신뢰하지 말 것을 권장합니다.
ALGORITHM=INPLACE를 사용하여 primary key를 추가하는 것은 SQL_MODE 설정에 strict_trans_tables 또는 strict_all_tables 플래그가 포함되어 있을 때에만 허용됩니다.
SQL_MODE가 strict인 경우 ALGORITHM=INPLACE는 허용되지만, 요청된 primary key 컬럼에 NULL 값이 있으면 구문은 실패할 수 있습니다. ALGORITHM=INPLACE 동작은 보다 표준을 준수합니다.
table을 primary key 없이 생성하면, InnoDB는 primary key를 대신 선택합니다. 이는 NOT NULL 컬럼에 정의된 첫 번째 UNIQUE key이거나, 시스템이 생성한 key일 수 있습니다. 불확실성과 추가 숨은 컬럼이 요구할 수 있는 공간 사용을 피하려면, CREATE TABLE 구문의 일부로 PRIMARY KEY 절을 명시적으로 지정하십시오.
MySQL은 원하는 index 구조를 갖는 임시 table로 원래 table에서 기존 데이터를 복사하여 새로운 clustered index를 생성합니다. 데이터가 임시 table로 완전히 복사되면, 원래 table은 다른 임시 table 이름으로 rename됩니다. 새로운 clustered index를 포함하는 임시 table은 원래 table 이름으로 rename되고, 원래 table은 데이터베이스에서 drop됩니다.
secondary index에 적용되는 online 성능 향상은 primary key index에는 적용되지 않습니다. InnoDB table의 row는 clustered index에 저장되며, primary key를 기준으로 구성됩니다. 이는 일부 데이터베이스 시스템에서 “index-organized table”이라고 부르는 형태를 이룹니다. table 구조가 primary key와 밀접하게 연관되어 있기 때문에, primary key를 재정의하는 작업은 여전히 데이터 복사를 필요로 합니다.
primary key에 대한 operation이 ALGORITHM=INPLACE를 사용할 때, 데이터가 여전히 복사되긴 하지만 ALGORITHM=COPY를 사용하는 것보다 더 효율적인데, 그 이유는 다음과 같습니다:
ALGORITHM=INPLACE에서는 undo 로깅이나 관련 redo 로깅이 필요 없습니다. 이들 operation은 ALGORITHM=COPY를 사용하는 DDL 구문에 오버헤드를 추가합니다.
secondary index 엔트리들이 미리 정렬되어 있으므로, 순서대로 로드할 수 있습니다.
secondary index에 랜덤 액세스 insert가 없으므로, change buffer가 사용되지 않습니다.
Dropping a primary key
1ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;
새로운 primary key를 같은 ALTER TABLE 구문에서 추가하지 않고 primary key를 drop하는 작업은 ALGORITHM=COPY만 지원합니다.
1ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
다음 표는 column operation에 대한 online DDL 지원 개요를 제공합니다. 별표는 추가 정보, 예외, 또는 의존성이 있음을 나타냅니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.15 Online DDL Support for Column Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a column | Yes* | Yes | No* | Yes* | Yes |
| Dropping a column | Yes* | Yes | Yes | Yes | Yes |
| Renaming a column | Yes* | Yes | No | Yes* | Yes |
| Reordering columns | No | Yes | Yes | Yes | No |
| Setting a column default value | Yes | Yes | No | Yes | Yes |
| Changing the column data type | No | No | Yes | No | No |
Extending VARCHAR column size | No | Yes | No | Yes | Yes |
| Dropping the column default value | Yes | Yes | No | Yes | Yes |
| Changing the auto-increment value | No | Yes | No | Yes | No* |
Making a column NULL | No | Yes | Yes* | Yes | No |
Making a column NOT NULL | No | Yes* | Yes* | Yes | No |
Modifying the definition of an ENUM or<br> SET column | Yes | Yes | No | Yes | Yes |
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|
1ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
INSTANT는 MySQL 9.5에서 기본 알고리즘입니다.
INSTANT 알고리즘을 사용해 column을 추가할 때 다음 제한 사항이 적용됩니다:
구문은 INSTANT 알고리즘을 지원하지 않는 다른 ALTER TABLE 액션들과 column 추가를 함께 수행할 수 없습니다.
INSTANT 알고리즘은 table 내 어떤 위치에도 column을 추가할 수 있습니다.
ROW_FORMAT=COMPRESSED를 사용하는 table, FULLTEXT index가 있는 table, 데이터 딕셔너리 테이블스페이스에 위치한 table, 또는 임시 table에는 column을 추가할 수 없습니다. 임시 table은 ALGORITHM=COPY만 지원합니다.
MySQL은 INSTANT 알고리즘으로 column을 추가할 때 row 크기를 검사하며, 추가가 한도를 초과하면 다음 오류를 발생시킵니다.
ERROR 4092 (HY000): Column can't be added with ALGORITHM=INSTANT as after this max possible row size crosses max permissible row size. Try ALGORITHM=INPLACE/COPY.
INSTANT 알고리즘으로 column을 추가한 이후 table의 내부 표현에서 column 최대 개수는 1022를 초과할 수 없습니다. 오류 메시지는 다음과 같습니다:
ERROR 4158 (HY000): Column can't be added to
tbl_name with
ALGORITHM=INSTANT anymore. Please try
ALGORITHM=INPLACE/COPY
INSTANT 알고리즘은 내부 mysql table과 같은 시스템 스키마 table에 column을 추가하거나 drop할 수 없습니다.
functional index가 있는 column은 INSTANT 알고리즘을 사용해 drop할 수 없습니다.
여러 column은 동일한 ALTER TABLE 구문에서 추가할 수 있습니다. 예를 들면 다음과 같습니다:
1ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
ALTER TABLE ... ALGORITHM=INSTANT operation이 하나 이상의 column을 추가하거나, 하나 이상의 column을 drop하거나, 동일한 operation에서 하나 이상의 column을 추가 및 drop할 때마다 새로운 row 버전이 생성됩니다.
INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS column은 table에 대한 row 버전 수를 추적합니다. column이 instant로 추가되거나 drop될 때마다 값이 증가합니다. 초기 값은 0입니다.
1mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES 2 WHERE NAME LIKE 'test/t1'; 3+---------+--------------------+ 4| NAME | TOTAL_ROW_VERSIONS | 5+---------+--------------------+ 6| test/t1 | 0 | 7+---------+--------------------+
instant로 column을 추가하거나 drop한 table이 table-rebuilding ALTER TABLE 또는 OPTIMIZE TABLE operation에 의해 리빌드될 때, TOTAL_ROW_VERSIONS 값은 0으로 reset됩니다. 허용되는 최대 row 버전 수는 255입니다. 각 row 버전은 table 메타데이터를 위한 추가 공간을 필요로 하기 때문입니다. row 버전 한도에 도달하면, ALGORITHM=INSTANT를 사용하는 ADD COLUMN 및 DROP COLUMN operation은, COPY 또는 INPLACE 알고리즘을 사용해 table을 리빌드할 것을 권장하는 오류 메시지와 함께 거부됩니다.
ERROR 4092 (HY000): Maximum row versions reached for table test/t1. No more columns can be added or dropped instantly. Please use COPY/INPLACE.
다음 INFORMATION_SCHEMA column들은 instant로 추가된 column에 대한 추가 메타데이터를 제공합니다. 자세한 내용은 해당 column 설명을 참조하십시오. See Section 28.4.9, “The INFORMATION_SCHEMA INNODB_COLUMNS Table”, and Section 28.4.23, “The INFORMATION_SCHEMA INNODB_TABLES Table”.
INNODB_COLUMNS.DEFAULT_VALUE
INNODB_COLUMNS.HAS_DEFAULT
INNODB_TABLES.INSTANT_COLS
auto-increment column을 추가할 때는 동시 DML이 허용되지 않습니다. 데이터가 대폭 재조직되므로, 비용이 큰 operation입니다. 최소한 ALGORITHM=INPLACE, LOCK=SHARED가 필요합니다.
column을 추가하는 데 ALGORITHM=INPLACE를 사용하면 table이 리빌드됩니다.
1ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INSTANT;
INSTANT는 MySQL 9.5에서 기본 알고리즘입니다.
column을 drop할 때 INSTANT 알고리즘을 사용할 경우 다음 제한 사항이 적용됩니다:
column drop은 ALGORITHM=INSTANT를 지원하지 않는 다른 ALTER TABLE 액션들과 동일 구문에서 함께 수행할 수 없습니다.
ROW_FORMAT=COMPRESSED를 사용하는 table, FULLTEXT index가 있는 table, 데이터 딕셔너리 테이블스페이스에 위치한 table, 또는 임시 table에서는 column을 drop할 수 없습니다. 임시 table은 ALGORITHM=COPY만 지원합니다.
여러 column은 동일한 ALTER TABLE 구문에서 drop할 수 있습니다. 예를 들면 다음과 같습니다:
1ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;
ALGORITHM=INSTANT를 사용해 column을 추가하거나 drop할 때마다 새로운 row 버전이 생성됩니다.
INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS column은 table에 대한 row 버전 수를 추적합니다. column이 instant로 추가되거나 drop될 때마다 값이 증가합니다. 초기 값은 0입니다.
1mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES 2 WHERE NAME LIKE 'test/t1'; 3+---------+--------------------+ 4| NAME | TOTAL_ROW_VERSIONS | 5+---------+--------------------+ 6| test/t1 | 0 | 7+---------+--------------------+
instant로 column을 추가하거나 drop한 table이 table-rebuilding ALTER TABLE 또는 OPTIMIZE TABLE operation에 의해 리빌드될 때, TOTAL_ROW_VERSIONS 값은 0으로 reset됩니다. 허용되는 최대 row 버전 수는 255입니다. 각 row 버전은 table 메타데이터를 위한 추가 공간을 필요로 하기 때문입니다. row 버전 한도에 도달하면, ALGORITHM=INSTANT를 사용하는 ADD COLUMN 및 DROP COLUMN operation은, COPY 또는 INPLACE 알고리즘을 사용해 table을 리빌드할 것을 권장하는 오류 메시지와 함께 거부됩니다.
ERROR 4092 (HY000): Maximum row versions reached for table test/t1. No more columns can be added or dropped instantly. Please use COPY/INPLACE.
ALGORITHM=INSTANT 이외의 알고리즘을 사용하는 경우, 데이터가 대폭 재조직되므로 비용이 큰 operation입니다.
1ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INSTANT;
동시 DML을 허용하려면, 동일한 data type을 유지하고 column 이름만 변경하십시오.
동일한 data type 및 [NOT] NULL 속성을 유지하고 column 이름만 변경하는 경우, 이 operation은 항상 online으로 수행할 수 있습니다.
다른 table에서 참조되는 column의 이름 변경은 ALGORITHM=INPLACE에서만 허용됩니다. ALGORITHM=INSTANT, ALGORITHM=COPY 또는, operation이 해당 알고리즘들을 사용하도록 만드는 다른 조건을 사용할 경우, ALTER TABLE 구문은 실패합니다.
ALGORITHM=INSTANT는 virtual column rename을 지원하지만, ALGORITHM=INPLACE는 지원하지 않습니다.
ALGORITHM=INSTANT와 ALGORITHM=INPLACE는 동일 구문에서 virtual column을 추가하거나 drop하면서 column 이름을 변경하는 작업을 지원하지 않습니다. 이 경우에는 ALGORITHM=COPY만 지원됩니다.
column을 재배치하려면 CHANGE 또는 MODIFY operation에서 FIRST 또는 AFTER를 사용하십시오.
1ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
1ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;
column data type 변경은 ALGORITHM=COPY에서만 지원됩니다.
VARCHAR column size1ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;
VARCHAR column에 필요한 length byte 수는 동일하게 유지되어야 합니다.
0에서 255 byte 크기의 VARCHAR column에는 값을 인코딩하기 위해 한 개의 length byte가 필요합니다.
256 byte 이상 크기의 VARCHAR column에는 두 개의 length byte가 필요합니다. 그 결과, in-place ALTER TABLE는 VARCHAR column 크기를 0에서 255 byte로, 또는 256 byte에서 그 이상으로 증가시키는 경우만 지원합니다. in-place ALTER TABLE는 VARCHAR column 크기를 256 byte 미만에서 256 byte 이상으로 늘리는 작업은 지원하지 않습니다. 이 경우 필요한 length byte 수가 1에서 2로 변경되며, 이는 table copy (ALGORITHM=COPY)에서만 지원됩니다. 예를 들어, single byte 문자 집합에 대해 VARCHAR(255)에서 VARCHAR(256)으로 VARCHAR column 크기를 in-place ALTER TABLE로 변경하려고 하면, 다음 오류가 반환됩니다:
1ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); 2ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change 3column type INPLACE. Try ALGORITHM=COPY.
참고
VARCHAR column의 byte 길이는 character set의 byte 길이에 따라 달라집니다.
in-place ALTER TABLE를 사용해 VARCHAR 크기를 줄이는 것은 지원되지 않습니다. VARCHAR 크기를 줄이려면 table copy (ALGORITHM=COPY)가 필요합니다.
1ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;
table 메타데이터만 수정합니다. column 기본값은 data dictionary에 저장됩니다.
1ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
1ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
데이터 파일이 아니라 메모리에 저장된 값을 수정합니다.
replication 또는 샤딩을 사용하는 분산 시스템에서, 특정 값으로 table의 auto-increment 카운터를 재설정하는 경우가 있습니다. table에 삽입되는 다음 row는 auto-increment column에 대해 지정된 값을 사용합니다. 모든 table을 주기적으로 비우고 다시 로드한 뒤, auto-increment 시퀀스를 1부터 다시 시작하는 데이터 웨어하우징 환경에서도 이 기법을 사용할 수 있습니다.
NULL1ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
table을 in-place로 리빌드합니다. 데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
NOT NULL1ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
table을 in-place로 리빌드합니다. operation이 성공하려면 STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES SQL_MODE가 필요합니다. column에 NULL 값이 있으면 operation은 실패합니다. 서버는 referential integrity 손실 가능성이 있는 foreign key 컬럼 변경을 금지합니다. See Section 15.1.11, “ALTER TABLE Statement”. 데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
ENUM or SET column1CREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); 2ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
ENUM 또는 SET column 정의를 수정하면서, 유효한 멤버 값 목록의 끝 에 새 enumeration 또는 set 멤버를 추가하는 작업은, data type의 storage 크기가 변경되지 않는 한 instant 또는 in-place로 수행할 수 있습니다. 예를 들어, 8개 멤버를 가진 SET column에 멤버를 하나 추가하면, 값당 필요한 storage가 1 byte에서 2 byte로 변경되며, 이 경우 table copy가 필요합니다. 목록 중간에 멤버를 추가하면 기존 멤버의 번호가 다시 매겨지므로, table copy가 필요합니다.
다음 표는 generated column operation에 대한 online DDL 지원 개요를 제공합니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.16 Online DDL Support for Generated Column Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
Adding a STORED column | No | No | Yes | No | No |
Modifying STORED column order | No | No | Yes | No | No |
Dropping a STORED column | No | Yes | Yes | Yes | No |
Adding a VIRTUAL column | Yes | Yes | No | Yes | Yes |
Modifying VIRTUAL column order | No | No | Yes | No | No |
Dropping a VIRTUAL column | Yes | Yes | No | Yes | Yes |
STORED column1ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
ADD COLUMN은 stored column에 대해서는(임시 table을 사용하지 않고 수행되는 in-place operation) in-place operation이 아닙니다. 표현식은 서버가 평가해야 하기 때문입니다.
STORED column order1ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;
table을 in-place로 리빌드합니다.
STORED column1ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
table을 in-place로 리빌드합니다.
VIRTUAL column1ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;
virtual column 추가는 non-partitioned table의 경우 instant 또는 in-place로 수행할 수 있습니다.
partitioned table에서는 VIRTUAL 추가가 in-place operation이 아닙니다.
VIRTUAL column order1ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
VIRTUAL column1ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;
VIRTUAL column drop은 non-partitioned table의 경우 instant 또는 in-place로 수행할 수 있습니다.
다음 표는 foreign key operation에 대한 online DDL 지원 개요를 제공합니다. 별표는 추가 정보, 예외, 또는 의존성이 있음을 나타냅니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.17 Online DDL Support for Foreign Key Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a foreign key constraint | No | Yes* | No | Yes | Yes |
| Dropping a foreign key constraint | No | Yes | No | Yes | Yes |
foreign_key_checks가 비활성화되어 있을 때는 INPLACE 알고리즘이 지원됩니다. 그렇지 않으면 COPY 알고리즘만 지원됩니다.
1ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1) 2 REFERENCES tbl2(col2) referential_actions;
1ALTER TABLE tbl DROP FOREIGN KEY fk_name;
foreign_key_checks 옵션이 활성 또는 비활성 상태 모두에서, foreign key drop은 online으로 수행할 수 있습니다.
특정 table에 대한 foreign key constraint 이름을 모를 경우, 다음 구문을 실행하고 각 foreign key에 대한 CONSTRAINT 절에서 constraint 이름을 확인하십시오:
1SHOW CREATE TABLE table\G
또는, Information Schema의 TABLE_CONSTRAINTS table을 조회하여 CONSTRAINT_NAME 및 CONSTRAINT_TYPE column을 사용해 foreign key 이름을 식별할 수 있습니다.
다음과 같이 한 구문에서 foreign key와 그에 연관된 index를 함께 drop할 수도 있습니다:
1ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
참고
table이 이미 foreign key를 가지고 있는 경우(즉, FOREIGN KEY ... REFERENCE 절을 포함하는 child table인 경우), foreign key column과 직접 관련되지 않은 online DDL operation에도 추가적인 제약이 적용됩니다:
child table에 대한 ALTER TABLE은, parent table에 대한 변경이 CASCADE 또는 SET NULL 파라미터를 사용하는 ON UPDATE 또는 ON DELETE 절을 통해 child table에 연관된 변경을 일으키는 경우, 다른 트랜잭션이 커밋되기를 기다릴 수 있습니다.
동일한 방식으로, foreign key 관계에서 table이 parent table인 경우, 비록 이 table이 어떤 FOREIGN KEY 절도 포함하지 않더라도, INSERT, UPDATE, 또는 DELETE 구문이 child table에서 ON UPDATE 또는 ON DELETE action을 일으키는 경우, ALTER TABLE이 완료될 때까지 기다릴 수 있습니다.
다음 표는 table operation에 대한 online DDL 지원 개요를 제공합니다. 별표는 추가 정보, 예외, 또는 의존성이 있음을 나타냅니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.18 Online DDL Support for Table Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
Changing the ROW_FORMAT | No | Yes | Yes | Yes | No |
Changing the KEY_BLOCK_SIZE | No | Yes | Yes | Yes | No |
| Setting persistent table statistics | No | Yes | No | Yes | Yes |
| Specifying a character set | No | Yes | Yes* | Yes | No |
| Converting a character set | No | Yes | Yes* | No | No |
| Optimizing a table | No | Yes* | Yes | Yes | No |
Rebuilding with the FORCE option | No | Yes* | Yes | Yes | No |
| Performing a null rebuild | No | Yes* | Yes | Yes | No |
| Renaming a table | Yes | Yes | No | Yes | Yes |
ROW_FORMAT1ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;
데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
ROW_FORMAT 옵션에 대한 추가 정보는 Table Options를 참조하십시오.
KEY_BLOCK_SIZE1ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;
데이터가 대폭 재조직되므로, 비용이 큰 operation입니다.
KEY_BLOCK_SIZE 옵션에 대한 추가 정보는 Table Options를 참조하십시오.
1ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;
table 메타데이터만 수정합니다.
persistent statistics에는 STATS_PERSISTENT, STATS_AUTO_RECALC, STATS_SAMPLE_PAGES가 포함됩니다. 자세한 내용은 Section 17.8.10.1, “Configuring Persistent Optimizer Statistics Parameters”를 참조하십시오.
1ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;
새 character 인코딩이 기존 것과 다르면 table을 리빌드합니다.
1ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=INPLACE, LOCK=NONE;
새 character 인코딩이 기존 것과 다르면 table을 리빌드합니다.
1OPTIMIZE TABLE tbl_name;
FULLTEXT index가 있는 table에서는 in-place operation이 지원되지 않습니다. 이 operation은 INPLACE 알고리즘을 사용하지만, ALGORITHM 및 LOCK 구문은 허용되지 않습니다.
FORCE option1ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
MySQL 5.6.17부터 ALGORITHM=INPLACE를 사용합니다. FULLTEXT index가 있는 table에 대해서는 ALGORITHM=INPLACE가 지원되지 않습니다.
1ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
MySQL 5.6.17부터 ALGORITHM=INPLACE를 사용합니다. FULLTEXT index가 있는 table에 대해서는 ALGORITHM=INPLACE가 지원되지 않습니다.
1ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
table rename은 instant 또는 in-place로 수행할 수 있습니다. MySQL은 복사 없이 _tbl_name_에 해당하는 파일들의 이름을 변경합니다.
(table rename에는 RENAME TABLE 구문도 사용할 수 있습니다. See Section 15.1.41, “RENAME TABLE Statement”.) rename된 table에 대해 명시적으로 부여된 권한은 새 이름으로 이전되지 않습니다. 수동으로 변경해야 합니다.
다음 표는 tablespace operation에 대한 online DDL 지원 개요를 제공합니다. 자세한 내용은 Syntax and Usage Notes를 참조하십시오.
Table 17.19 Online DDL Support for Tablespace Operations
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Renaming a general tablespace | No | Yes | No | Yes | Yes |
| Enabling or disabling general tablespace encryption | No | Yes | No | Yes | No |
| Enabling or disabling file-per-table tablespace encryption | No | No | Yes | No | No |
1ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;
ALTER TABLESPACE ... RENAME TO는 INPLACE 알고리즘을 사용하지만 ALGORITHM 절은 지원하지 않습니다.
1ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
ALTER TABLESPACE ... ENCRYPTION는 INPLACE 알고리즘을 사용하지만 ALGORITHM 절은 지원하지 않습니다.
관련 정보는 Section 17.13, “InnoDB Data-at-Rest Encryption”을 참조하십시오.
1ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
관련 정보는 Section 17.13, “InnoDB Data-at-Rest Encryption”을 참조하십시오.
일부 ALTER TABLE partitioning 절을 제외하고, partitioned InnoDB table에 대한 online DDL operation은 일반 InnoDB table에 적용되는 동일한 규칙을 따릅니다.
일부 ALTER TABLE partitioning 절은 일반 non-partitioned InnoDB table과 동일한 내부 online DDL API를 거치지 않습니다. 그 결과, ALTER TABLE partitioning 절에 대한 online 지원은 절마다 다릅니다.
다음 표는 각 ALTER TABLE partitioning 구문에 대한 online status를 보여줍니다. 사용되는 online DDL API와 관계없이, MySQL은 가능한 한 data copy와 locking을 최소화하려고 시도합니다.
ALGORITHM=COPY를 사용하거나, “ALGORITHM=DEFAULT, LOCK=DEFAULT”만 허용하는 ALTER TABLE partitioning 옵션은 COPY 알고리즘을 사용해 table을 재파티셔닝합니다. 즉, 새로운 partitioning scheme을 사용하는 새 partitioned table이 생성됩니다. 새로 생성된 table에는 ALTER TABLE 구문으로 적용된 변경 사항이 모두 포함되며, table data는 새로운 table 구조로 복사됩니다.
Table 17.20 Online DDL Support for Partitioning Operations
| Partitioning Clause | Instant | In Place | Permits DML | Notes |
|---|---|---|---|---|
PARTITION BY | No | No | No | Permits ALGORITHM=COPY,<br> `LOCK={DEFAULT |
ADD PARTITION | No | Yes* | Yes* | `ALGORITHM=INPLACE,<br> LOCK={DEFAULT |
DROP PARTITION | No | Yes* | Yes* | `ALGORITHM=INPLACE,<br> LOCK={DEFAULT |
DISCARD PARTITION | No | No | No | Only permits ALGORITHM=DEFAULT,<br> LOCK=DEFAULT |
IMPORT PARTITION | No | No | No | Only permits ALGORITHM=DEFAULT,<br> LOCK=DEFAULT |
TRUNCATE<br> PARTITION | No | Yes | Yes | Does not copy existing data. It merely deletes rows; it does not alter<br> the definition of the table itself, or of any of its<br> partitions. |
COALESCE<br> PARTITION | No | Yes* | No | `ALGORITHM=INPLACE, LOCK={DEFAULT |
REORGANIZE<br> PARTITION | No | Yes* | No | `ALGORITHM=INPLACE, LOCK={DEFAULT |
EXCHANGE<br> PARTITION | No | Yes | Yes | |
ANALYZE PARTITION | No | Yes | Yes | |
CHECK PARTITION | No | Yes | Yes | |
OPTIMIZE<br> PARTITION | No | No | No | ALGORITHM and LOCK clauses are<br> ignored. Rebuilds the entire table. See<br> Section 26.3.4, “Maintenance of Partitions”. |
REBUILD PARTITION | No | Yes* | No | `ALGORITHM=INPLACE, LOCK={DEFAULT |
REPAIR PARTITION | No | Yes | Yes | |
REMOVE<br> PARTITIONING | No | No | No | Permits ALGORITHM=COPY,<br> `LOCK={DEFAULT |
| Partitioning Clause | Instant | In Place | Permits DML | Notes |
|---|
partitioned table에 대한 non-partitioning online ALTER TABLE operation은 일반 table에 적용되는 동일한 규칙을 따릅니다. 그러나, ALTER TABLE는 각 table partition에 대해 online operation을 수행하므로, 여러 partition에서 operation이 수행되기 때문에 시스템 리소스 요구량이 증가합니다.
ALTER TABLE partitioning 절에 대한 추가 정보는 Partitioning Options 및 Section 15.1.11.1, “ALTER TABLE Partition Operations”를 참조하십시오. partitioning 전반에 대한 정보는 Chapter 26, Partitioning을 참조하십시오.
17.12 InnoDB and Online DDL
17.12.2 Online DDL Performance and Concurrency