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