N'étant pas Administrateur de Bases de Données (DBA), cet article ne décrira pas en détail le fonctionnement de MySQL. Il s'adresse plutôt aux administrateurs systèmes, en expliquant comment arrêter et démarrer une base, comment récupérer des informations sur une base, et surtout comment sauvegarder/restaurer une base. Plus quelques infos d'ordre général sur le fonctionnement de mysql.
MySQL est disponible dans les dépôts de toutes les distributions ou presque. Il est donc très facile de l'installer avec la méthode habituelle de votre distribution. Il faut installer le paquet mysql-client pour se connecter à une base existante, et le paquet mysql-server pour installer une base. Je ne rentrerai pas plus dans les détails.
Il existe deux moteurs différents que peut utiliser MySQL : MyISAM et InnoDB. On peut choisir un moteur différent pour chaque base.
Ces deux moteurs ne fonctionnent pas pareil et n'ont pas les mêmes fonctionnalités. A mon sens, ces différences concernent plus les DBA que les administrateurs système. Cependant, il est utile de savoir quel est le moteur utilisé pour les sauvegardes, car certains outils ne fonctionnent qu'avec certains moteurs (par exemple, mysqlhotcopy ne marche qu'avec MyISAM). Je n'aborderai ici que ceux qui fonctionnent avec les deux moteurs.
MyISAM est le moteur par défaut de MySQL. Il fonctionne à l'aide de fichiers, placés dans /var/lib/mysql/. Pour chaque base, il créé un fichier .MYD (qui contient les données), un fichier .MYI (qui contient les indexes) et un fichier .frm (qui contient des métadonnées).
InnoDB utilise de principe de TableSpace, utilisé par d'autres bases de données, comme Oracle. Dans ce cas, MySQL dispose d'un espace dédié sur le disque qu'il organise à sa façon. Le TableSpace est représenté par défaut par le fichier /var/lib/mysql/ibdata1. Il créé également un fichier .frm et des fichiers ib_logfile0 et ib_logfile1, tous dans /var/lib/mysql/.
Pour savoir quel moteur utilise votre table, il faut se connecter dessus (en tapant mysql en ligne de commande) et taper :
Il faut ensuite taper "quit" pour sortir du prompt mysql.
Sur la quasiment toutes les distributions linux, l'installation de mysql créé le daemon /etc/init.d/mysqld. Par conséquent, l'arrêt/relance de mysql se fait comme n'importe quel daemon avec "/etc/init.d/mysqld stop|start|restart|status".
Voici quelques commandes pour voir les bases et leur contenu (à taper dans un shell) :
A toutes ces commandes, on peut rajouter les options -u et -p. -u sert à préciser l'utilisateur et -p le mot de passe. On doit coller le nom et le mot de passe derrière les options respectives (par exemple -"uroot -ppassword"), le mot de passe devant être écrit en clair. On peut également laisser -p tout seul, le mot de passe sera alors demandé et ne sera pas visible.
MySQL possède un prompt dans lequel on peut travailler. On peut obtenir les mêmes informations sur les bases et les tables qu'avec mysqlshow, avec des "vraies" commandes mysql.
Les commandes à taper sont les suivantes :
Il existe plusieurs méthodes pour sauvegarder des bases mysql. En voici quelques unes.
Mysqldump est une méthode très simple à mettre en place. Cette fonction créé un fichier texte SQL qui permet de recréer la base. En réalité, mysqldump écrit sur la sortie standard, et on va la rediriger dans un fichier. Mysqldump possède de nombreuses options qui permettent, par exemple, de ne sauvegarder que certaines bases.
Avantages : méthode facile à mettre en place ; possibilité de modifier le fichier texte avant de réinjecter les données dans la base ; permet de réinjecter les données dans une autre version de mysql ou un autre SGDB, si les fonctions utilisées sont compatibles.
Inconvénients : pour une base très grosse (plusieurs Go), cette méthode peut être longue. D'autant que pour garantir la cohérence des données, il est nécessaire de poser un lock sur la base (les requêtes qui ont été envoyées pendant la sauvegarde ont été mises en attente, elles ne sont pas perdues).
Syntaxe :
Les principales options sont :
--all-databases | sauvegarde toutes les bases |
--databases base1 base2 | on précise les bases à sauvegarder |
--lock-all-tables | on ajoute un lock sur toutes les bases, pour garantir la cohérence des tables. Fortement conseillé, mais empêche toute transaction tant que ça n'est pas fini. |
-uroot -p (ou -uroot -ppassword | on colle le nom de l'utilisateur derrière l'option -u. L'option -p va demander le mot de passe, ce qui empêche toute procédure automatique. On peut également coller le mot de passe en clair derrière l'option -p (ex: -ppassword) pour ne pas avoir besoin de le saisir (ce qui permet les sauvegardes automatiques). |
-h192.168.0.9 | on spécifie l'adresse ip (ou le nom) du serveur mysql |
--no-data | on ne sauvegarde que la structure des bases, pas les données |
mysql --all-databases < dump_mysql.txt | restaure la sauvegarde |
mysql -uroot -ppassword < dump_mysql.txt | idem avec le compte et le mot de passe |
Avec tar, on va directement copier tous les fichiers utilisés par mysql. La méthode est simple, mais il faut faire attention à deux points :
- les fichiers à sauvegarder diffèrent suivant que le moteur est MyISAM ou InnoDB, sachant qu'on peut avoir un mix des deux. Mais dans les deux cas, si on veut tout sauvegarder, il suffit de faire un tar de tout le répertoire /var/lib/mysql/. C'est ce qu'on va faire ici.
- pour que les sauvegardes soient cohérentes et réutilisables, il faut stopper toute activité des bases. Pour cela, il faut se mettre dans un prompt mysql et taper :
Ensuite on passe à la sauvegarde proprement dite :
Puis on délocke les bases pour qu'elles puissent reprendre leur activité :
Remarque : les requêtes qui ont été envoyées pendant la sauvegarde ont été mises en attente. Elles ne sont pas perdues.
Pour la restauration, il suffit de "détarer" dans /var/lib/mysql/ :
La méthode du snapshot LVM nécessite de déjà connaitre le fonctionnement de LVM.
Le principe est le suivant : on créé un volume logique LVM qui va contenir /var/lib/mysql (par exemple /dev/vg/mysql). Ensuite, au moment où on désire faire la sauvegarde, on va locker les bases pour être sûrs d'avoir une sauvegarde cohérente, avec la commande suivante (dans un prompt mysql) :
Puis on créé le snapshot LVM (ça ne dure que quelques secondes) :
Ensuite, on délocke les bases :
L'interruption de service n'a duré que quelques secondes. Maintenant, on peut tranquillement faire notre sauvegarde avec tar, en travaillant sur le snapshot. Attention quand même à ne pas laisser le snapshot actif trop longtemps (car ça peu ralentir le système s'il y a beaucoup d'opérations d'écriture sur la base) et à ne pas le faire trop petit pour ne pas qu'il sature, sinon les données seront inutilisables. Sauvegardons donc nos données :
Il ne reste plus qu'à désactiver et supprimer le snapshot :
Cette méthode a l'avantage d'avoir une interruption de service très courte, mais elle nécessite d'avoir installé mysql dès le début sur un volume LVM, ou de l'avoir migré dessus par la suite.
Il existe d'autres méthodes pour sauvegarder une base mysql, comme mysqlhotcopy ou la réplication des données. Mais cette dernière est trop complexe à mettre en place pour être abordée ici.
Si vous avez juste une petite base perso, pour votre site web par exemple, et que vous voulez faire une sauvegarde sans taper toutes ces commandes barbares, il existe l'excellent PhpMyAdmin. C'est une application web écrite en PHP qui vous permet non seulement de sauvegarder vos bases (vers un fichier, comme mysqldump), mais également de créer, modifier, supprimer des bases et des tables, gérer les comptes utilisateurs mysql, etc. Bref, vous pouvez tout faire très simplement depuis cette interface. Il vous suffit d'installer le paquet phpmyadmin de votre distribution et ses dépendances.
Le site officiel de PhpMyAdmin se trouve ici : http://www.phpmyadmin.net.
Voici également un tutoriel sur l'excellent siteduzero : http://www.siteduzero.com/tutoriel-3-14496-phpmyadmin.html.
Il arrive, malheureusement, suite à un crash du serveur ou simplement par manque de bol, qu'une ou plusieurs tables cassent. Souvant, on est averti par l'application qui utilise la base. Parfois l'appli indique clairement quelle table est cassée, mais parfois il faut les vérifier toutes soit-même.
Il existe une fonction "check table" et une fonction "repair table" qui peuvent nous sauver la vie. Pour s'en servir, il faut d'abord se connecter � la base, comme dans l'exemple suivant :
Pour ceux qui savent faire, on peut également faire des SELECT en langage SQL pour récupérer le nom de toutes les tables, et les réparer toutes en une seule commande. Je ne sais pas le faire, mais si quelqu'un veut m'envoyer la solution, je la mettrai volontier en ligne.
Si vous avez perdu le mot de passe root de mysql, voici comment le réinitialiser.
Dans ce cas, il suffit de se connecter avec un autre compte ayant les droits d'admin (par exemple "toto") et de réinitialiser le mot de passe root, comme suit :
Et voilà.
Dans ce cas, on va devoir faire un arrêt de la base :
Et voilà, vous pouvez vous reconnecter avec votre nouveau mot de passe !
Dernière mise à jour : 5 octobre 2010