- 복제된 트랜잭션의 이벤트 문제로 인해 복제가 중단된 경우 북제에 실패한 트랜잭션을 생략하고 복제를 시작할 수 있다. 

- 트랜잭션을 생략하기 전에 복제서버의 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

+ Recent posts