MySQL Replication 각종 에러 대처법

http://hanaduri.egloos.com/19119/ 

리플리케이션이 오류로 인해 더이상 진행되지 않는 상황에서 포지션값을 강제 조정하는 방법은 다음과 같다.

ㄱ, Slave DB에서 show slave status; 로 상태를 확인한다.
에러 발생시 Read_Master_Log_Pos 값과 Exec_masterlog_pos 값이 차이가 나며 더이상 올라가지 않는다. 해당 에러 사항은 Last Errono와 Last_error를 참조한다.

샘플은 다음과 같다.
mysql> show slave status;
——————————————————————————–
| Master_Host    | Master_User | Master_Port | Connect_retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File                | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_do_db     | Replicate_ignore_db | Last_errno | Last_error | Skip_counter | Exec_master_log_pos | Relay_log_space |
——————————————————————————–

| 192.168.0.1 | replsvr     | 3306        | 60            | replication.030 | 101319330           | slavedb-relay-bin.006 | 311434018     | replication.030       | Yes              | Yes               | aDatabase,bDatabase |                     | 0          |            | 0            | 101319330           | 311434018       |
——————————————————————————–

ㄴ.위의 샘플에서 Exec_master_log_pos가 101319330에서 멈췄다면 Master DB에서 다음 사항을 확인한다.

## replication.030은 마스터로그파일, 101319330은 포지션값, limit는 포지션을 기준으로 행해진 작업을 3개 본다는 소리이다.

mysql> show binlog events in ‘replication.030’ from 101319330 limit 3;
——————————————————————————–
| Log_name        | Pos       | Event_type | Server_id | Orig_log_pos | Info                                                                                                                                         |
——————————————————————————–
| replication.030 | 101319330 | Query      | 1         | 101319330    | use aDatabase; UPDATE test SET money = money – 10 WHERE userid=’testuser’                                                                  |
| replication.030 | 101319428 | Intvar     | 1         | 101319428    | INSERT_ID=12256338                                                                                                                           |
| replication.030 | 101319456 | Query      | 1         | 101319456    | use aDatabase; INSERT INTO testlog (userid, money, code, cdate) VALUES (‘easytour’, ‘300’, ‘001’, 1216370157) |
——————————————————————————

만약 101319330의 쿼리에서 문제가 생겨 동작을 하지 않을때 정상 동작이 될것이라 예상되는 101319456 포지션으로의 변경은 다음과 같다.

##slave DB에서 다음작업을 행한다 ##
mysql> slave stop;   <-리플리케이션을 일단 중단한다.
mysql> change master to master_log_file=’replication.030′, master_log_pos=10139456;
mysql> slave start;

change master to  명령어는 master_log_pos 외에도 여러가지 설정값들에 대해서 변경이 가능하다.

상당히 많은 양이 에러로 인해 손실되었을 경우는 마스터와 슬레이브간의 데이터 동기화를 새로 하고 리플리케이션을 각각 구동해주는것이 좋다.

또한 리플리케이션 사용시 유용한 명령어들은 다음과 같다.

## 하나두리(http://hanaduri.egloos.com/19119/)님의 이글루스 내용을 참조했습니다.

Replication에 쓰이는 SQL 명령어

다음은 replication에서 사용되는 SQL 명령어의 요약이며, 괄호내의 slave, master는 master
서버와 slave 서버에서 실행됨을 의미한다.

START SLAVE             slave 스레드를 시작함(slave)

STOP SLAVE              slave 스레드를 중지함(slave)

SET SQL_LOG_BIN=0|1     SUPER 권한을 가진 사용자가 접속할 때 bin log의 사용 하용 여
부(master)

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n
master로부터 n 개의 이벤트를 경과토록 함.(slave)

RESET MASTER            모든 binary log를 삭제하고, binlog index 파일을 리셋함.(master) 구버전의 FLUSH MASTER임

RESET SLAVE             slave에게  master log에 있는  replication 위치를  잊게 하며,
master.info와 relay-log.info 파일을 지움(slave), 구버전의 FLUSH SLAVE임

LOAD TABLE tbl_name FROM MASTER
master에서 slave로 tbl_name을 복사함(slave)

LOAD DATA FROM MASTER
master에서 slave로 데이터를 복사함(slave)

CHANGE MASTER TO master_def_list
master_def_list로 지정한 값으로 master의 변수를 변경함(slave).
master_def_list는 컴마로 분리하며 다음과 같다.
MASTER_HOST, MASTER_USER, MASTER_PASSWORD,
MASTER_PORT, MASTER_CONNECT_RETRY,
MASTER_LOG_FILE, MASTER_LOG_POS
(예: CHANGE MASTER TO
MASTER_HOST=’master2.mycompany.com’,
MASTER_USER=’replication’,
MASTER_PASSWORD=’bigs3cret’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’master2-bin.001′,
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;

MASTER_POS_WAIT()       master의 binlog가 지정한 위치에 도달할 때까지 기다리도록 하는
함수(slave)

SHOW MASTER STATUS      master의 binlog의 상태정보를 보여줌(master)

SHOW SLAVE HOSTS        master에 등록된 모든 slave의 목록을 보임(master)

SHOW SLAVE STATUS       slave의 상태정보를 보여줌(slave)

SHOW MASTER LOGS        binary log의 목록을 보여줌(master)

SHOW BINLOG EVENTS      binary log의 event를 보여줌(master)
사용법 : SHOW BINLOG EVENTS [IN ‘logname’] [FROM pos] [LIMIT [offset,] rows]

SHOW NEW MASTER FOR SLAVE
새로 접속할 수 있는 master를 보여줌(slave)
사용법 : SHOW NEW MASTER FOR SLAVE WITH MASTER_LOG_FILE=’logfile’  AND MASTER_LOG_POS=pos AND MASTER_LOG_SEQ=log_seq AND MASTER_SERVER_ID=server_id

PURGE [MASTER] LOGS     지정한 bin log나 지정한 날짜 이전의 bin log 파일을 삭제함(master)
사용법 : PURGE [MASTER] LOGS TO ‘logname’; PURGE [MASTER] LOGS BEFORE ‘date’

【예제】
mysql> SHOW MASTER STATUS;
+————–+———-+————–+——————+
| File         | Position | Binlog_do_db | Binlog_ignore_db |
+————–+———-+————–+——————+
| unix-bin.016 | 168      |              |                  |
+————–+———-+————–+——————+

mysql> SHOW MASTER LOGS;
+————–+
| Log_name     |
+————–+
| unix-bin.001 |
| unix-bin.002 |
……
| unix-bin.015 |
| unix-bin.016 |
+————–+
=======================================================================
하나두리(http://hanaduri.egloos.com) 님의 이글루스는 링크를 참조하세요

도큐멘트 에 올린 글 태그됨: ,

댓글 남기기