MySQL Online DDL - InnoDB Online DDL - Alter Online

Share

Last Updated on 7월 12, 2024 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 MySQL Index 의 online DDL 에 대한 내용과 버전 별 내용을 확인해보도록 하겠습니다.

Fast Index Creation

예전 버전의(5.1~5.5) 에서는 Secondary Index에 대한 Fast Index Creation 외에는 테이블 변경 작업 시(DDL) Online 되지 않아 다른 세션의 read , write 작업 모두가 blocking 되었습니다.

이 버전(예전 버전)에서는 테이블 스키마 구조를 변경하게 되면 

임시 빈 테이블 생성 -> 새 테이블에 하나씩 one-by-one 복사 ->
 행이 삽입될 때 인덱스를 업데이트 수행

그리고 원본 테이블의 모든 행이 새로운 테이블로 복사 -> 원본 테이블이 삭제되고 새로운 복사본 테이블의 이름이 원본 테이블 이름으로 rename 되는 형식으로 처리되었습니다.


MySQL 5.5 이상 또는 InnoDB 플러그인이 있는 MySQL 5.1을 사용하면 InnoDB 테이블에 대한 Secondary Index 생성 및 삭제가 이전보다 훨씬 빠르게 수행할 수 있게 기능이 개선되었습니다


이전 포스팅 참조: Fast Index Creation In InnoDB 기능


* MySQL 5.6 버전의 내용은 5.7버전은 아래에 이어지게 됩니다.
              

MySQL Online DDL

Fast Index Creation 기능이 추가된 5.5 버전의 DDL 처리에 대한 부분이 개선되어 MySQL 5.6 부터 DDL 작업에 대해서 Online DDL 이 추가되었습니다.

Online DDL 기능은 테이블 복사 피하기 위해 CREATE INDEX 및 DROP INDEX를 최적화한 MySQL 5.5에서 사용할 수 있는 Fast Index Creation In InnoDB 기능을 기반으로 합니다

Online DDL 기능은 In-Place 방식의 테이블 변경 과 concurrent DML을 지원하며 이 기능의 장점은 다음과 같습니다.

- 비지니스 적인 다운타임이 불가능한 중요 업무의 운영 환경에서 응답성과 가용성이 향상
- LOCK 절을 사용하여 DDL 작업 중에 성능과 동시성 간의 균형을 조정하는 기능을 제공(Lock 방식 선택)
- 테이블 복사 방법보다 디스크 공간 사용량과 I/O 오버 헤드가 적으며 Undo 를 생성하지 않아 더 효율적인 처리


* 5.6, 5.7 ,8.0 버전 마다 Online DDL의 지원범위가 조금씩은 상이 함으로 버전별로 확인은 필요 합니다.

https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html

명령어 문법)
SQL> alter table 테이블명 add index 인덱스명(컬럼명,컬럼명),
ALGORITHM=[방식], LOCK=[방식];
             

Online - Algorithm

우선 Online DDL 수행 시 ALTER TABLE 작업은 다음 알고리즘 중 하나를 선택하여 처리됩니다.
(MySQL 8.0 버전은 아래에 내용이 별도로 있습니다)

MySQL 5.6, 5.7 ALGORITHM 구문은 다음과 같이 지정할 수 있습니다.
 - INPLACE, COPY
             

INPLACE

INPLACE(인프레이스) 방식은 원본 테이블에 직접 변경 작업이 발생합니다.

작업의 준비(during preparation) 및 실행 단계에서(execution phases of the operation) 테이블에 대한 배타적 메타 데이터 잠금(exclusive metadata lock)이 잠깐 동안 수행될 수 있습니다.

일반적으로 Concurrent DML이 지원됩니다.



InnoDB 테이블의 Online DDL 작업 중에 발생되는 concurrent DML에 대한 임시 로그 파일 크기로 innodb_online_alter_log_max_size 지정된 사이즈만큼 저장이 가능하고 크기를 초과하면 온라인 DDL 작업이 실패하고 Concurrent DML 작업이 롤백 됩니다.

innodb_online_alter_log_max_size 파라미터의 default 값은 128MB 입니다.

이 임시 파일은 DDL 작업 중에 테이블에 Concurrent DML 데이터를 저장합니다.

임시 파일은 innodb_sort_buffer_size 값 단위로 사용되며 최대 innodb_online_alter_log_max_size에 값까지 사용 가능 합니다.

따라서 이 옵션의 값이 크면 Online DDL 작업 중에 더 많은 DML 에 대해서 처리가 가능하지만, 다시 임시 로그의 데이터를 적용하기 위해서 DDL 작업이 끝나는 때의 기간도 연장됩니다.



INPLACE 에 가능 여부 확인


INPLACE 에 대해서 명시적으로 지원여부를 확인하려면 ALGORITHM=INPLACE 구문을 사용할 수 있습니다.

만약 지원하지 않는 DDL 구문이라면 아래와 같이 에러가 발생됩니다.
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
              

COPY

COPY ALGORITHM 는 DDL 수행 시 원본 테이블의 복사본 테이블을(복제하는 방식) 생성하여 row 단위로 새로운 테이블에 one-by-one 복사를 하는 처리 방식을 사용합니다.

복사가 완료된 후 복사본 테이블이 원본 테이블명으로 rename 처리되는 방식입니다.
Concurrent DML은 허용되지 않습니다(select 는 가능, LOCK=SHARED 가능)


              

COPY 알고리즘의 단점

ALGORITHM=COPY 사용시

  - DDL 작업을 일시 중지하거나 작업 중에 I/O 또는 CPU 사용을 제한하는 메커니즘은 없음

  - 작업 중 문제 발생시 롤백이 발생될 수 있으며 롤백은 많은 비용이 소모되는 작업임
  - ALTER 테이블 동안 Concurrent DML은 허용되지 않습니다.
  - 상황에 따라서 복제 지연이 발생 소지가 있음


ALGORITHM 구문 생략 또는 DEFAULT 지정시

ALGORITHM=INPLACE 이 사용 가능한 구문에 대해서는 우선 사용하며 그렇지 않을 경우 ALGORITHM=COPY 로 사용되게 됩니다.

즉 ALGORITHM 구문 미사용시 INPLACE -> COPY 순으로 처리됩니다.
               

Lock Clause

LOCK 절은 테이블에 대한 동시 액세스 수준을 미세 조정하는 데 유용합니다. ALGORITHM 절은 수행되는 방식에 따라서 주로 성능적인 차이를 보이는데 반해 LOCK 절은 동시 Access 에 대한 차이를 보입니다.

기본적으로 MySQL은 DDL 작업 중에 가능한 한 작은 Level의 Lock을 사용합니다. 필요한 경우 더 제한적인 잠금을 적용하기 위해 LOCK 절을 지정할 수 있습니다.

LOCK 절이 특정 DDL 조작에 허용되는 것보다 더 적은 제한적인 Lock 레벨을 지정하면 SQL Statement 는 오류와 함께 실패합니다.
LOCK 절은 가장 제한적인 순서로 아래에 설명되어 있습니다.

LOCK=NONE
Concurrent query 와 Concurrent DML 을 허용 합니다.

LOCK=SHARED

Concurrent query 허용되지만 Concurrent DML 불가합니다.

LOCK=DEFAULT

수행 가능한 동시성 작업에 대해서 허용합니다(concurrent queries, concurrent DML, or both)
LOCK clause 를 생략할 경우 LOCK=DEFAULT 과 동일 합니다.

LOCK=EXCLUSIVE

Concurrent query 와 Concurrent DML 둘 다 불가 합니다.
빠른 시간 내에 DDL이 완료되거나, 동시 쿼리나 DML의 액세스가 필요하지 않을 경우 사용합니다.
              

Online DDL 및 Metadata Lock

Online DDL 작업은 세 단계로(3 phases) 구분됩니다.

Phase 1: Initialization


초기화 단계에서 Storage Engine 기능, 명령문으로 지정된 작업, 사용자 지정의 algorithm 및 LOCK 옵션을 고려하여 작업에 허용가능한 옵션을 결정합니다.
이 단계에서 테이블의 정의를 보호하기 위해 가능한 shared upgradeable metadata lock 을 수행합니다.

Phase 2: Execution

이 단계에서는 명령문이 준비되고 실행됩니다.
Metadata lock 의 exclusive 여부는 Phase 1 평가된 내역에 따라 다르며, exclusive Metadata lock 이 필요한 경우 alter 문을 준비하는 동안 잠깐 수행됩니다

Phase 3: Commit Table Definition

테이블의 구조가 완료되는 phase 입니다.
metadata lock은 테이블 정의를 커밋하기 위해 exclusive로 업그레이드됩니다 배타적 메타 데이터 lock은 기간은 매우 짧습니다.


위에 설명된 exclusive metadata lock은 요구 사항으로 인해 온라인 DDL 작업은 커밋 또는 롤백을 위해 테이블에 metadata lock을 보유하는 동시 트랜잭션을 기다려야 할 수 있습니다.

Online DDL 작업에서 exclusive metadata lock은 테이블의 후속 변경 트랜잭션을 차단합니다.
             

Online DDL - Support Detail 5.6


CategoryOperationIn PlaceRebuilds
Table
Permits
Concurrent DML
Only
Modifies
Metadata
Index OperationsCreating or adding a secondary indexYesNoYesNo
Dropping an indexYesNoYesYes
Adding a FULLTEXT indexYes*No*NoNo
Changing the index typeYesNoYesYes
Primary Key Operationsdding a primary keyYes*Yes*YesNo
Dropping a primary keyNoYesNoNo
Dropping a primary key and adding anotherYesYesYesNo
Column OperationsAdding a columnYesYesYes*No
Dropping a columnYesYesYesNo
Renaming a columnYesNoYes*Yes
Reordering columnsYesYesYesNo
Setting a column default valueYesNoYesYes
Changing the column data typeNoYesNoNo
Dropping the column default valueYesNoYesYes
Changing the auto-increment valueYesNoYesNo*
Making a column NULLYesYes*YesNo
Making a column NOT NULLYes*Yes*YesNo
Modifying the definition of an ENUM or SET columnYesNoYesYes
Foreign Key Operationsng a foreign key constraintYes*NoYesYes
Dropping a foreign key constraintYesNoYesYes
Table OperationsChanging the ROW_FORMATYesYesYesNo
Changing the KEY_BLOCK_SIZEYesYesYesNo
Setting persistent table statisticsYesNoYesYes
Specifying a character setYesYes*NoNo
Converting a character setNoYesNoNo
Optimizing a tableYes*YesYesNo
Rebuilding with the FORCEoptionYes*YesYesNo
Performing a null rebuildYes*YesYesNo
Renaming a tableYesNoYesYes




           

Partitioning Operations

ALTER TABLE Partitioning 절을 제외하고 partitioned InnoDB 테이블에 대한 Online DDL 작업은 일반 InnoDB 테이블에 적용되는 동일한 규칙을 따라서 수행됩니다.

ALTER TABLE partitioning 절은 일반 InnoDB테이블과 달리 Online DDL API를 거치지 않으며 대부분은 ALGORITHM 및 LOCK 절을 지원하지 않습니다

ALTER TABLE 구문에서 Partitioning 절을 사용한다면, Partitioned table은 ALTER TABLE COPY algorithm 을 이용하여 repartitioned 되게 됩니다.

즉, 새로운 파티션 테이블 사용하여 새로운 파티션을 생성하게 됩니다.

새로 생성된 테이블에는 모든 변경 사항이 포함되며 테이블 데이터는 새 테이블 구조로 복사됩니다


Online DDL - Partitioning

MySQL 5.7 에서는 테이블로 더 상세한 내용이 기술되어 있습니다.

ALTER TABLE Partitioning 절이 일반 InnoDB테이블 의 Alter 와 다르게 Internal Online DDL API를 거치지 않더라도 MySQL은 가능한 경우 데이터 복사 및 잠금을 최소화하려고 합니다.

- partitioned by RANGE or LIST 에 대해서 ADD PARTITION and DROP PARTITION 기존 데이터를 copy 하지 않습니다.

- TRUNCATE PARTITION 는 기존 데이터를 copy 하지 않습니다.

- tables partitioned by HASH or LIST 에 대해서 ADD PARTITION and COALESCE PARTITION 작업 진행 간 Concurrent queries는 허용 됩니다
MySQL은 copies the data 하는 동안 LOCK을 shared mode 로 획득하게 됩니다.

- partitioned by LINEAR HASH or LIST 로 구성된 테이블에 대해서 REORGANIZE PARTITION, REBUILD PARTITION, or ADD PARTITION or COALESCE PARTITION 수행은 concurrent queries 수행이 허용됩니다.
MySQL은 copies the data 하는 동안 LOCK을 shared mode 로 획득하게 됩니다.

[참조] partition by range 에 대해서 REORGANIZE PARTITION 수행 시 5.7 버전에서는 ALGORITHM=INPLACE 이 불가능하지만 8.0 에서는 ALGORITHM=INPLACE(Online) 이 가능합니다.


- PARTITION BY 구문절과 REMOVE PARTITIONING 에서 concurrent queries 는 제한됩니다.

- ALTER TABLE의 PARTITION BY 변경 관련된 구문에서는 ALGORITHM=DEFAULT, ALGORITHM=INPLACE, and ALGORITHM=COPY 구문은 허용되지 않습니다

PARTITION BY [LINEAR] KEY에서 사용되는 ALGORITHM 은 ALGORITHM=1 or 2 를 지정할 수 있으며 ALGORITHM=1 은 5.1 과 동일한 Key-hasing function 을 사용하게 되고 ALGORITHM=2 는 MySQL 5.5 and later 에서 사용하는 Key-hasing function 을 사용하게 됩니다.


Default 는 ALGORITHM=2 이며 ALGORITHM=2로 생성된 Key 파티션테이블은 5.1 버전에서 사용할 수 없습니다.

버전 간 다운그레이드 할 때 사용하거나 MySQL 5.5 이후 버전에서 MySQL 5.1의 Key-Hasing Function을 사용한 Key or Linear Key 파티션을 생성하기 위해 사용됩니다.
또한 Lock 절도 지원되지 않습니다.

ex) ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32;
                      

Online DDL - Support Detail 5.7

MySQL 5.7 에서는 Online DDL이 몇 가지가 추가되었습니다.
아래 표에서 5.7 New 컬럼에 체크되어 있는 항목입니다.

CategoryOperationIn PlaceRebuilds
Table
Permits
Concurrent DML
Only
Modifies
Metadata
5.7 New
Index OperationsCreating or adding a secondary indexYesNoYesNo
Dropping an indexYesNoYesYes
Renaming an indexYesNoYesYesV
Adding a FULLTEXT indexYes*No*NoNo
Adding a SPATIAL indexYesNoNoNoV
Changing the index typeYesNoYesYes
Primary Key OperationsAdding a primary keyYes*Yes*YesNo
Dropping a primary keyNoYesNoNo
Dropping a primary key and adding anotherYesYesYesNo
Column OperationsAdding a columnYesYesYes*No
Dropping a columnYesYesYesNo
Renaming a columnYesNoYes*Yes
Reordering columnsYesYesYesNo
Setting a column default valueYesNoYesYes
Changing the column data typeNoYesNoNo
Extending VARCHAR column sizeYesNoYesYesV
Dropping the column default valueYesNoYesYes
Changing the auto-increment valueYesNoYesNo*
Making a column NULLYesYes*YesNo
Making a column NOT NULLYes*Yes*YesNo
Modifying the definition of an ENUM or SET columnYesNoYesYes
Generated Column OperationsAdding a STORED columnNoYesNoNoV
Modifying STORED column orderNoYesNoNoV
Dropping a STORED columnYesYesYesNoV
Adding a VIRTUAL columnYesNoYesYesV
Modifying VIRTUAL column orderNoYesNoNoV
Dropping a VIRTUAL columnYesNoYesYesV
Foreign Key OperationsAdding a foreign key constraintYes*NoYesYes
Dropping a foreign key constraintYesNoYesYes
Table OperationsChanging the ROW_FORMATYesYesYesNo
Changing the KEY_BLOCK_SIZEYesYesYesNo
Setting persistent table statisticsYesNoYesYes
Specifying a character setYesYes*NoNo
Converting a character setNoYes*NoNo
Optimizing a tableYes*YesYesNo
Rebuilding with the FORCE optionYes*YesYesNo
Performing a null rebuildYes*YesYesNo
Renaming a tableYesNoYesYes
Tablespace OperationsEnabling or disabling file-per-table tablespace encryptionNoYesNoNoV







Partitioning ClauseIn PlacePermits DMLNotes
PARTITION BYNoNoPermits ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT. Does not copy existing data for tables partitioned by RANGE or LIST. Concurrent queries are permitted for tables partitioned by HASH or LIST. MySQL copies the data while holding a shared lock.
DROP PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT. Does not copy existing data for tables partitioned by RANGE or LIST.
DISCARD PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT
IMPORT PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT
TRUNCATE PARTITIONYesYesDoes not copy existing data. It merely deletes rows; it does not alter the definition of the table itself, or of any of its partitions.
COALESCE PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT. Concurrent queries are permitted for tables partitioned by HASH or LIST, as MySQL copies the data while holding a shared lock.
REORGANIZE PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT. Concurrent queries are permitted for tables partitioned by LINEAR HASH or LIST. MySQL copies data from affected partitions while holding a shared metadata lock.
EXCHANGE PARTITIONYesYes
ANALYZE PARTITIONYesYes
CHECK PARTITIONYesYes
OPTIMIZE PARTITIONNoNoALGORITHM and LOCK clauses are ignored. Rebuilds the entire table. SeeSection 22.3.4, “Maintenance of Partitions”.
REBUILD PARTITIONNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT. Concurrent queries are permitted for tables partitioned by LINEAR HASH or LIST. MySQL copies data from affected partitions while holding a shared metadata lock.
REPAIR PARTITIONYesYes
REMOVE PARTITIONINGNoNoPermits ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}




Extending VARCHAR column size

5.7 버전에서 새로 추가된 Extending VARCHAR column size 부분에 대해서 살펴보겠습니다.
먼저 varchar의 바이트 크기는 사용되는 character set 에 의존하여 계산됩니다.
utf8 은 3바이트이며, utf8mb4 는 최대 4바이트를 지원합니다.

utf8 인 varchar(20) 은 20*3 = 60byte 이고 utf8mb4 인 varchar(20) 은 20*4 = 80 byte 입니다.

varchar 의 크기(byte)가 0~ 255 byte 일때 inplace 가능하며, 256byte ~ 이상으로 일 때 inplace 가능합니다.

즉 위의 2가지 경우에서 inlpace 로 변경할 수 있습니다.

그러므로 255byte -> 256byte 이상은 COPY 방식이 사용 됩니다.

크기가 0 ~ 255 바이트 인 VARCHAR 열의 경우 값을 인코딩하는 데 1 바이트 길이가 필요하고 256 바이트 이상의 VARCHAR 컬럼의 경우 2 바이트 길이가 필요합니다.

값의 길이정보를 담는 바이트에 의해서 0~255 / 256~ 이상 2부분으로 나뉘게 됩니다.

정리하면 Online DDL - Inplace 방식은 VARCHAR 컬럼 크기를 0에서 255 바이트 내에서 또는 256 바이트에서 ~ 더 큰 크기로만 지원합니다.

그래서 utf8 은 varchar(1) 당 3bytes 라서 varchar(85)=> varchar(86) 로 변경할 때 Inplace 방식 대신 Copy 방식이 사용되고,
utf8mb4는 varchar(63)=>varchar(64) 로 변경할 때 Inplace 방식 대신 Copy 방식이 사용됩니다.


그 외 5.7 버전에서 추가된 Online DDL은 Index 에서는 Renaming Index와 Adding Spatial Index이고 STORED/VIRTUAL Column 에 관한 부분이 추가되었습니다.

또한 Tablespace Operation 이 5.7 버전에서 추가되었습니다
            

Online DDL - Support Detail 8.0

MySQL 8.0.12 버전부터 ADD COLUMN 및 그 외 DDL 작업 시 ALGORITHM=INSTANT 이 지원되기 시작하였습니다.

ALGORITHM=INSTANT support is available for ADD COLUMN and other operations in MySQL 8.0.12.


ALGORITHM=INSTANT 는 Data Dictionary 의 메타 데이터만 수정을 하고, 테이블에 대한 메타 데이터 잠금이 수행되지 않으며 테이블 데이터가 영향을 받지 않으므로 작업이 즉시 수행됩니다

또한 동시 DML 수행도 영향받지 않습니다

ALGORITHM 절은 선택 사항이며 ALGORITHM 절이 생략되면 MySQL은 ALGORITHM = INSTANT를 사용됩니다.

사용이 불가능할 경우 ALGORITHM = INPLACE가 사용됩니다.
ALGORITHM = INPLACE가 지원되지 않으면 ALGORITHM = COPY가 사용됩니다


즉 ALGORITHM 절 생략시 INSTANT -> INPLACE -> COPY 순으로 적용됩니다.

사용 예시:)

SQL> alter table 테이블명 add foorbar varchar(100), ALGORITHM = INSTANT;



INSTANT 에 가능 여부 확인


INSTANT 가 지원되지 않은 구분에서 사용하면 이전의 INPLACE 의 경우처럼 에러가 발생하게 됩니다.


INSTANT 에 대해서 사용 가능여부를 명시적으로 확인하려면 ALGORITHM=INSTANT 구문을 사용할 수 있습니다.

만약 지원하지 않는 DDL 구문이라면 아래와 같이 에러가 발생됩니다.

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY



참고) 특정 컬럼 뒤에 추가하는 after 구문을 사용하면 INSTANT 방식으로 추가가 되지 않으며, INPLACE 방식을 사용해야 합니다.

8.0 버전에서 지원되는 목록은 아래와 같고 INSTANT 지원은 별도의 색으로 표기하였습니다.


CategoryOperationInstantIn PlaceRebuilds
Table
Permits
Concurrent
DML
Only
Modifies
Metadata
 
Index OperationsCreating or adding a secondary indexNoYesNoYesNo
Dropping an indexNoYesNoYesYes
Renaming an indexNoYesNoYesYes
Adding a FULLTEXT indexNoYes*No*NoNo
Adding a SPATIAL indexNoYesNoNoNo
Changing the index typeYesYesNoYesYes
Primary Key OperationsAdding a primary keyNoYes*Yes*YesNo
Dropping a primary keyNoNoYesNoNo
Dropping a primary key and adding anotherNoYesYesYesNo
Column OperationsAdding a columnYes*YesNo*Yes*No
Dropping a columnNoYesYesYesNo
Renaming a columnNoYesNoYes*Yes
Reordering columnsNoYesYesYesNo
Setting a column default valueYesYesNoYesYes
Changing the column data typeNoNoYesNoNo
Extending VARCHARcolumn sizeNoYesNoYesYes
Dropping the column default valueYesYesNoYesYes
Changing the auto-increment valueNoYesNoYesNo*
Making a column NULLNoYesYes*YesNo
Making a column NOT NULLNoYes*Yes*YesNo
Modifying the definition of an ENUM or SET columnYesYesNoYesYes
Generated Column OperationsAdding a STORED columnNoNoYesNoNo
Modifying STORED column orderNoNoYesNoNo
Dropping a STOREDcolumnNoYesYesYesNo
Adding a VIRTUAL columnYesYesNoYesYes
Modifying VIRTUALcolumn orderNoNoYesNoNo
Dropping a VIRTUALcolumnYesYesNoYesYes
Foreign Key OperationsAdding a foreign key constraintNoYes*NoYesYes
Dropping a foreign key constraintNoYesNoYesYes
Table OperationsChanging the ROW_FORMATNoYesYesYesNo
Changing the KEY_BLOCK_SIZENoYesYesYesNo
Setting persistent table statisticsNoYesNoYesYes
Specifying a character setNoYesYes*NoNo
Converting a character setNoNoYes*NoNo
Optimizing a tableNoYes*YesYesNo
Rebuilding with the FORCE optionNoYes*YesYesNo
Performing a null rebuildNoYes*YesYesNo
Renaming a tableYesYesNoYesYes
Tablespace OperationsRenaming a general tablespaceNoYesNoYesYes
Enabling or disabling general tablespace encryptionNoYesNoYesNo
Enabling or disabling file-per-table tablespace encryptionNoNoYesNoNo






파티션 작업 관련

파티션 작업에서는 INSTANT 지원하지 않습니다.

Partitioning ClauseInstantIn PlacePermits DMLNotes
PARTITION BYNoNoNoPermits ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITIONNoYesYes ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} is supported for RANGE and LIST partitions, ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} for HASH and KEY partitions, and ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} for all partition types. Does not copy existing data for tables partitioned by RANGE or LIST. Concurrent queries are permitted with ALGORITHM=COPY for tables partitioned by HASH or LIST, as MySQL copies the data while holding a shared lock.
DROP PARTITIONNOYesYesALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE} is supported. Does not copy data for tables partitioned by RANGE or LIST.

DROP PARTITION with ALGORITHM=INPLACE deletes data stored in the partition and drops the partition. However, DROP PARTITION with ALGORITHM=COPY or old_alter_table=ON rebuilds the partitioned table and attempts to move data from the dropped partition to another partition with a compatible PARTITION ... VALUES definition. Data that cannot be moved to another partition is deleted.
DISCARD PARTITIONNoNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT
IMPORT PARTITIONNoNoNoOnly permits ALGORITHM=DEFAULT, LOCK=DEFAULT
TRUNCATE PARTITIONNoYesYesDoes not copy existing data. It merely deletes rows; it does not alter the definition of the table itself, or of any of its partitions.
COALESCE PARTITIONNoYesNoALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} is supported.
REORGANIZE PARTITIONNoYesNoALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} is supported.
EXCHANGE PARTITIONNoYesYes
ANALYZE PARTITIONNoYesYes
CHECK PARTITIONNoYesYes
OPTIMIZE PARTITIONNoNoNoALGORITHM and LOCK clauses are ignored. Rebuilds the entire table. SeeSection 22.3.4, “Maintenance of Partitions”.
REBUILD PARTITIONNoYesNoALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} is supported.
REPAIR PARTITIONNoYesYes
REMOVE PARTITIONINGNoNoNoPermits ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}



            

Reference

Reference Link
https://mydbops.wordpress.com/2020/03/04/an-overview-of-ddl-algorithms-in-mysql-covers-mysql-8
https://dev.mysql.com/doc/refman/5.6/en/alter-table-partition-operations.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html
https://dev.mysql.com/doc/refman/5.6/en/alter-table.html
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html



관련된 다른 글

 

 

 

 

                 

2
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x