En tant qu’administrateur de base de données MySQL, vous avez surement mis en place une politique de sauvegarde des bases de données qui permet de sauvegarder toutes les bases installées.
Pour ma part j’utilise automysqlbackup qui permet de faire une rotation des bases de données.
Or ce logiciel sauvegarde l’ensemble des bases dans un seul et même fichier.
Imaginons maintenant qu’un développeur vienne vous dire qu’il a détruit les données d’une table et qu’il faudrait restaurer uniquement cette table à partir des données de la veille.
La première chose que vous faites et de croiser les doigts en allant regarder dans le répertoire de sauvegarde s’il y a bien un dump des bases.
Ensuite, vous essayez de localiser la table en question avec votre éditeur préféré pour faire un copier coller dans l’IHM MySQL Workbench.
Problème: le fichier de dump fait 20 Go!
même vi a du mal à ouvrir le fichier…
Vous devez donc vous pencher sur les capacité du programme sed dont voici une bonne introduction.
L’explication suivante s’appuie sur un exemple précis:
restaurer la table comments qui appartient à la base de donées facebook.
Identification des patterns
Si on regarde de plus près le type de sauvegarde qu’automysqlbackup effectue ( grâce au programme mysqldump), on remarque plusieurs choses :
- avant chaque création de base de données on retrouve un commentaire.Exemple :
—
— Current Database: `facebook`
—
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `facebook` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `facebook`;
- pour chaque table , la table est détruite ( commande DROP)
DROP TABLE IF EXISTS `comment`;
- la table est crée, verrouillée, les données sont insérées puis enfin la table est déverrouillée :
UNLOCK TABLES;
On peut donc en déduire une stratégie :
- d’abord extraire la base de données cherchée et la sauvegarder dans un fichier
- ensuite extraire la table cherchée et la sauvegarder dans un fichier
Extraction de la Base de données
On va donc utiliser le pattern « Current Database » pour extraire uniquement la base de données facebook:
sed -n -e ‘/Current Database: .facebook/,/Current Database/p’ mon_fichier_de_dump.sql > facebook.sql
cette commande va extraire à partir du fichier mon_fichier_de_dump.sql tout ce qui se trouve entre le texte « Current Database: `facebook` » et le prochain texte « Current Database: » et sauvegarder dans le fichier facebook.sql.
l’option -n avec l’option /p permet à sed de n’écrire que les lignes comprises entre les deux patterns.
l’option -e
Extraction de la table
Une fois que la base de données est extraite, on peut maintenant extraire la table comment :
sed -n -e ‘/DROP TABLE.*`comment`/,/UNLOCK TABLES/p’ facebook.sql > comment.sql
Restauration de la table
Il suffit ensuite de restaurer la table comments dans votre serveur de base de données avec la commande mysql:
mysql -h myserver.mynetwork.com -u root -pmyPassword -D facebook< facebook.sql
Evidemment, vous pourrez modifier
Salut,
Une backup individuelle de chaque database, ça simplifie un peu la procédure, qu’en penses tu ?
À plus
G
Oui c’est vrai mais comme pas mal d’autres dbmasters, je suis un gros bourrin et j’avais pas vu que l’option CONFIG_mysql_dump_use_separate_dirs permettait de le faire.
Super astuce, franchement ça m’a sauvé la vie aujourd’hui. Même si la remarque de Snail est pertinente , il arrive parfois qu’on se retrouve avec ce genre de dump et là c’est vraiment efficace. Merci