6.7. Sauvegarde et restauration de bases

La problématique générale de sauvegarde de bases de données est de rester en production pendant cette sauvegrde : c'est ce que l'on appelle la sauvegarde à chaud. Sauvegarder à froid (serveur arrêté) est aussi simple qu'une copie de fichier classique. En revanche, lorsque la base fonctionne, une sauvegarde tradtitionnelle ne fonctionnera pas puisque les objets sauvegardés (fichiers de tables) seront flous (changeants).

La méthode la plus simple et la plus sûre pour la sauvegarde à chaud consiste à faire un dump de la base avec mysqldump. Cette commande suit la syntaxe générale et prend en argument le nom de la base que l'on souhaite « exporter ». Cet export se fera par défaut en SQL, et nous obtiendrons ainsi un export de la base sous forme de commandes permettant de reconstruire cette base.

root@ubuntu:~# mysqldump -u dbadmin -p xxxx
Enter password: 
-- MySQL dump 10.11
--
-- Host: localhost    Database: mabase
-- ------------------------------------------------------
-- Server version       5.0.38-Ubuntu_0ubuntu1-log

...

--
-- Table structure for table `Genies`
--

DROP TABLE IF EXISTS `Genies`;
CREATE TABLE `Genies` (
  `Nom` varchar(200) default NULL,
  `Prenom` varchar(200) default NULL,
  `AnneeNaissance` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `Genies`
--

INSERT INTO `Genies` VALUES ('Cox','Alan',1968);
INSERT INTO `Genies` VALUES ('Knuth','Donald',1938),
INSERT INTO `Genies` VALUES ('Torvalds','Linus',1969);
INSERT INTO `Genies` VALUES ('Turing','Alan',2912);
INSERT INTO `Genies` VALUES ('Gates','Bill',1955);
INSERT INTO `Genies` VALUES ('Einstein','Albert',1879);

-- Dump completed on 2007-06-17 12:52:13
root@ubuntu:~# 

En redirigeant la sortie standard (ou avec l'option -r), on peut sauver ces instructions de création/remplissage de tables dans un fichier SQL qui pourra plus tard être utilisé simplement avec le shell mysql :

mysql -u dbadmin -p < fichier_dump.sql

Pour faire un dump de toutes les bases du serveur, on utilisera l'option --all-databases à la place du nom de la base.

L'autre possibilité pour la sauvegarde de bases à chaud et la commande mysqlhotcopy. Elle permet d'effectuer une copie des fichiers de tables tout en s'assurant de l'intégrité de ces fichiers. mysqlhotcopy ne supporte pas la lecture interactive du mot de passe (option -p des autres commandes). Pour l'utiliser, on devra donc configurer un identifiant/mot de passe temporairement dans la section [client] du fichier my.cnf :

root@ubuntu:~# cat /etc/mysql/my.cnf
#
# The MySQL database server configuration file.
#
...
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
...
user     = dbadmin
password = motdepasse

L'utilisation de mysqlhotcopy est alors très simple et suit la syntaxe de cp :

mysqlhotcopy {base} [répertoire]

Par exemple, pour copier la base mabase, on utilisera :

root@ubuntu:~# mysqlhotcopy mabase  ~/dbbackup/ 
Locked 1 tables in 0 seconds.
Flushed tables (`mabase`.`Genies`) in 0 seconds.
Copying 4 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 1 tables (4 files) in 0 seconds (1 seconds overall).
root@ubuntu:~# ls ~/dbbackup/
mabase
root@ubuntu:~# ls ~/dbbackup/mabase/
db.opt  Genies.frm  Genies.MYD  Genies.MYI
root@ubuntu:~# 

Si un seul argument (base) est fourni à la commande, il fera une copie de la base avec le suffixe _copy qui sera immédiatement disponible comme une nouvelle base :

root@ubuntu:~# mysqlhotcopy mabase
Using copy suffix '_copy'
Locked 1 tables in 0 seconds.
Flushed tables (`mabase`.`Genies`) in 0 seconds.
Copying 4 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 1 tables (4 files) in 1 second (1 seconds overall).
root@ubuntu:~# mysql -u dbadmin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.0.38-Ubuntu_0ubuntu1-log Ubuntu 7.04 distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mabase             | 
| mabase_copy        | 
| mysql              | 
+--------------------+
4 rows in set (0.00 sec)

mysql>

D'autre fonctionnalités sont disponibles, comme le copie de certaines tables uniquement, l'utilisation d'expressions régulières, ma copie via scp, etc... Attention tout de même, la page de man affiche un avertissement clair : « WARNING: THIS PROGRAM IS STILL IN BETA »...