Exporter et importer une base MySQL/MariaDB sur un VPS Linux

3 min
Hébergement VPS/VDS

Migrer un site, restaurer une sauvegarde ou cloner un environnement de test reviennent toujours aux deux mêmes opérations : exporter une base dans un fichier, puis la recharger. Sur un VPS Linux Infrawire, quelques commandes suffisent, sans interface web. Ce guide couvre les exports cohérents, la compression, les gros fichiers, l'encodage et le transfert direct d'un serveur à l'autre.

📋 Prérequis

  • Un VPS Linux sous Ubuntu 24.04 ou Debian 12 avec accès SSH root (l'IP et le mot de passe root sont dans votre espace client)
  • MySQL ou MariaDB installé, ou au minimum le client (apt install mariadb-client)
  • Un utilisateur de base de données disposant des droits SELECT, SHOW VIEW, TRIGGER, LOCK TABLES et EVENT sur la base à exporter
  • Assez d'espace disque libre : vérifiez avec df -h

1. Exporter une base avec mysqldump

Pour les tables InnoDB (moteur par défaut), --single-transaction produit un instantané cohérent sans verrouiller les tables : votre site continue de fonctionner pendant l'export.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

Sur les versions récentes de MariaDB, l'outil existe aussi sous le nom mariadb-dump, avec les mêmes options.

2. Inclure routines, triggers et événements

Les triggers sont exportés par défaut, mais les procédures stockées, les fonctions et les événements planifiés doivent être demandés explicitement. Forcer le jeu de caractères évite les mauvaises surprises avec les accents et les emojis.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

Variantes utiles :

Bash
# Structure seule, sans les lignes mysqldump -u USER -p --no-data DBNAME > schema.sql # Plusieurs bases, avec les instructions CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Toutes les bases du serveur mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. Compresser l'export avec gzip

Le SQL se compresse très bien. Envoyez la sortie directement dans gzip pour que le fichier non compressé ne touche jamais le disque.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Pour ne pas retaper le mot de passe (et l'éviter dans la sortie de ps), placez-le dans ~/.my.cnf :

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Importer un export

Créez d'abord la base cible avec un jeu de caractères moderne, puis chargez le fichier.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Depuis un fichier compressé gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

Attention : par défaut l'export contient DROP TABLE IF EXISTS : importer dans une base existante remplace les tables de même nom. Sauvegardez d'abord la destination.

5. Gérer les gros fichiers

Pour des exports de plusieurs gigaoctets, lancez l'import dans tmux afin qu'une déconnexion SSH ne l'interrompe pas, et utilisez pv pour suivre la progression.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

Détachez-vous avec Ctrl+B puis D, et revenez plus tard avec tmux attach -t import.

6. Transférer directement vers un autre serveur par SSH

Aucun fichier intermédiaire : l'export transite dans un tunnel SSH chiffré et se charge à l'arrivée. Les identifiants sont lus dans ~/.my.cnf (ou via le socket local pour root) de chaque côté.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

La base DBNAME doit déjà exister sur le serveur de destination.

✅ Vérifier le résultat

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

Comparez le nombre de lignes de quelques tables clés entre la source et la destination.

🔧 Dépannage

ERROR 1045 Access denied : utilisateur ou mot de passe incorrect, ou utilisateur non autorisé depuis cet hôte. Testez d'abord avec mysql -u USER -p.

ERROR 2006 MySQL server has gone away : une ligne ou une requête dépasse max_allowed_packet. Augmentez-le côté serveur dans la section [mysqld] de la configuration puis redémarrez le service, ou passez --max-allowed-packet=512M au client.

Accents illisibles après l'import : le fichier a été lu avec le mauvais jeu de caractères. Exportez avec --default-character-set=utf8mb4 et importez avec la même option.

ERROR 1227 ou erreurs DEFINER : l'export référence un utilisateur absent de la destination. Supprimez la clause pendant l'import :

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 Vos bases se sauvegardent, se restaurent et se migrent désormais facilement d'un serveur à l'autre !

Restez à jour avec les dernières offres, réductions et promotions spéciales.

Voir les promotions

Nous utilisons des cookies

Nous utilisons des cookies analytiques pour améliorer votre expérience sur notre site. Aucune donnée n'est revendue à des tiers. En savoir plus dans notre politique de confidentialité.