La Réplication MySQL échoue avec l'erreur “n'a pas Pu analyser relais journal d'entrée de l'événement.”

J'ai cherché sur google à fond pour une solution définitive ou d'un ensemble de mesures pour résoudre ce problème, mais il ne semble pas y avoir beaucoup de la qualité des résultats, et je n'ai pas trouvé la question sur un débordement de pile. Nous tentons de mettre en place une réplication MySQL à l'aide d'un esclave. L'esclave semble être réplication bien, et puis l'erreur suivante se produit:

N'a pas pu analyser le relais du journal d'événements d'entrée. Les raisons possibles sont: le maître du log binaire est endommagé (vous pouvez le vérifier en exécutant 'mysqlbinlog" sur le log binaire), l'esclave du relais journal est corrompu (vous pouvez le vérifier en exécutant 'mysqlbinlog" sur le relais du journal), un problème de réseau, ou d'un bug du maître ou de l'esclave code de MySQL. Si vous voulez vérifier la le log binaire du maître ou de l'esclave relais journal, vous serez en mesure de connaître leurs noms, par l'émission "SHOW SLAVE STATUS" sur cette esclave.

Afin de profiter du grand nombre de personnes qui vont inévitablement tomber sur cette question à partir d'une recherche, il serait utile que quelqu'un qui répond fourni un aperçu de ce qui pourrait mal se passer et quelles sont les mesures à prendre pour résoudre ce problème, mais je vais aussi donner plus de détails ci-dessous liées à ma situation particulière dans l'espoir que quelqu'un peut m'aider à le résoudre.


Le dump que nous importés dans l'esclave pour l'obtenir, a été créé à l'aide de la commande suivante sur le maître:

mysqldump --opt --allow-keywords -q -uroot -ppassword dbname > E:\Backups\dbname.sql

Le script qui effectue cette sauvegarde enregistre également le maître actuel du binaire de la position du journal. Ensuite nous avons pris les mesures suivantes pour démarrer la réplication sur l'esclave:

1. STOP SLAVE;
2. DROP DATABASE dbname;
3. SOURCE dbname.sql;
    (... waited a few hours for the 10gb dump to import)
4. RESET SLAVE;
5. CHANGE MASTER TO MASTER_HOST='[masterhostname]', MASTER_USER='[slaveusername]', MASTER_PASSWORD='[slaveuserpassword]', MASTER_PORT=[port], MASTER_LOG_FILE='[masterlogfile]', MASTER_LOG_POS=[masterlogposition];
6. START SLAVE;

Après une journée de travail de réplication de l'amende, elle n'a pas de nouveau à 3:43 AM. La première chose qui est apparu dans MySQL journal d'erreur est l'erreur ci-dessus. Puis une autre erreur générique est apparu après à la même heure:

Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log '[masterlogfile]' position [masterlogpos]

Pour plus d'informations de journalisation, j'avais mis en place un script batch pour exécuter "SHOW SLAVE STATUS" et "SHOW FULL PROCESSLIST" toutes les heures. Voici les résultats avant et après l'échec:

--Monitoring: 3:00:00.15 
Slave Status: 
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.xxx.xxx
Master_User: slave_user
Master_Port: xxxx
Connect_Retry: 60
Master_Log_File: mysql-bin.000xxx
Read_Master_Log_Pos: 316611912
Relay_Log_File: dbname-relay-bin.00000x
Relay_Log_Pos: 404287513
Relay_Master_Log_File: mysql-bin.000xxx
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbname
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: 316611912
Relay_Log_Space: 404287513
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: 0
*************************** 1. row ***************************
Id: 98
User: system user
Host: 
db: NULL
Command: Connect
Time: 60547
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 99
User: system user
Host: 
db: NULL
Command: Connect
Time: 5
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 119
User: root
Host: localhost:xxxx
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
--Monitoring: 4:00:02.71 
Slave Status: 
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.xxx.xxx
Master_User: slave_user
Master_Port: xxxx
Connect_Retry: 60
Master_Log_File: mysql-bin.000xxx
Read_Master_Log_Pos: 324365637
Relay_Log_File: dbname-relay-bin.00000x
Relay_Log_Pos: 410327741
Relay_Master_Log_File: mysql-bin.000xxx
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: dbname
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
Last_Errno: 0
Last_Error: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 322652140
Relay_Log_Space: 412041238
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 ***************************
Id: 98
User: system user
Host: 
db: NULL
Command: Connect
Time: 64149
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 122
User: root
Host: localhost:3029
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST

J'ai essayé de suivre les instructions à partir de l'erreur et a couru mysqlbinlog sur l'esclave d'un relais de journal avec un start_position des milliers de déclarations avant, et stop_position des milliers de déclarations après le point de défaillance, et la redirection de la sortie vers un fichier texte. Je n'ai pas vu la corruption, les erreurs sur la ligne de commande ou dans le fichier journal. C'est ce que le fichier journal, a déclaré autour du point d'échec:

...
# at 410327570
#120816 3:43:26 server id 1 log_pos 322651969    Intvar
SET INSERT_ID=3842697;
# at 410327598
#120816 3:43:26 server id 1 log_pos 322651997    Query    thread_id=762340    exec_time=0   error_code=0
SET TIMESTAMP=1345113806
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327741
#120816 3:44:26 server id 1 log_pos 322754486    Intvar
SET INSERT_ID=3842701;
# at 410327769
#120816 3:43:26 server id 1 log_pos 322754514    Query    thread_id=762340    exec_time=0   error_code=0
SET TIMESTAMP=1345113866;
insert into LOGTABLENAME (UpdateDate, Description) values (now(), "Invalid floating point operation");
# at 410327912
...

Intéressant de noter que c'est l'enregistrement d'un Invalide opération en virgule flottante à ce point, mais je ne suis pas sûr de la façon qui pourrait entraîner la réplication pause à cette position. J'ai couru mysqlbinlog sur le maître du log binaire trouvé en MONTRER le STATUT d'ESCLAVE à partir de ci-dessus, et ne pas voir les erreurs sur la ligne de commande (mais n'ont pas eu la chance d'ouvrir les 100 mo fichier journal généré depuis je ne voulais pas ralentir le serveur de production).

Donc maintenant je suis à une perte pour quoi d'autre pour essayer. Je suis à la base il suffit de regarder pour des idées de ce qui pourrait mal se passer, ou des suggestions de mesures à prendre. Merci!

OriginalL'auteur nolliecrook | 2012-08-23