connectiva penguin bsd logo

MySQL pour l'administrateur système

1. Introduction

2. Installer MySQL

3. Choisir le moteur de MySQL

4. Démarrer/arrêter MySQL

5. Afficher les bases et les tables

6. Faire des sauvegardes

7. PhpMyAdmin

8. Vérifier et réparer les tables

9. Perte du mot de passe root


1. Introduction

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.

2. Installer 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.

3. Choisir le moteur de MySQL

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 :

show table status from ma_table;

Il faut ensuite taper "quit" pour sortir du prompt mysql.

4. Démarrer/arrêter 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".

5. Afficher les bases et les tables

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 :

6. Faire des sauvegardes

Il existe plusieurs méthodes pour sauvegarder des bases mysql. En voici quelques unes.

6.1. mysqldump

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).

Sauvegarde :

Syntaxe :

mysqldump -options > dump_mysql.txt
mysqldump -options | gzip > dump_mysql.txt.gz # idem, en compressant (fortement conseillé pour de grosses bases)

Les principales options sont :

--all-databasessauvegarde toutes les bases
--databases base1 base2on précise les bases à sauvegarder
--lock-all-tableson 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 -ppasswordon 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.9on spécifie l'adresse ip (ou le nom) du serveur mysql
--no-dataon ne sauvegarde que la structure des bases, pas les données
Restauration :
mysql --all-databases < dump_mysql.txtrestaure la sauvegarde
mysql -uroot -ppassword < dump_mysql.txtidem avec le compte et le mot de passe

6.2. tar

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 :

mysql> FLUSH TABLES WITH READ LOCK;

Ensuite on passe à la sauvegarde proprement dite :

tar czvf dump_mysql.tar.gz /var/lib/mysql/*

Puis on délocke les bases pour qu'elles puissent reprendre leur activité :

mysql> UNLOCK TABLES;

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/ :

tar xzvf dump_mysql.tar.gz /var/lib/mysql/

6.3. snapshot lvm

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) :

mysql> FLUSH TABLES WITH READ LOCK;

Puis on créé le snapshot LVM (ça ne dure que quelques secondes) :

lvcreate --snapshot -n snapmysql -L 5G /dev/vg/mysql

Ensuite, on délocke les bases :

mysql> UNLOCK TABLES;

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 :

mount /dev/vg/snapmysql /mnt/backup_mysql
cd /mnt/backup_mysql
tar czvf /tmp/dump_mysql.tar.gz *
umount /mnt/backup_mysql

Il ne reste plus qu'à désactiver et supprimer le snapshot :

lvchange -a n /dev/vg/snapmysql
lvremove /dev/vg/snapmysql

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.

6.4. autres méthodes

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.

7. PhpMyAdmin

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.

8. Vérifier et réparer les tables

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 :

$ mysql
mysql> use ma_base;
mysql> show tables;
mysql> check table ma_table_1;
mysql> repair table ma_table_1;
mysql> check table ma_table_2;
mysql> repair table ma_table_2;
mysql> quit;

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. ;o)

9. Perte du mot de passe root

Si vous avez perdu le mot de passe root de mysql, voici comment le réinitialiser.

9.1. Si vous avez un autre compte admin mysql

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 :

mysql -utoto mysql
# réinitialiser le mot de passe root
UPDATE user SET password=PASSWORD('nouveaumotdepasse') WHERE user="root";
# appliquer les modifs
FLUSH PRIVILEGES;
# quitter
exit

Et voilà.

9.2. Si vous n'avez pas d'autre compte admin mysql, mais que vous êtes root sur le système

Dans ce cas, on va devoir faire un arrêt de la base :

# se connecter en root
su -
# arrêter MySQL
service mysqld stop # pour Redhat ou "/etc/init.d/mysql stop" pour debian
# relancer MySQL sans le contrôle des permissions
mysqld_safe --skip-grant-tables &
# se connecter sans mot de passe
mysql -uroot mysql
# réinitialiser le mot de passe root
UPDATE user SET password=PASSWORD('nouveaumotdepasse') WHERE user="root";
# quitter
exit
# relance MySQL
service mysqld restart # pour Redhat ou "/etc/init.d/mysql restart" pour debian

Et voilà, vous pouvez vous reconnecter avec votre nouveau mot de passe !

Dernière mise à jour : 5 octobre 2010

Valid XHTML 1.1

logo firefox logo ubuntu logo debian logo mandriva logo gimp