본문 바로가기
MySQL 에러 처리법

MySQL Ver. 5.6과 MySQL Ver. 5.7 바이너리 로그 호환성 문제로 인한 에러

by 모모레 2019. 2. 15.

MyQL Ver. 5.7을 마스터로 하고, MySQL Ver. 5.6.22 이하 버젼을 슬레이브로 구성하여 리플리케이션을 구성하는 경우 슬레이브 서버의 IO thread에서 에러가발 생한다.


Relay log write fialure: could not queue event from master, Error_code;1595


SHOW SLAVE STATUS 명령어를 통해 확인하면 다음과 같은 에러만 보이지만, 에러 로그 파일을 열어 보면 좀 더 자세한 정보를 확인할 수 있다. 


2017-09-21 15:44:21 1168 [ERROR] Slave I/O: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF. Error_code: 1784

 

2017-09-21 15:44:21 1168 [ERROR] Slave I/O: Relay log write failure: could not queue event from master, Error_code: 1595


로그를 읽어보면 GTID_MODE가 OFF로 설정되었는데 Gtid_log_event나 Previous_gtids_log_event가 바이너리 로그에 발생하여 에러가 되었다는 것을 확인할 수 있다. 참고로, 위 에러는 마스터 서버와 슬레이브 서버가 모두 GTID_MODE 값이 OFF로 설정되어있는 상태이다. 즉, 둘다 OFF로 설정되어있음에도 불구하고 해당 이벤트가 발생하게 된것이다. 

 

MySQL Ver. 5.7 작업 로그를 찾아보면 GTID_MODE가 OFF로 설정되었더라도, Gtid_log_event과 Previous_gtids_log_event를 내부적으로 생성하여 사용하는 것을 확인할 수 있다. 

https://dev.mysql.com/worklog/task/?id=7592

중요한 부분만 확인하여 보면 다음과 같이 개발된 것을 확인할 수 있다. 

Functional requirements:

FR1.When GTID_MODE = OFF, every transaction shall be preceded by an Anonymous_gtid_log_event in the binary log.

FR2.When GTID_MODE = OFF, every binary log shall start with a Previous_gtid_log_event.

FR3.Cross-version replication OLD->NEW shall not harmed by this worklog.

FR4.Cross-version replication NEW->OLD shall work as follows:

FR4.1. NEW->5.6.21 shall work if gtid_mode=ON. It will not work if gtid_mode=off.

FR4.2. NEW->5.6.22 shall work regardless of gtid_mode.

Footnote: the reason that 5.6.21 and older cannot work is BUG#74683. Once the bug is fixed, cross-version replication shall work.

 

즉, 위와 같이 MySQL Ver. 5.7에 바이너리 로그 관련 개발이 이루어 지면서 MySQL Ver. 5.6.22 이하 버전에서 하위 호환성 문제가 발생한 것이다. 

 


위 문제는 MySQL Ver. 5.6.23부터 패치되어 문제가 되지 않게 되었다. 

https://bugs.mysql.com/bug.php?id=74683


그래서 MySQL Ver. 5.6.22 이하의 버젼을 MySQL Ver. 5.7로 이관하기 위해 스위치를 해야 할 때에는 MySQL Ver. 5.6.22를 마이너 버전 업그레이드를 진행하고 진행해야 위 문제를 피해갈 수 있다.