Diviser un fichier SQL volumineux en petits pour un import facilité

SQL multi-file

13 févr. 2026

Contexte du projet

Le projet est installé sur une VM Linux Debian (Virtual Box), nous devons déboguer un problème à partir d'un fichier SQL avec des données de production anonymisées. Le fichier SQL fait plusieurs giga octets.


Malgré de multiples tentatives d'importation – que ce soit via PHPStorm depuis votre machine hôte, en ligne de commande depuis l'hôte, ou directement au sein de la VM via son terminal – le résultat est systématiquement le même : la VM se fige, l'importation échoue en cours de processus, obligeant à tout reprendre depuis le début.

Solution de contournement

La meilleur solution envisagée c'est de découper le fichier en plusieurs petits fichiers SQL. Nous pourrons alors importer les fichiers pour compléter le modèle des données à partir de la table qui à plantée. Ainsi chaque fichier pourra être reprise jusqu'à l'import complet.

Merci à Kedar Vaijanapurkar qui a développé un script permettant de manipuler un fichier mysqldump : https://github.com/kedarvj/mysqldumpsplitter/

MySQLDumpSplitter

Pour installer le script https://github.com/kedarvj/mysqldumpsplitter/blob/master/mysqldumpsplitter.sh et ajouter les droits d'éxécution :

$ chmod +x mysqldumpsplitter.sh 

Lister les tables présentes dans le fichier SQL :

$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --desc

Exporter la table la plus grosse qui plante à chaque tentative :

$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --extract REGEXP --match_str 'TABLE_NAME'

On obtient dans le dossier out/ un fichierTABLE_NAME.sql.gz .

Import d'un fichier gzip dans MySQL

Pour l'importer, on va utiliser gunzip avec la commande suivante :

$ gunzip ./out/TABLE_NAME.sql.gz | mysql -h localhost -u <db_user> --password=<db_password> <DBNAME>

Malheureusement, nous n'avons pas beaucoup d'information sur l'avancé de cet import.

Barre de progression

Il nous faudrait une barre de progression pour plus de visibilité sur l'avancée de l'import :

progressebar.png

Installer progresse bar

sudo apt install pv

Utiliser pv

$ pv ./out/TABLE_NAME.sql.gz | gunzip | mysql -h localhost -u <db_user> --password=<db_password> <DBNAME>

Export de plusieurs tables

L'export et l'import fonctionnent parfaitement pour une table, voici comment en exporter plusieurs :

$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --extract REGEXP --match_str '(TABLE_NAME_1|TABLE_NAME_2|TABLE_NAME_3|TABLE_NAME_4|TABLE_NAME_5|TABLE_NAME_6|TABLE_NAME_7|TABLE_NAME_8)' 

Script d'import en masse

Nous n'allons pas executer une commande par table, on va donc se développer un petit script d'import de tous les fichiers présents dans le dossier out/

import-sql-gz.sh

#!/bin/bash
for i in ./out/*.sql.gz
do
   echo "Importing: $i"
   pv $i | gunzip | mysql -h localhost -u <db_user> --password=<db_password> <DBNAME>
   wait
done 

Exécution d'un import progressif qui se déroule sans accros :

$ chmod +x import-sql-gz.sh
$ ./import-sql-gz.sh

Le débogage du projet peut commencer !

Nous vous invitons à nous contacter pour toute demande de débogage de vos solutions ou pour la mise en oeuvre de votre projet, n'hésitez pas à nous solliciter.