잘 쓰고 있던 서비스의 내용이 request 마다 다른 내용을 보여주었습니다. 


DB는 mysql replication을 이용해서 사용하고 있는데 말이죠. 테스트를 해보니 새롭게 입력하는 데이터가 slave DB에는 반영이 되지 않고 있는 것 이었습니다.

아~ 처음 만나는 문제에 당황했지만 열심히 관련자료를 찾아봤습니다. 생각보다 쉽게 답을 찾을 수 있었습니다. 문제는 slave에서 갱신된 데이터를 쓰려고 하니 에러가 발생한 것이었습니다. 아래는 발생한 에러입니다. 
(참고, 에러파일의 위치를 명시하지 않았다면 mysqld 실행 옵션중 -dataDir에 생성됩니다.)

101008 19:48:58 [ERROR] Slave: Error ‘Duplicate entry ’222′ for key 1′ on query. Default database: ‘M_SERVICE’. Query: ‘INSERT INTO      T_LOTTO_MY     (     MY_SEQ,USERNO,NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,GAME_NUM,RANK,PRIZE,UPDATE_DATE     )   VALUES     (     null,’620013149754′,4,18,25,44,16,8,409,’0′,0,NOW()     )’, Error_code: 1062

1062라는 에러가 발생한 것입니다. slave에서는 에러가 발생하게 되면 더이상 master로부터의 갱신된 쿼리를 실행하지 않습니다. 그래서 이후에 생겼던 갱신 정보는 반영되지 않았던 것입니다. 
그래도 다행은 에러 이후 발생된 갱신 정보는 차곡차곡 쌓여 있다는 것입니다.

자 이제 그럼 문제를 풀었던 방법에 대해서 설명 하겠습니다. 방법은 간단합니다. 에러가 발생했던 쿼리를 넘어가자 라고 DB에 알려주면 됩니다. 

우선 슬레이브 상태를 멈춥니다. 
stop slave;


에러 쿼리를 하나 건너뛰자~ 라고 알려줍니다.

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;


다시 슬레이브를 시작합니다.
START SLAVE;


자 이제 에러 쿼리를 건너 뛰었으니 그동안 쌓여있던 쿼리가 slave에 반영될 것입니다. 


항상 복제되어 최신의 데이터를 보여주어야 하는 DB가 에러 하나 생겼다고 복제가 안된다면 큰 문제가 될 수 있습니다. 이런 서비스를 위한 DB 설정이 있습니다.

my.cnf에 다음과 같이 설정을 변경해주시면 됩니다.
앞으로 1062번 에러 코드 발생하면 그냥 skip 해주고 다음 쿼리를 처리해주렴~
slave-skip-errors = 1062  (여러개일 경우는 ,로 분리해서 쭈욱 나열해주면 됩니다.)