컨텐츠 바로가기

Replication 오류(relay read error)

http://darkit.egloos.com/215603

[오류 내용]
'SHOW SLAVE STATUS' 의 실행 결과
Slave_IO_Running : Yes
Slave_SQL_Running : No
Last_error
'Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.'

'Last_error' 내용 해석
Relay log 이벤트 항목의 구분을 분석 할 수 없습니다.
가능한 이유는 다음과 같습니다 : Master binary log의 손상(너의 binary log에 'mysqlbinlog'를 실행하여 확인 할 수 있습니다.), Slave relay log의 손상(너의 relay log에 'mysqlbinlog'를 실행하여 확인 할 수 있습니다.), 네트워크 문제, Master 또는 Slave에서 MySQL 코드의 버그.
너의 Master binary log 또는 Slave relay log를 확인하고 싶다면,  'show slave status'를 실행하여 명칭을 확인할 수 있을 것입니다.
* 위에 캡쳐된 에러 로그와 동일한 내용이다.

[해결 방법]
Relay log를 읽어오는 과정에서 오류가 있었던 것으로 보아 현재 slave 에 생성된 Relay log 파일이 깨진것으로 보임. 그렇기에 relay log를 master로 부터 다시 읽어오면 됨.

[처리 과정]
mysql> stop slave;

mysql> show slave status;
* 여기에서 확인 해야 할 부분은 'Relay_Master_Log_File', 'Exec_master_log_pos' 이 두가지를 꼭 메모해둔다.
- 'Relay_Master_Log_File'은 마지막으로 실행 되었던 relay log 파일의 실제 master binary log 파일이 무엇이었는지를 알려준다. (캡쳐된 에러 로그 기준 'rep.326')
- 'Exec_master_log_pos'는 'Relay_Master_Log_File'에서 마지막으로 실행되었던 이벤트의 포지션을 가리킨다. (캡쳐된 에러 로그 기준 '159247430')
* 각자 mysql 이 설치된 경로에서 에러 로그 파일을 tail 명령을 이용해 열어봐도 위 내용을 쉽게 알 수 있음.

mysql> reset slave;
* master 로 부터 slave 에 걸려있던 로그를 초기화한다.

mysql> change master to master_log_file='rep.326', master_log_pos=159247430;
* Master 로부터 읽어볼 로그의 포지션을 설정
- 'master_log_file'='Relay_Master_Log_File'
- 'master_log_pos'='Exec_master_log_pos' 자신의 상태에 맞게 넣어준다.

mysql> show slave status;
* 설정된 포지션이 맞는지 최종 확인
- 'Master_Log_File' : 자신이 설정한 로그파일명이 맞는지 확인(ex> 'rep.326')
- 'Read_Master_Log_Pos', 'Exec_master_log_pos' : 자신이 설정한 로그 포지션이 맞는지 확인(ex> 159247430)
- 'Relay_Log_File' : 'XXX-relay-bin.001' (Relay log file의 뒷 자리가 '001'로 초기화 되었는지 확인)
- 'Relay_Log_Pos', 'Relay_log_space' : '4'로 초기화 되었는지 확인

mysql> start slave;
* slave 를 재시작하고 show slave status 를 확인하면 이제 정상적으로 작동되는 것을 확인할 수 있다.

덧글|신고