Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migrated to Confluence 5.3

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)

Avertissement

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).
Bloc de code
languagebash
titleDump 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.
Bloc de code
languagebash
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.
Bloc de code
languagebash
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
Avertissement

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 :

Bloc de code
# 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.