MySQL 에러 처리법

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

모모레 2019. 2. 15. 09:52

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를 마이너 버전 업그레이드를 진행하고 진행해야 위 문제를 피해갈 수 있다.