TABLE SWAP 시 ALTER 대신 RENAME 을 사용하자
Overview
ETL 파이프라인에서는 새로운 데이터를 운영 테이블에 반영할 때, Zero-downtime(무중단)으로 테이블을 교체하는 전략이 필요합니다. 이를 위해 흔히 테이블 스왑(Table Swap) 방식을 사용합니다.
예를 들어, 기존 운영 테이블이 foo라면
- foo → foo_old (백업 보존)
- foo_new → foo (새로운 테이블로 교체)
이렇게 이름을 교체하면 서비스는 중단 없이 새로운 데이터를 사용할 수 있고 동시에 foo_old로 이용해 빠른 롤백도 가능합니다.
테이블 이름 교체 방식
MySQL에서 테이블 이름을 교체할 수 있는 방법은 두 가지입니다.
-- ALTER 사용
ALTER TABLE ... RENAME TO ...
-- RENAME 사용
RENAME TABLE ... TO ...
foo 테이블을 예로 들면
1) ALTER TABLE RENAME 방식
ALTER TABLE foo RENAME TO foo_old;
ALTER TABLE foo_new RENAME TO foo;
2) RENAME TABLE 방식
RENAME TABLE foo TO foo_old, foo_new TO foo;
두 방식 모두 “이름 변경”을 하지만, 내부 동작/락/원자성에서 차이가 있습니다.
왜 ALTER 보다 RENAME이 유리한가?
ALTER TABLE RENAME
- 단일 테이블만 이름 변경 가능
- 실행할 때마다 메타데이터 락(MDL) 발생 (여러 번 실행 시 그만큼 락도 여러 번)
- 두 쿼리 사이에 중간 단계가 존재하여 경합·대기 가능성 증가
MySQL Docs: “An exclusive metadata lock on the table may be taken briefly during preparation and execution phases of the operation. Typically, concurrent DML is supported.”
-- 아래 쿼리는 불가능합니다.
ALTER TABLE foo RENAME TO foo_old, foo_new RENAME TO foo;
RENAME TABLE
- 여러 테이블을 한 문장으로 이름 변경 가능
- 원자적(Atomic)으로 처리되어 중간 상태가 없음
- 락 획득/해제 한 번으로 끝나 대기 및 경합 비용 감소
MySQL Docs: “RENAME TABLE, unlike ALTER TABLE, can rename multiple tables within a single statement”
즉, ETL의 TABLE SWAP처럼 테이블을 교체할 땐 RENAME TABLE이 락/원자성/성능 측면에서 더 이점이 있었습니다.