Votre espace a été migré vers le nouveau wiki le 21/08/2023 : https://wiki.univ-lorraine.fr/wiki/perso/view/zimmerm15
Les modifications apportées ici depuis cette date ne seront pas reportées. Le wikidocs disparaitra définitivement le 31/01/2024.

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)

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

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 :

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

  • Aucune étiquette