pt-osc(pt-online-schema-change) 옵션 & 작업 실패 시 필요 작업
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`;