J’ai fait un premier article pour résoudre les problèmes de réplication d’un serveur MySQL slave à partir de binaire xtrabackup, mais cela peut aussi se faire à partir d’un dump, voici la procédure à suivre 🙂

Restaurer un slave via un dump du master

Vous devez avoir créé un dump de votre base de données quand celui-ci est figée, il faut donc faire quelques préparations.

1. Préparation sur le master

Ouvrez 2 consoles SSH sur le master.

Dans la première, ouvrir une console MySQL pour mettre la base de données en read-only (pour ne pas arrêter le service carrément), cela va donc entrainer une interruption de service pour les écritures

FLUSH TABLES WITH READ LOCK;

Dans l’autre fenêtre, obtenir la position du log file via une nouvelle console MySQL et notez le :

show master status \G

Fermez la console MySQL pour revenir en shell pour faire votre dump :

mysqldump  --add-drop-table --user=root -p DB_NAME | gzip -3 --stdout > DB_NAME.sql.gz

Une fois le dump fini, retournez dans la première console MySQL pour faire la commande de libération des tables :

unlock tables;

Vérifiez que les tables sont bien libérées après avoir attendu une minute :

show open tables;

2. Remettre la réplication MySQL en place sur le slave

En premier, démarrez MySQL, injectez le dump (ce qui peut prendre du temps et vérifiez que vos bases de données sont bien là.

zcat DB_NAME.sql.gz | mysql -u root -p VOTRE_DB

Appliquez les commandes suivantes, en remplaçant les valeurs par celle de votre infrastructure :

  • HOST : votre serveur master
  • USER : l’utilisateur MySQL de réplication si vous en avez défini un sinon le root (je vous conseille un utilisateur dédié avec uniquement les droits nécessaires)
  • PASSWORD : le mot de passe
  • LOG_FILE et LOG_POS : les valeurs de la position du log file récupérée plus haut sur le master
reset slave;
CHANGE MASTER TO
MASTER_HOST='serveur_master.tld',
MASTER_USER='repl',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='mysql-bin.002043',
MASTER_LOG_POS=106;
start slave;

Attendez une minute et puis vérifiez le status du slave :

show slave status \G

Vous devriez avoir ceci parmi la réponse :

Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Votre réplication est donc correcte.

Pour vous rassurez la première fois, vous pouvez faire un « create database toto » sur le master, voir si la base de données apparait sur le slave et ensuite faire un « drop database toto » sur le master.