Objectif
Nous voulons qu'un fichier SQL, résultat d'une commande mysqldump
des données des différentes tables de la base, soit éclaté en autant de fichiers sql contenant les commandes SQL relatives à une seule table de cette base à chaque fois. Nous ne voulons que les insertions à faire et nom la structure des tables. Il serait aisé de modifier l'opération pour faire cet éclatement sur un fichier SQL contenant aussi les commandes de création des tables elles-mêmes.
Solution 1 (compliquée)
Warning |
---|
Il ne faut dumper qu'une seule base de données à la fois pour que ça fonctionne et faire attention de mettre l'ensemble des fichiers SQL générés dans un répertoire différent de celui contenant le dump original car un nom de table identique au nom de la base pourrait conduire à des erreurs. |
- Dump de la base
NOM_BASE_A_DUMPER (seulement les données des tables).
Code Block |
---|
language | bash |
---|
title | Dump SQL d'une base mysql avec mysqldump |
---|
|
mysqldump --defaults-file=/etc/mysql.secret --host=localhost --port=3306 --protocol=tcp --user=root --quick --tables --skip-add-drop-table --skip-add-drop-database --skip-create-options --no-create-info -c NOM_BASE_A_DUMPER > /tmp/NOM_BASE_A_DUMPER.sql |
- Éclatement du fichier obtenu en autant de fichiers SQL que de tables dans la base considérée.
Code Block |
---|
|
perl -e 'while(<>){ my $ligne=$_; chomp($ligne) ; if ( /^-- Dumping data for table \`([^`]+)\`$/ ) { close SQL; open SQL, ">", "$1.sql" or die ("Impossible d ouvrir $1.sql"); print SQL "$ligne\n"; } else { print SQL "$ligne\n"; } }' /tmp/NOM_BASE_A_DUMPER.sql |
- Le résultat donnera une liste de fichiers ayant des noms du type
<NOM TABLE>.sql
.
Solution 2 (plus simple)
- Au lieu d'éclater le résultat obtenu, on peut simplement utiliser les bonnes options de
mysqldump
.
Code Block |
---|
|
for table in $(mysql -u root -p<mot de passe mysql> NOM_BASE_A_DUMPER -e 'show tables;' | tail -n +3)
do
mysqldump --user=root NOM_BASE_A_DUMPER "$table" > /tmp/NOM_BASE_tables/"$table".sql
done |
Warning |
---|
La commande précédente ne fonctionne pas si les noms de tables contiennent des espaces. |
Annexe
Pour un fichier SQL d'un mysqldump
complet :
Code Block |
---|
# dump de la base
mysqldump --tables -c NOM_BASE_A_DUMPER > /tmp/NOM_BASE_A_DUMPER.sql
# éclatement
perl -e 'while(<>){ my $ligne=$_; chomp($ligne) ; if ( /^-- Table structure for table \`([^`]+)\`$/ ) { close SQL; open SQL, ">", "$1.sql" or die ("Impossible d ouvrir $1.sql"); print SQL "$ligne\n"; } else { print SQL "$ligne\n"; } }' /tmp/NOM_BASE_A_DUMPER.sql |
La seule différence entre les deux, c'est de faire une découpe de fichier sur -- Table structure for table
au lieu de couper sur -- Dumping data for table
.