19.2 Sauvegarde de base de données

Etant donné que les tables de MySQL sont enregistrées sous la forme de fichiers, les sauvegardes sont très faciles à faire. Pour créer une sauvegarde cohérente, verrouillez les tables dont vous avez besoin avec LOCK TABLES. LOCK TABLES. Vous n'aurez besoin que d'un verrou de lecture, cequi permettra aux autres threads de continuer à interroger la base, tout en vous laissant le champs libre pour faire la copie des fichiers de la base. Si vous voulez faire une requête SQL pour sauver la table, utilisez donc SELECT INTO OUTFILE.

Un autre moyen de faire des sauvegardes d'une base de données est d'utiliser l'utilitaire mysqldump :

  1. Sauvegarde complète des bases de données :
    shell> mysqldump --tab=/path/to/some/dir --lock-tables --opt
    
    Vous pouvez aussi simplement faire une copie de touts les fichiers de tables (``*.frm'', ``*.ISD'' et ``*.ISM''), tant que le serveur ne fait pas de modiication.
  2. Stoppez le serveur mysqld si il était lancé, puis relancez le avec l'option --log-update. Vous allez obtenir des fichiers d'historique avec des noms du type ``nomDHote.n'', où n est un nombre incrémenté à chaque fois que vous faites un mysqladmin refresh ou mysqladmin flush-logs, une commande FLUSH LOGS statement, ou que vous redémarrez le serveur. Ces fichiers d'historiques fournissent les informations dont vous aurez besoin pour répliquer une base, ou la régénérer à partir de la sauvegarde faite avec mysqldump.

Si vous devez reconstruire une base ou une table, essayer d'abord de récupérer vos tables avec isamchk -r. Cet utilitaire fonctionne dans 99.9% des cas. Si isamchk échoue, utilisez la procédure suivante :

  1. Réinstallez la sauvegarde originale à partir de mysqldump.
  2. Lancez la commande suivante pour re excécuter les modifications à partir des fichiers d'historique
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql

ls est utilisé pour mettre les fichiers d'historiques dans le bon ordre. Vous pouvez aussi effectuer des sauvegardes sélectives avec SELECT * INTO OUTFILE 'nom_de_fichier' FROM nom_table et les recharger avec LOAD DATA INFILE 'nom_de_fichier' REPLACE ... Pour éviter d'avoir des enregistrements en double, utilisez une colonne de type PRIMARY KEY ou UNIQUE dans la table. L'option REPLACE forcera le remplacement des anciens enregistrements par les nouveaux, dès que l'on tentera de doubler une valeur de la clé unique.