nyroBlog
Ban NyroBlog, by Emi
Image by Emi - ?

Tag: Shell


Backup d'une base de donnée MySQL

Quand on veut faire une sauvegarde d'une base de donnée MySQL, il n'y a pas 36 solutions.

Soit on prend son courage à 2 mains et on décide de se faire un script de backup manuellement. C'est long, et on est pas à l'abri d'oublier quelque chose, si on ajoute des tables par la suite.

Soit on se dit qu'une base de données, ce n'est que des fichiers et on décide de sauvegarder dans un tar gzippé le dossier contenant ces fichiers. Pour les remettre, c'est moins évident.

Soit on cherche un peu dans la doc MySQL et dans les commandes Bash commençant par mysql, et on découvre des choses toutes faites, qui, en une ligne, nous permettent de faire la sauvegarde de toute une base, voir de plusieurs.

Vous l'attendez tous, voici la ligne de commande :

mysqldump --user=LOGIN --password=PASSE --add-drop-table NOMBASE

Cette commande vous écrit toutes les requêtes MySQL à exécuter pour retrouver votre base de données. Le --add-drop-table permet d'ajouter les instructions de suppression de tables, si elles existent.

Là, je vous ai donné pour ne sauvegarder qu'une seule base. Pour en sauvegarder plusieurs, il faut remplacer NOMBASE par --databases NOMBASE1 NOMBASE2 NOMBASE3.

Pour sauvegarder toutes les bases de données, il faut remplacer NOMBASE par --all-databases.

Bon avec tout ça, vous allez avoir toutes les requêtes qui vont défiler sur votre écran. Pas très pratique pour restaurer... Un simple pipe vers un fichier pour sauvegarder le tout et le tour est joué :

mysqldump --user=LOGIN --password=PASSE --add-drop-table NOMBASE > FICHIER.sql

Enfin, pour restaurer, vous pouvez utiliser la technique que je vous ai déjà donné pour les grosses requêtes MySQL.

Réparer des bases de données MySQL

Il arrive dans certains cas que des bases de données, plus particulièrement des tables, soit rendu illisibles suite à un crash du serveur.

MySQL a tout prévu avant la commande REPAIR TABLE qui permet de récupérer une table crashée, avec généralement une perte de données, la dernière ligne ajoutée (d'où l'utilité des backups récurents).

Rien que ça, c'est bien utile quand on se retrouve dans un phpMyAdmin qui nous sort plein d'erreurs dont ont ne sait pas vraiment d'où elles sortent et dont on ne comprend pas forcément le sens.

Mais imaginez qu'on ait affaire à un serveur dédié avec un nombre conséquent de base de données. Le serveur a crashé, donc on suppose des erreurs sur les tables de toutes les bases. Comment faire pour ne pas avoir à regarder manuellement dans chaque base de données ?

Utilisez la commande mysqlcheck comme suit, à exécuter en SSH par exemple :

mysqlcheck -A --user=USER --password=PASSWORD

Bien sûr, vous aurez pris soin de changer USER et PASSWORD avec ce qui convient, sûrement root pour l'utilisateur.

Ensuite, vous allez voir toutes les tables de chaque base de données défiler, avec la plupart du temps marqué OK sur la ligne, pour vous indiquer qu'il n'y pas d'erreur.

Pour n'afficher que les tables qui sont crashées, vous n'aurez qu'à rajouter un grep :

mysqlcheck -A --user=USER --password=PASSWORD | grep -v "OK"

Enfin, vous n'aurez qu'à exécuter les REPAIR TABLE sur les tables qui ressortent avec des erreurs et vous en aurez terminer. Normalement, la commande mysqlcheck accepte comme paramètre --auto-repair, mais elle n'a pas fonctionnée dans mon cas, je ne sais pas pourquoi.

Grosse requête MySQL, comment faire

Il arrive parfois qu'on est besoin de transférer énormément de données d'une base de donnée MySQL vers une autre (passage en production, changement de serveur...)

Or, ce qui arrive quelques fois dans ces cas-là, c'est que le fichier sql soit tellement gros qu'on ne peut pas l'envoyer via phpMyAdmin ou bien que le php mette trop de temps et arrive au timeout de la page... Bref, on n'y arrive pas. La solution utilisé quelques fois et le tranchage en parties du fichier sql et l'envoi par petits morceux : très laborieux.

La solution que je vous propose marche du tonnerre, mais uniquement si vous avez un accès SSH au serveur. Le principe est simple : vous allez envoyer votre fichier sql sur le serveur par FTP, puis l'exécuter directement avec la commande mysql. Et donc, voici ce que vous attendez tous, la commande à utiliser :

# mysql -h HOTE -u LOGIN --password=PASSE BASE < fichier.sql

Bien sûr, à vous de modifier HOTE, LOGIN, PASSE, BASE et fichier.sql selon ce que vous faites, mais ça, vous saurez le faire. J'ai déjà utiliser ce système sur Client Roi dans un script bash qui fait la mise à jour des données journalières. Et puis hier soir, c'était pour transférer la base de données des régions, départements, cantons et villes de France de mon EasyPhp vers le serveur de production.

Et si vous n'avez pas d'accès SSH, vous pouvez toujours créer un script PHP qui vous lira votre fichier.sql et vous exécutera N requêtes pas appel, mais c'est déjà plus contraignant...