[MySQL] 테이블 컬럼 추가 시 Lock이 걸릴까?

Jiumn·2025년 7월 17일
0

MySQL

목록 보기
1/9

서비스 운영 중 테이블 컬럼을 추가해야 하는 경우가 있다. 이런 경우 MySQL 테이블에는 Lock이 걸릴까?

MySQL 8.0 이상일 때는 InnoDB 테이블의 컬럼 추가 작업에 대해 온라인 DDL 방식을 지원한다.

온라인 DDL이란 테이블의 구조(스키마)를 변경하는 동안에도 읽기/쓰기 작업을 가능하게 하는 기술이다.
MySQL 5.6 버전부터 온라인 DDL을 지원하기 시작했고, 8.0에서는 더욱 강력해졌다.

온라인 DDL의 3가지 알고리즘

1. COPY (MySQL 5.5 이전)

Lock이 가장 오래 걸리는 방식이다.
원본 테이블의 복사본을 만들고 복사본에 변경 사항을 적용한 뒤 데이터도 옮긴다. 그 후에 원본 테이블을 복사본으로 교체한다. (Rebuild)
테이블을 복사하고 데이터를 이동하는 동안에는 해당 테이블에 대한 읽기/쓰기 작업이 거의 불가능하다. 즉, 서비스 중단 시간이 발생할 수 있다.
예: ALTER COLUMN (데이터 타입 변경이 너무 커서 INPLACE가 불가능한 경우), ADD PRIMARY KEY 등에 해당한다.

2. INPLACE (MySQL 5.6)

테이블 데이터를 리빌드하지만 작업 중에도 읽기/쓰기 가능하다.
데이터 파일을 새로 복사하지 않고 기존 파일에서(INPLACE) 변경한다.
작업하는 동안 MetaData Lock이 아주 짧은 시간(ms 정도) 걸릴 수 있다.
예: ADD INDEX, ADD COLUMN (기본값 설정 또는 NOT NULL), CHANGE COLUMN (데이터 타입 변경 등) 등에 해당한다.

3. INSTANT (MySQL 8.0)

가장 빠르고 Lock이 거의 없는 방식이다. 테이블의 메타데이터만 변경하고 실제 데이터를 리빌드하지 않는다.
예: ADD COLUMN으로 기본값 없이 NOT NULL이 아닌 컬럼 추가, DROP COLUMN (일부 경우), RENAME COLUMN 등에 해당한다.

회사 서비스 운영 중 컬럼을 추가해야 할 일이 있었다. MySQL 버전은 8.0 이상, 추가하려는 컬럼은 기본값이 없고, NOT NULL 조건이 아니기 때문에 INSTANT 알고리즘으로 수행될 것이 예상되었다. 따라서 서비스 중단 없이 안전하게 컬럼을 추가하기로 했다.

DDL 구문과 조건에 따라 다른 알고리즘이 적용되기 때문에 서비스 운영 중 컬럼을 변경할 일이 있으면 MySQL 공식문서를 미리 확인하는 게 좋다.

profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글