Erreur de réplication maître-esclave MySQL : la solution !


81 views
Temps de lecture 5min 19s
5/27/2023, 3:44:36 PM
Auteur : Michael

Erreur de réplication maître-esclave MySQL : la solution !

 

La réplication maître-esclave est un élément clé de l'architecture de MySQL pour la sauvegarde et la tolérance aux pannes. Nous avons expliqué comment mettre en place une réplication MySQL... Cependant, il arrive parfois que le serveur esclave soit en erreur et ne parvienne plus à se synchroniser avec le maître. Les erreurs de réplication maître-esclave peuvent causer des pertes de données et des temps d'arrêt critiques pour les entreprises. Les erreurs courantes de réplication maître-esclave dans MySQL incluent des conflits de noms de table, des problèmes de permissions, des conflits de données, des erreurs de connexion, des problèmes de verrouillage de table et des erreurs de journalisation. Heureusement, il existe des solutions pour résoudre ces erreurs et rétablir la synchronisation entre le maître et l'esclave. Dans cet article, nous allons expliquer en détail comment résoudre un problème de synchronisation entre un serveur maître et un serveur esclave dans MySQL.

 

Il y a un tas d'erreurs qui peuvent survenir... En voici quelques-unes que vous trouverez surement via la commande mysql SHOW SLAVE STATUS\G :

  • Error connecting to master: This error indicates that the slave server cannot connect to the master server. This could be due to a network issue or an incorrect configuration.
  • Slave_IO_Running: No: This error indicates that the slave I/O thread is not running. This thread is responsible for fetching updates from the master server.
  • Slave_SQL_Running: No: This error indicates that the slave SQL thread is not running. This thread is responsible for executing updates on the slave server.
  • Last_IO_Errno: This error indicates the last error that occurred while reading updates from the master server.
  • Last_IO_Error: This error provides a description of the last error that occurred while reading updates from the master server.
  • Last_SQL_Errno: This error indicates the last error that occurred while executing updates on the slave server.
  • Last_SQL_Error: This error provides a description of the last error that occurred while executing updates on the slave server.
  • Relay_Log_File: This error indicates the name of the relay log file that contains updates received from the master server.
  • Relay_Log_Pos: This error indicates the position within the relay log file at which the slave I/O thread stopped.
  • Master_Host: This error indicates the hostname of the master server that the slave is configured to replicate from.
  • Master_Port: This error indicates the port number that the slave should use to connect to the master server.
  • Master_Log_File: This error indicates the name of the binary log file on the master server that the slave is currently processing.
  • Read_Master_Log_Pos: This error indicates the position within the binary log file on the master server at which the slave I/O thread is currently reading.
  • Relay_Master_Log_File: This error indicates the name of the binary log file on the master server that the current relay log file corresponds to.
  • Slave_IO_State: This error provides information about what the slave I/O thread is currently doing.

 

Si vous rencontrez l'une de ces erreurs, il se peut que vous deviez relancer une synchronisation complète...

Voici donc un tutoriel pour vous aider à résoudre ce problème :

 

Après avoir vu votre erreur avec SHOW SLAVE STATUS\G; mais avant de refaire une synchronisation complète, essayez ceci sur le serveur esclave :

STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;

Si c'est réglé, tant mieux ! Sinon procédons à un reset de la syncro.

 

Sur le serveur maître :

La première étape consiste à se connecter sur MySQL et à réinitialiser le serveur maître. Pour cela, vous devez exécuter la commande suivante et entrez votre mot de passe :

mysql -uroot -p

une fois connecté, entrez :

RESET MASTER;

Ensuite, vous devez verrouiller les tables pour éviter les modifications pendant le processus de synchronisation. Pour cela, exécutez la commande suivante :

FLUSH TABLES WITH READ LOCK;

La commande suivante est :

SHOW MASTER STATUS\G

qui vous permet de récupérer les informations nécessaires pour la synchronisation de l'esclave. Notez les valeurs obtenues dans le résultat de cette commande quelque part, car vous en aurez besoin plus tard.

Sans fermer la connexion client, car cela entraînerait la libération du verrou de lecture, vous devez exécuter la commande suivante pour effectuer une sauvegarde du maître :

mysqldump -u root -p --all-databases > /root/mysqldump.sql

Vous pouvez maintenant libérer le verrou, même si la sauvegarde n'est pas encore terminée. Pour cela, exécutez la commande suivante :

UNLOCK TABLES;

Enfin, copiez le fichier de sauvegarde vers le serveur esclave à l'aide de scp ou de votre outil préféré.

 

Voici une commande SCP qui pourrait vous donner un exemple, le serveur distant (esclave) ayant comme IP 123.123.123.123 :

scp -P22 /root/mysqldump.sql [email protected]:/root/mysqldump.sql

 

Sur le serveur esclave :

La première étape consiste à arrêter la réplication. Pour cela, exécutez la commande suivante :

STOP SLAVE;

Ensuite, vous devez charger la sauvegarde des données du maître sur le serveur esclave. Pour cela, exécutez la commande suivante dans la console :

mysql -uroot -p < /root/mysqldump.sql

Synchronisez ensuite les journaux du maître et de l'esclave. Pour cela, exécutez les commandes suivantes :

RESET SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;

Notez que les valeurs pour ces champs sont celles que vous avez notées à l'étape 3 sur le serveur maître.

 

Enfin, vous pouvez redémarrer la réplication en exécutant la commande suivante :

START SLAVE;

Pour vérifier que tout fonctionne correctement, vous pouvez exécuter la commande suivante :

SHOW SLAVE STATUS\G

Vous devriez voir les deux champs suivants :

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Si ces deux champs sont à "Yes", cela signifie que la synchronisation entre le maître et l'esclave est opérationnelle.

 

 

Si vous rencontrez des problèmes de synchronisation entre le serveur maître et le serveur esclave, il est important de réagir rapidement pour éviter toute perte de données. Ce tutoriel vous a présenté les étapes nécessaires pour résoudre ce problème et vous permettra de retrouver une synchronisation entre vos serveurs en toute sécurité.