백업 서버에서 mysql 복제 클라이언트가 실행되고 있습니다. 지난주 정전으로 인해 복제가 중단되었습니다. 그 전에는 몇 달 동안 중단 없이 운영되었습니다.
마스터와 슬레이브를 모두 다시 시작하려고 시도했지만 도움이 되지 않았습니다. 슬레이브에서 마스터 서버에 액세스할 수 있으므로 네트워크는 문제가 되지 않습니다.
문제가 무엇인지 진단하기 위해 제가 할 수 있는 다른 방법이 있나요?
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000060
Read_Master_Log_Pos: 46277494
Relay_Log_File: mysqld-relay-bin.000348
Relay_Log_Pos: 98
Relay_Master_Log_File: mysql-bin.000060
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 46277494
Relay_Log_Space: 98
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000069
Position: 851796
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified
업데이트: 오류는 mysql.err이 아닌 daemon.log로 들어가고 있었는데, 이로 인해 오류를 찾을 수 없었습니다. 문제는 마스터가 로그를 사용할 수 없다고 말하는 것 같습니다. 이는 해당 로그(및 이전 로그)가 마스터에서 여전히 사용 가능하기 때문에 의미가 없습니다.
090710 9:17:35 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000060' at position 46277494, relay log './mysqld-relay-bin.000350' position: 98
090710 9:17:35 [Note] Slave I/O thread: connected to master 'username@master:3306', replication started in log 'mysql-bin.000060' at position 46277494
090710 9:17:35 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
090710 9:17:35 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
090710 9:17:35 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000060', position 46277494
답변1
놀라운 MySQL 복제 세계에 오신 것을 환영합니다. 나는 당신의 특별한 문제에 직접 부딪치지는 않았지만 다른 많은 이상한 문제에 부딪혔으며 가장 가까운 해결책은 마치 새로운 슬레이브인 것처럼 마스터에서 다시 동기화하고 끝내는 것입니다.
답변2
슬레이브의 오류 로그를 조사해야 합니다. 일반적으로 문제가 무엇인지 매우 명확하게 알 수 있습니다.
모니터링 시스템에 mysql 오류 로그가 연결되어 있어야 합니다. 그렇지 않으면 슬레이브가 잠재적으로 쓸모가 없습니다.
또한 슬레이브 상태를 확인할 수 있는 모니터도 있어야 합니다.
그리고 어떤 용도로든 사용하려면 아마도 mk-table-checksum과 같은 것을 사용하여 때때로 슬레이브의 동기화를 확인하고 싶을 것입니다. 이상적으로는 그 결과를 모니터링 시스템에 연결하는 것이 좋습니다.
답변3
많은 사람들이 슬레이브가 시작하기 전에 복제를 중지하면 모든 것이 괜찮은지 확인할 수 있도록 스킵-슬레이브-시작을 설정합니다. 'startslave'를 실행하여 변경 사항이 있는지 또는 기록되는 것이 있는지 확인하십시오. 게다가 SlaveSQL 프로세스가 실행 중인데 SlaveIO가 실행되지 않는 것도 이상합니다. 슬레이브의 로컬 릴레이 로그가 손상되었을 수도 있습니다.~해야 한다로그에 보고됩니다. MySQL을 종료한 다음 릴레이 로그를 삭제해 보세요.
답변4
위 보고서에서 문제를 발견했습니다. 이 필드는 (Slave_IO_Running): yes로 설정되어야 하지만 위 보고서에서는 Slave_IO_Running: No로 표시됩니다.
이것이 문제의 원인입니다. 이 변수가 'No'로 표시되면 IO 스레드가 중지된 것입니다. 따라서 더 이상 복제가 없습니다. 원인에 대한 자세한 내용은 Last_SQL_Errno 및 Last_SQL_Err을 확인해야 합니다. 오류 번호 0과 빈 문자열의 메시지는 "오류 없음"을 의미합니다. Last_SQL_Error는 슬레이브의 오류 로그에 나타납니다.
이 문제를 해결하려면 슬레이브를 중지하세요.
그런 다음 다음을 설정합니다.
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
이는 슬레이브에게 하나의 쿼리(복제를 중지시키는 잘못된 쿼리)를 건너뛰도록 지시합니다. 두 개의 쿼리를 건너뛰려면 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2를 사용합니다. 대신 등등.
그런 다음 슬레이브를 다시 시작하고 로그를 확인하십시오. 이를 통해 문제가 해결되기를 바랍니다...