pt-online-schema-change로 대형 테이블에 블로킹 없는 ALTER
MySQL온라인 작업명령어
# First --dry-run, then the same command with --execute; throttles on replica lag
pt-online-schema-change --alter "ADD COLUMN region CHAR(2) NULL, ADD INDEX ix_region (region)" \
D=shop,t=orders,h=db1,u=osc,p='Osc#2024',s=1 \
--max-lag=5 --check-replica-lag h=db2,u=osc,p='Osc#2024',s=1 \
--max-load Threads_running=50 --critical-load Threads_running=200 \
--set-vars lock_wait_timeout=5 --noversion-check --dry-run하는 일
새 구조로 빈 사본을 만들고, 행을 chunk 단위로 복사하며, 복사 중 변경을 트리거로 반영하고, 마지막에 원자적 RENAME으로 테이블을 교체한다. 부하나 replica 지연이 임계값을 넘으면 스스로 속도를 줄이거나 일시 중지한다.
사용 시점
COPY가 필요하거나(컬럼 타입, charset, PK 변경) 긴 replica 지연을 일으킬 ALTER용.
주의
테이블에 PK나 unique key가 필요하다. 트리거는 마이그레이션 중 모든 쓰기에 오버헤드를 추가하므로 쓰기가 매우 많은 테이블에서는 gh-ost의 영향이 더 적다. 자식 테이블이 foreign key로 이 테이블을 참조하면 --alter-foreign-keys-method=auto가 필요하다. caching_sha2_password 계정은 DSN에 s=1(TLS)을 추가한다. 그렇지 않으면 replica 연결이 'Authentication requires secure connection'으로 실패한다. --check-replica-lag DSN은 기본 DSN의 user / password를 상속하지 않으므로 직접 지정한다. 교체 시 짧은 metadata lock을 잡는다. lock_wait_timeout을 낮게 유지하며, 락을 얻지 못하면 재시도한다.