- 복제된 트랜잭션의 이벤트 문제로 인해 복제가 중단된 경우 북제에 실패한 트랜잭션을 생략하고 복제를 시작할 수 있다.
- 트랜잭션을 생략하기 전에 복제서버의 I/O 쓰레드와 SQL 쓰레드가 정지하고 있는지 확인한다.
- 오류의 원인이 된 복제 이벤트 확인
- 오류정보와 최근에 성공적으로 적용된 트랜잭션은 performance_schema 의 replication_applier_status_by_worker 테이블에 기록된다.
- mysqlbinlog 를 사용하여 오류 발생시 기록된 이벤트를 검색하고 확인할 수 있다.
Relay_Master_Log_File: binlog.000010
...
Exec_Master_Log_Pos: 194
mysqlbinlog --start-position=194 binlog.000010
# at 194
#180710 9:47:54 server id 572238408 end_log_pos 259 CRC32 0x83a04322 GTID last_committed=0 sequence_number=1 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '4ab8feff-5272-11e8-9320-08002715584a:201840'/*!*/;
- 복제서버 또는 원본서버에서 SHOW BINLOG EVENTS, SHOW RELAYLOG EVENTS 로 확인할 수 있다.
GTID 사용시 트랜잭션 건너뛰기
- GTID 사용시 sql_slave_skip_counter 를 사용할 수 없다.
- 에러가 발생한 트랜잭션을 빈 트랜잭션으로 만들어서 커밋한다.
SET GTID_NEXT='4ab8feff-5272-11e8-9320-08002715584a:201840';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
GITD 사용안할때 트랜잭션 건너뛰기
- SET GLOBAL sql_slave_skip_counter 를 사용
- N 은 건너 뛸 원본 서버의 이벤트 수
SET GLOBAL sql_slave_skip_counter = N
- 주의사항
- 이벤트는 일반적으로 바이너리 로그에서 하나의 SQL문을 지원하지만 AUTO_INCREMENT 또는 LAST_INSERT_ID()를 사용하는 경우 바이너리 로그에서 두개의 이벤트로 계산된다.
- 바이너리 로그의 트랜잭션 압축이 사용되는 경우, 압축 된 트랜잭션 페이로드(Transaction_payload_event)는 하나의 카운터 값으로 계산되기 때문에 그 내부의 모든 이벤트는 하나의 이벤트로 계산된다.
참고
https://dev.mysql.com/doc/refman/8.0/en/replication-administration-skip.html
'MySQL' 카테고리의 다른 글
OPTIMIZE TABLE Statement (0) | 2021.06.18 |
---|---|
ANALYZE TABLE Statement (0) | 2021.06.17 |
GTID 복제 상태 확인 (0) | 2021.06.12 |
GTID 사용시 복제본 복구 (0) | 2021.06.10 |
GTID를 사용한 복제구성 (0) | 2021.06.09 |