mysql replicaton을 이용해서 메인 DB서버(master)의 데이터를 백업 DB서버(slave)로 실시간으로 백업을 하고 있다.
그런데 백업이 잘 되다가 어느 순간부터 master db 데이터가 slave db에 반영되지 않는 경우가 발생했다.
[SLAVE DB]
# slave db에서 현재 상태를 확인한다.
mysql> show slave status;
slave db에서 에러가 발생했다면 Read_Master_Log_Pos값과 Exec_masterlog_pos값이 다르며 에러 내용은 Last Errono와 Last_error 값으로 확인할 수 있다. 또한 Slave_IO_Running, Slave_SQL_Running 값이 모두 Yes 이어야 한다.
쿼리문으로 인해 발생한 에러이고 해당 쿼리문을 확인해 보니 무시할 수 있다면 해당 쿼리문이 실행된 포지션(postion)을 강제로 건너띄면 그 다음 포지션부터 slave db에 그동안 쌓인 데이터가 반영된다.
참고> 에러가 발생해서 slave db에 반영되지 않았더라도 master db 데이터는 계속 쌓인다.
참고> master db 현재 상태 확인하기
[MASTER DB]
mysql> show master status;
master, slave db 상태가 일치해야한다.
[master] = [slave]
File = Master_Log_File
Postion = Read_Master_Log_Pos
# 먼저 리플리케이션을 멈춘다.
- slave db 서버를 멈춰도 master db 데이터는 계속 쌓이며 다시 실행하게 되면 그동안 쌓인 데이터가 slave db에 반영이 된다.
mysql> stop slave;
# 에러가 발생한 쿼리문을 1개 건너 띈다.(error가 여러 개이면 그만큼 반복 실행해서 에러가 난 쿼리문을 건너띈다.)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
# 리플리케이션을 시작한다.
mysql> start slave;
위처럼 실행하게되면 그동안 쌓여있던 데이터들이 반영된다.