BLOG ARTICLE troubleshooting | 2 ARTICLE FOUND

  1. 2008.02.14 Replication Troubleshooting 2탄
  2. 2008.02.03 Replication Overview 및 Troubleshooting

개인적으로 삽질했던 문제해결 리스트(Troubleshooting List)  2탄

Slave 재부팅시에 Slave가 동작하지 않는 경우가 발생한다면?

master.info와 relay-log.info를 확인하여,
설정이 유효한지 확인한다.

그런데도, syslog에 아래와 같은 문제가 발생한다면?

[Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=/var/run/mysqld/mysqld-relay-bin' to avoid this problem.

my.cnf에 relay-log 설정을 추가한다.

그럼에도 불구하고 다음과 같이 에러가 계속 된다면?

[ERROR] Failed to open the relay log '/var/run/mysqld/mysqld-relay-bin.000045'

원하는 relay-log를 찾지 못하는 현상이 일어나므로,
relay-log의 위치를 변경한다.

일반적으로 /var/run에는 재부팅 전까지만 유효한 내용들을 넣어두므로,
다른 안전한 곳으로 옮기는 것도 괜찮다.

옮기는 김에, relay-log.info, master.info의 위치도 변경해 보자.
여기서는 좀 부잡스럽지만 일단 /var/log/mysql 아래에 다 넣는다.

relay-log = /var/log/mysql/mysqld-relay-bin
master-info-file = /var/log/mysql/master.info
relay-log-info-file = /var/log/mysql/relay-log.info


AND

초간단 Replication overview

Replication은 master의 내용을 여러 slave들에게 복사본을 유지시키는 것을 의미한다.
즉, 아래 그림의 경우와 같이 write는 비교적 적게 일어나고,
read가 자주 일어나는 웹사이트들의 경우에 load balancing을 위해 사용할 수 있을 것이다.


그림 출처: http://dev.mysql.com/doc/refman/5.0/en/replication-solutions-scaleout.html

Replication 관련 주의해야할 사항 및 troubleshooting 관련글들은 아래 mysql 사이트를 참조하도록 한다.
http://dev.mysql.com/doc/refman/5.0/en/replication-features.html



개인적으로 삽질했던 문제해결 리스트(Troubleshooting List) ...

1. replication 후 slave에서 master에 연결이 안될 때.

slave로 master의 db를 dump를 하게 되면,
user 정보들도 모두 dump하게 된다.

즉, 다음에 slave를 리부팅했을 경우 오류가 날 수 있다.
일례로 /etc/mysql/debian.cnf 안에 보면,
password가 master의 것으로 바뀌게 되므로 slave의 세팅을
master의 세팅과 동일하게 맞춰주어야 될 지도 모른다.


2. slave 혹은 master의 문제로 인해 다시 동기화를 해야할 경우.

dump한 후 다시 stop, start slave를 시킨다.
혹시 relay-log를 못 따라가며 안되면,... 무식하게,
mysql> RESET SLAVE;
를 한 후, 다시 설정/시작 시킨다..

3. Slave가 꺼져있는 동안 Master에서 update가 일어나는 경우.

Slave에서 동기화 에러가 날 수 있다.
다시 동기화할때 Slave단에서 duplication 등의 에러가 날 수 있는데,
(무시해 줘도 되는 경우...)
그리 치명적인 에러가 아니면 my.cnf 내에서 slave-skip-errors 옵션을
이용해서 무시해주면 된다.
slave-skip-errors = 1061, 1062
모든 에러를 다 건너뛰려면, slave-skip-errors = all 로 세팅하면 된다.


4. 에러가 난 경우, 해당 쿼리를 확인/건너뛰는 방법.

우선 Slave에서 Exec_Master_Log_Pos 위치 확인.
mysql> SHOW SLAVE STATUS\G

Master에서 근처에 어떤 쿼리가 있는지 확인.
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000032' FROM 13633 LIMIT 3 \G

문제가 없다면 다음 위치로 이동.
mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000032',
MASTER_LOG_POS=13770;
mysql> SLAVE START;
mysql> SHOW SLAVE STATUS \G

혹은 확인 결과 현재 에러가 skip해도 된다면,
mysql> SLAVE STOP;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> SLAVE START;

AND