MySQL Online DDL(1) [Algorithm]

Database/Mysql & Mariadb / /
728x90

서비스 중지 없이 DDL이 가능한 ONLINE DDL이 많이 개선 되었다.

Meta 정보만 선 갱신 가능한 알고리즘 또한 Mysql 8 버전에서 추가되어

서비스의 영향이 적게 반영이 가능해졌다.

 

해당 Online DDL 의 알고리즘은 총 3개이다.

1.      Instant :

8.0.12 버전에 추가된 알고리즘으로 메타 정보만 수정하여 변경 사항을 반영한다.

Data dictionarymetadata만 변경하기 때문에 Tablemetadata lock을 걸지 않고

Table data에도 영향을 받지 않기 때문에 바로 반영한다.

8 버전부터는 default 로 되어 있으나 데이터 파일 반영

또는 table rebuild가 발생되지 않기 때문에 적용 범위가 적다.


 

2.      InPlace

기본에 존재하는 테이블 파일에 변경 내용을 반영하여 temporary table 이나

table rebuild를 피하는 방식으로 동작한다.

변경 중 들어오는 QueryOnline Alter Log buffer 에 쌓게 되고 변경이 완료된 후

해당 DML을 반영하는 방식으로 이루어진다.

다음 작업 순서이다.

1)      InPlace 스키마 변경이 지원되는 커맨드인지, InnoDB 인지 확인

2)      online 스키마 변경 작업 동안 변경되는 데이터를 저장할 준비  (innodb_online_alter_log_max_size)

3)      테이블 스키마 변경 및 DML 로깅

4)      변경 완료된 테이블에 DML 로깅 적용

5)      INPLACE 작업 완료

따라서 발생되는 몇 가지 사항이 있다.

A.    metadata lock이 발생될 시 (2번과 4번 작업) lock 획득 실패 시 작업 실패

B.     많은 데이터를 가진 table을 변경할 시 In Memory에 쌓이는 Log Buffer
증가하게 되고 해당 최대값 설정인 변수 innodb_online_alter_log_max_size
값을 넘어가게 되면 오류가 발생된다.

C.     변경 DDL 작업이 길어지게 되면 SlaveDDL 반영 또한 길어지게 되고
복제 지연이 발생될 수 있다.

D.    많은 데이터를 가진 table을 변경할 시 높은 IO사용이 발생되고
해당 서버의 다른 프로세스에 영향을 미치게 된다.


 

3.      Copy

Temporary table을 생성하여 DDL을 반영 데이터 처리를 마친 후

기존 tablereplace 하는 방식

Temporary table과 기존 table의 데이터의 Gap이 발생되면 안되기 때문에

데이터가 변경되는 CUD의 작업을 Lock 하지만 Select는 가능하다

작업 시 DDL이나 IO 사용량을 결정할 수 없고 rollback 시 큰 비용 발생

작업 시 복제 지연이 발생될 수 있음


 

위와 같이 Instant > InPlace > Copy 순으로 효율적이며 따라서 Mysql 8에서는

Instant default로 설정되어 있으나 해당 알고리즘 사용 부분이 매우 제한적이기 때문에

상황에 맞는 전략이 필요하다

 

현재 Online DDL 8개 부분에서 지원하게 되었다.

1.      Index Operations

2.      Primary Key Operations

3.      Column Operations

4.      Generated Column Operations

5.      Foreign Key Operations

6.      Table Operations

7.      Tablespace Operations

8.      Partitioning Operations

 

참조

https://gywn.net/2018/10/online-alter-for-varchar/

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

https://myinfrabox.tistory.com/61

https://m.blog.naver.com/parkjy76/221790031480

https://semode.tistory.com/514

https://runebook.dev/ko/docs/mariadb/innodb-online-ddl-overview/index

http://small-dbtalk.blogspot.com/2014/09/mysql-56-mariadb-100-online-ddl.html

https://hoing.io/archives/6693

https://dolphhong.tistory.com/229

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기