C.W.K.
Stream
Lesson 06 of 10 · published

Production 마이그레이션 — Zero-Downtime

~14 min · migrations, production, deploys

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

도는 앱 안 깨는 schema 변경

대부분 schema 변경 (ADD COLUMN, CREATE INDEX) 은 도는 SQLite DB 에 적용 안전. 위험한 거 — DROP COLUMN, type 변경, 큰 테이블 재작성 — 더 신경.

  • Additive 변경 (DEFAULT 있는 ADD COLUMN, CREATE INDEX, CREATE TABLE) — startup 에 적용, 짧은 락, 끝.
  • Rename (RENAME TABLE/COLUMN) — 모던 SQLite 에선 빠른 metadata 변경.
  • 파괴적 변경 (DROP COLUMN, CTAS 통한 type 변경) — 옛 코드 살아있는 동안 안전한 마이그레이션: 새 컬럼 ADD, 양쪽 쓰는 코드 deploy, backfill, 새 거 read 코드 deploy, 옛 거 drop.
  • 거대 테이블 인덱스 생성 — 동안 락. Low-traffic window schedule, 또는 STRICT 테이블의 indexed_columns 로 work 작게.
Warning: Postgres 와 달리 SQLite 가 concurrent index 생성 X. 1억 row 테이블 CREATE INDEX 가 동안 write 락. 계획 — 사본에서 측정 먼저, 필요하면 maintenance window 에 deploy.

Code

안전 마이그레이션 패턴 — phased deploy·sql
-- Phase 1: additive, 마이그레이션 deploy, 양쪽 쓰는 코드 deploy
ALTER TABLE users ADD COLUMN email_lc TEXT;
UPDATE users SET email_lc = lower(email);   -- backfill
CREATE INDEX idx_users_email_lc ON users(email_lc);
PRAGMA user_version = 7;

-- Phase 2 (다음 deploy): 코드가 email_lc read
-- Phase 3 (이후 deploy): 옛 컬럼 또는 trigger drop
--   ALTER TABLE users DROP COLUMN email;

External links

Exercise

기존 schema 에 컬럼 storage type 변경 (timestamp 의 TEXT -> INTEGER) 하는 zero-downtime 마이그레이션 계획. 3 phase 마이그레이션 작성: additive, dual-write, cutover. Writer 도는 staging DB 에서 시퀀스 테스트 + row 안 잃은 거 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.