피드로 돌아가기
Dev.toDatabase
원문 읽기
12M 행 대규모 테이블의 Zero-Downtime NOT NULL 컬럼 추가 전략
How to add a NOT NULL column to a large table safely in Rails
AI 요약
Context
대규모 운영 환경의 테이블에 NOT NULL 제약 조건과 Default 값을 동시에 적용할 시 발생하는 전체 테이블 Lock으로 인한 서비스 중단 위험 분석. Rolling Deploy 상황에서 구버전 코드의 Null 삽입 시도와 신규 스키마 간의 충돌로 인한 시스템 장애 가능성 식별.
Technical Solution
- Metadata 변경만으로 즉시 반영되는 Nullable 컬럼 및 Constant Default 우선 추가 설계
- 10,000행 단위의 Batch Update 및 짧은 Sleep 간격 적용을 통한 Lock 점유 시간 최소화 및 동시성 확보
- 모든 쓰기 경로에 신규 컬럼 값을 명시하는 애플리케이션 코드 배포를 통한 데이터 정합성 선행 확보
- validate: false 옵션의 Check Constraint 추가 후 별도 검증 과정을 통한 Full Table Scan Lock 회피
- 단계적 Migration 분리를 통한 각 단계별 독립적 Rollback 가능 구조 설계
실천 포인트
1. NOT NULL 제약 조건 추가 전 Nullable 컬럼 추가 및 데이터 백필 완료 여부 확인
2. 대량 업데이트 시 Batch Size 설정 및 트랜잭션 간 휴지기 적용 검토
3. 스키마 변경과 애플리케이션 로직 배포 시점의 의존성 관계 정의
4. Postgres 사용 시 validate: false 기반의 제약 조건 추가 전략 적용