mysql 5.6 부터 online ddl이 추가 되었다.
각 버전별 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
InnoDB에서 지원하는 online ddl 알고리즘
- copy
- inplace
- instant (mysql 8.0)
copy
- 변경된 스키마가 적용된 임시 테이블을 생성하여 기존 테이블의 데이터를 복사한 후 테이블 이름을 변경하는 방식
- ALGORITHM 구문 미사용시 INPLACE -> COPY 순으로 처리됨
INPLACE 로 처리 가능한 경우 INPLACE 를 사용하고 처리 불가능시 COPY 사용
단점
- DDL 작업 일시중지, 작업중 I/O, CPU 사용제한 메커니즘 없음
- 작업중 롤백이 발생할 수 있으며, 롤백시 많은 비용이 소모됨
- ALTER TABLE 작업 동안 Concurrent DML (inserts,updates,deletes) 이 차단됨
LOCK = SHARED 일 때 Select는 가능함
- 복제 지연이 발생 가능성 있음
inplace
- 원본 테이블에 직접 변경작업을 적용함
- 작업 준비(during perparation) 실행단계(executioin pahases of the operation)에서 테이블에 대한 배타적 메다 데이터 잠금(exclusive metadata lock)이 잠깐 동안 수행될 수 있다.
- 일반적으로 Concurrent DML 을 지원함
단점
- 지원하지 않는 DDL 구문이 있음
지원여부 확인을 위해 ALGORITHM=INPLACE 구문을 사용해서 확인 가능
- 테이블을 수정하는 동안 변경된 데이터량이 innodb_online_alter_log_max_size 를 초과할 경우
online ddl 이 실패하고 변경된 데이터는 롤백된다.
2시간 정도 돌아가다 에러나면서 롤백되면 환장한다... (경험담)
- 장기간 실행되는 DLL 작업은 슬레이브에서 복제 지연을 유발할 수있다.
ALTER TABLE 작업은 마스터에서 작업이 완료되면 슬레이브로 전달된다.
- 동시성이 높은 서버의 큰 테이블에 대해 높은 I/O 사용량을 유발할 수 있다.
instant
- mysql 8.0 에서 추가됨
- 메타 정보만 수정하여 변경 사항 반영
스키마 변경중에 메타 데이터 잠금을 획득하지 않으며, 테이블의 데이터 파일도 건드리지 않는다.
- ALGORITHM 구문 미사용시 INSTANT -> INPLACE -> COPY 순으로 처리됨
단점
- 컬럼 추가시 테이블의 마지막 열로만 추가 가능, 컬럼 위치 지정 불가
- ROW_FORMAT=COMPRESSED 를 사용하는 테이블에는 컬럼 추가 불가
- FULLTEXT 인덱스를 포함하는 테이블에는 컬럼 추가 불가
- 임시 테이블에는 컬럼 추가 불가
임시테이블은 ALGORITHM=COPY 만 지원
- 데이터 딕셔너리 테이블 스페이스 (공유 테이블 스페이스)에 있는 테이블에는 컬럼 추가 불가
LOCK
- 테이블에 대한 동시 엑세스 수준을 조정
- mysql은 ddl 작업시 가능한 작은 level 의 lock을 사용한다.
더 제한적인 감금을 적용하기 위해서 LOCK 절을 지정함
- 특정 DDL 조작에서 허용되는 lock 레벨보다 더 적은 제한 레벨 lock을 지정하면 SQL Statement는 오류와 함께 실패한다.
- LOCK=NONE
Concurrent query, Concurrent DML 허용
- LOCK=SHARED
Concurrent query 허용, Concurrent DML 불가
- LOCK=DEFAULT
수행 가능한 동시성 작업에 대해서 허용
- LOCK=EXCLUSIVE
Concurrent query 불가, Concurrent DML 불가
빠른 시간내에 DDL 이 완료되거나, 동시 쿼리나 DML 이 없을 경우 사용
oline ddl 단계
- Initializaton
Storage Engine 기능, 명령문으로 지정된 작업, 사용자 지정의 ALGORITHM 및 Lock 옵션을 고려하여
작업에 허용가능한 옵션 결정
테이블 정의를 보호하기 위해 가능한 Shared Upgradeable Metadata Lock 을 수행
- Execution
명령문이 준비되고 실행됨
Metadata Lock의 Exclusive 여부는 Initializaton 단계에서 평가된 내역에 따라 다르며, Exclusive Metadata Lock 이 필요한 경우 Alter 문을 주비하는 동안 잠깐 수행됨
- Commit Table Definition
테이블의 구조가 완료됨
Metadata Lock은 테이블 정의를 커밋하기 위해 Exclusive 로 업그레이드됨
Exclusive Metadata Lock 은 짧은 시간동안 잡힘
'MySQL' 카테고리의 다른 글
GTID (0) | 2021.06.09 |
---|---|
MySQL InnoDB Row 형식 (0) | 2021.06.04 |
binlog format (0) | 2021.05.15 |
인덱스 최대 크기 (0) | 2021.05.13 |
MySQL 포퍼먼스 튜닝 (0) | 2021.05.12 |