제17장: OzOSC - 무중단 스키마 변경
안내: 이 장에서는 OzOSC(Online Schema Change) 설계와 적용 범위에 대해 다룹니다. MySQL 및 MariaDB의 대용량 운영 테이블에 대해 테이블 락 없이 안전하게 스키마를 변경하고 복구할 수 있는 제어 기능을 제공합니다.
이 장의 내용:
17.1 개요 및 주요 위험
운영 중인 대규모 테이블에 일반 ALTER TABLE을 직접 실행하면 다음과 같은 치명적 위험이 발생합니다:
- 테이블 락 (Table Lock): 데이터베이스 엔진이 읽기 및 쓰기 작업을 차단.
- 서비스 다운타임: 애플리케이션의 데이터 쓰기가 지연되어 커넥션 고갈 및 타임아웃 발생.
- 복제 지연 및 데이터 손상: 복제본(Replica) 노드의 지연이 누적되어 데이터 정합성 훼손.
OzOSC는 사전 읽기 전용 검증을 통해 기본 키, 메타데이터, 서버 정보를 검사합니다. 안전성이 확인되면 백업을 생성하고, 독립 섀도우 테이블을 만든 뒤, 데이터를 청크 단위로 복제하며, 모든 사전 검증이 완료된 시점에 아토믹 테이블 스왑(Atomic Swap)을 수행합니다.
17.2 현재 지원 범위
OzOSC는 기본 키가 검증된 MySQL 및 MariaDB 테이블을 기본 지원합니다. SQLite와 PostgreSQL은 이 네이티브 OSC 경로를 사용하지 않습니다. 호환되지 않는 가상 컬럼, 복잡한 외래 키, 기존 트리거가 존재하는 테이블은 검증 단계에서 안전하게 제외됩니다.
17.3 무중단 마이그레이션 실행 절차
[ 운영 테이블: orders ] --(트리거 기반 증분 동기화)--> [ 섀도우 테이블: _orders_sqloz_osc ]
(실시간 읽기/쓰기 중단 없이 지속) (ALTER TABLE 즉시 적용)
|
(원자적 테이블 교체 − 1 ms)
v
[ 새로운 운영 테이블: orders ]
보호된 실행 단계:
- 섀도우 테이블 생성: 검증 후 대상 테이블과 동일한 빈 섀도우 테이블 생성.
- 스키마 변경 적용: 빈 섀도우 테이블에
ALTER TABLE적용 (수 밀리초 소요). - 트리거 동기화: 복사 진행 중 운영 테이블에 발생하는
INSERT,UPDATE,DELETE를 실시간 미러링. - 청크 단위 데이터 복사: 서비스 부하를 최소화하면서 기존 데이터를 제어된 블록 크기로 복제.
- 원자적 테이블 교체 (Atomic Swap): 복제 완료 후 원자적
RENAME TABLE을 통해 교체 완료. 검증 완료 전까지 이전 테이블은 안전하게 보존됩니다.
작업이 비정상 종료된 경우 OzOSC 패널의 Refresh Recovery를 사용합니다:
- Complete cleanup: 정상 교체 완료 후 임시 객체 정리.
- Resume copy: 중단된 체크포인트 위치부터 데이터 복제 재개.
- Abort preparation: 교체 전 상태에서 안전하게 섀도우 테이블과 트리거를 제거하고 원본 테이블 유지.
경고: MySQL/MariaDB DDL은 트랜잭션 롤백을 지원하지 않습니다. OzOSC는 이상 징후 감지 시 안전을 위해 즉시 fail-closed로 작업을 중단합니다.
17.4 실시간 진행률 모니터링
- 복사 속도 (Rows/sec): 초당 전송 행 수 실시간 출력.
- 예상 잔여 시간 (ETA): 처리량을 기반으로 한 완료 예정 시간.
- 안전한 취소: 취소 요청 시 정리 및 복구 상태가 명확하게 처리됩니다.