pt-online-schema-change 옵션

이전 포스팅을 통해, pt-osc 설치 및 기본적인 사용법에 대해 정리했습니다.

pt-online-schema에 다양한 옵션이 존재하여 그 옵션들의 쓰임새에 대해 정리해보고자 합니다. 먼저 운영환경에서 사용하는 pt-osc 실행구문에서는 아래 옵션들이 활용됩니다.

    pt-online-schema-change --alter "[변경 내용]" D=[데이터베이스명],t=[테이블명] \ 
    --host=[호스트명] --port=[포트] \ 
    --user=[유저명] --password=[패스워드] \ 
    --charset=UTF8mb4 \ 
    --analyze-before-swap \                                                                     ## swap 이전 타겟 테이블 통계 업데이트 (DEFAULT)
    --alter-foreign-keys-method=auto \                                                          ## 외래키 복사
    --chunk-index=PRIMARY --chunk-size=1000 --chunk-size-limit=4.0 \                            ## chunk 기준 설정
    --max-load=[시간대 평균 트래픽에 따라 변동] \                                                      ## 평소 대비 높은 트래픽일 경우, pt-osc 작업 일시 중지
    --no-drop-new-table \                                                                       ## 작업 중간 실패 시, 타겟테이블 보존 (DEFAULT = 삭제)
    --no-drop-old-table \                                                                       ## 기존 테이블 보존 (DEFAULT = 삭제)
    --progress=time,30 \                                                                        ## 30초마다 로그 기록
    --swap-tables \                                                                             ## 테이블 스위칭  (DEFAULT)
    --set-vars="wait_timeout=30, lock_wait_timeout=3, innodb_lock_wait_timeout=3" \             ## pt-osc 작업으로 인한 lock 대기 시간이 너무 길어지지 않도록 설정
    --sleep=[적정값] \                                                                            ## CPU 부하 조절 (스펙 및 테스트 결과에 따라 적정값)
    --execute

--sleep 옵션을 통해 pt-osc 툴 사용 시 발생되는 CPU 부하를 제어하고, --max-load 옵션을 통해 트래픽이 높을 경우, 작업을 일시 중지할 수 있습니다. 그 외 옵션은 위 주석을 참고 부탁드립니다.

그 외 상황에 따라 필요 옵션이 달라질 수 있는데, 옵션들에 대해 정리했습니다.

  • Replication 관련
옵션 Description
--check-interval Replication lag 체크 주기 (–max-lag 옵션과 관계)
--check-replication-filters 특정 DB만 Replication하는 상황과 같이 필터 옵션이 걸려있으면 작업 실패
--check-slave-lag –recursion-method(dsn) 옵션을 이용해 특정 장비(Replica) lag에 대해서만 –max-lag 옵션을 체크하도록 설정 가능
--max-lag 모든 Replica lag이 설정값보다 높으면 일시 중지
--recursion-method Replica 장비를 찾아내는 방법 결정 / dsn, host, processlist 세가지 옵션 선택 가능
  • 그 외 옵션
옵션 Description
--ask-pass MySQL 연결 시 암호 입력창 발생
--check-alter alter 작업에 대해 데이터 틀어짐 버그가 발생했는지 체크
--check-plan 쿼리 실행 전 explain문을 활요해 실행계획 체크유무를 결정 / 실행 계획상 너무 많은 데이터를 읽는 Chunk는 스킵
--chunk-index-columns 복합인덱스에서 사용할 컬럼 수를 명시 (선행 컬럼순으로 왼쪽부터)
--chunk-time 설정된 옵션 시간만큼만 실행되도록 chunk 크기를 동적 조절
--data-dir 데이터 디렉토리 내, 다른 위치로 타겟 테이블 파일 생성
--remove-data-dir –data-dir 옵션으로 다른 곳에 있는 소스테이블일 경우, 기본 위치로 타겟 테이블 생성
--dry-run 타겟 테이블에 대해 데이터 복사 없이 스키마만 적용된 빈테이블 생성
--default-engine 시스템 기본 Engine으로 테이블 생성 / 명시하지 않으면 소스테이블과 동일한 엔진 테이블 생성
--check-unique-key-change unique key 추가와 같은 작업은 Insert Ignore 방식의 pt-osc에서 데이터 유실이 발생할 수 있어 실행 방지
--preserve-triggers 데이터 Copy 작업 전, 타겟 테이블에 소스테이블과 동일한 트리거 생성
--new-table-name 타겟 테이블명명시적으로 결정 / 테이블명이 있으면 에러 발생
--null-to-not-null null값인 데이터는 Default 선언된 값들로 변경하여 데이터 복사
--tries critical 에러가 아닌 원인으로 작업 실패 시, 작업 재시도 횟수 설정

pt-osc 실패 시, 필요 작업

  • 예기치 않은 상황으로 pt-osc 작업이 강제 종료되면, 작업에 사용된 오브젝트들이 남겨져 이후 작업을 위해 제거가 필요합니다.
  • 아래 작업을 통해 잔여 오브젝트를 찾아 제거합니다
    -- 잔여 트리거명 확인
    SHOW TRIGGERS LIKE '%[테이블명]%';
    
    -- 트리거 제거 (Insert, Update, Delete) (아래와 같은 네이밍의 트리거가 생성)D
    DROP TRIGGER IF EXISTS `pt_osc_[데이터베이스명]_[테이블명]_ins`;
    DROP TRIGGER IF EXISTS `pt_osc_[데이터베이스명]_[테이블명]_upd`;
    DROP TRIGGER IF EXISTS `pt_osc_[데이터베이스명]_[테이블명]_del`;
    
    -- 신규 테이블 제거 (drop-new-table 옵션 사용 시 해당 과정 생략 가능)
    DROP TABLE IF EXISTS `_[테이블명]_new`;