Sauvegarder et restaurer une base de donnees MySQL

Credit : Illustration backtotheweb.fr

Sauvegarder et restaurer une base de donnees MySQL

Dylan D. — Agent Support Technique Serveur Depannage 676 mots 4 min

Sauvegarder et restaurer une base de donnees MySQL

On a tous galéré avec ça au moins une fois.

La sauvegarde de vos bases de donnees est critique. Une mauvaise manipulation, un crash disque ou un piratage peut tout detruire. Voici les methodes de sauvegarde et restauration.

mysqldump : la methode classique

mysqldump est l'outil standard, installe avec MySQL/MariaDB :

# Sauvegarder une base
mysqldump -u root -p monsite > monsite_backup.sql

# Sauvegarder avec les routines et triggers
mysqldump -u root -p --routines --triggers --events monsite > monsite_full.sql

# Sauvegarder toutes les bases
mysqldump -u root -p --all-databases > all_databases.sql

# Sauvegarder uniquement certaines tables
mysqldump -u root -p monsite wp_posts wp_postmeta > tables_specifiques.sql

# Sauvegarder la structure uniquement (sans donnees)
mysqldump -u root -p --no-data monsite > monsite_schema.sql

# Sauvegarder les donnees uniquement (sans structure)
mysqldump -u root -p --no-create-info monsite > monsite_data.sql

Compression a la volee

Les dumps SQL sont tres compressibles (ratio 5:1 a 10:1) :

# Compression gzip
mysqldump -u root -p monsite | gzip > monsite_$(date +%Y%m%d_%H%M).sql.gz

# Compression zstd (plus rapide et meilleur ratio)
mysqldump -u root -p monsite | zstd > monsite_$(date +%Y%m%d_%H%M).sql.zst

# Compression avec parallelisme (pigz)
mysqldump -u root -p monsite | pigz -p 4 > monsite_$(date +%Y%m%d_%H%M).sql.gz

Options recommandees pour mysqldump

mysqldump -u root -p \
  --single-transaction \
  --quick \
  --lock-tables=false \
  --routines \
  --triggers \
  --events \
  --set-gtid-purged=OFF \
  monsite | gzip > monsite_$(date +%Y%m%d_%H%M).sql.gz

mysqlpump : la version parallele

mysqlpump permet des sauvegardes paralleles, plus rapides sur de grosses bases :

mysqlpump -u root -p \
  --default-parallelism=4 \
  --databases monsite boutique > multi_backup.sql

Avantages par rapport a mysqldump :

Xtrabackup : sauvegarde physique (production)

Pour les bases volumineuses (> 10 Go), Percona XtraBackup est la reference :

# Installation
sudo apt install percona-xtrabackup-80

# Sauvegarde complete
sudo xtrabackup --backup --target-dir=/backup/full/ \
  --user=root --password=MotDePasse

# Preparer la sauvegarde
sudo xtrabackup --prepare --target-dir=/backup/full/

# Sauvegarde incrementale
sudo xtrabackup --backup --target-dir=/backup/inc1/ \
  --incremental-basedir=/backup/full/ \
  --user=root --password=MotDePasse

Avantages de xtrabackup :

Restauration

# Depuis un fichier SQL
mysql -u root -p monsite < monsite_backup.sql

# Depuis un fichier compresse gzip
gunzip < monsite_backup.sql.gz | mysql -u root -p monsite



> **Astuce** : j'ai appris ça à la dure après un incident en prod un vendredi soir.


# Depuis un fichier zstd
zstd -d < monsite_backup.sql.zst | mysql -u root -p monsite

# Restaurer dans une nouvelle base
mysql -u root -p -e "CREATE DATABASE monsite_restore;"
mysql -u root -p monsite_restore < monsite_backup.sql

Restauration avec xtrabackup :

# Arreter MySQL
sudo systemctl stop mysql

# Vider le datadir
sudo rm -rf /var/lib/mysql/*

# Copier la sauvegarde
sudo xtrabackup --copy-back --target-dir=/backup/full/

# Corriger les permissions
sudo chown -R mysql:mysql /var/lib/mysql

# Redemarrer
sudo systemctl start mysql

Automatiser avec cron

Creez un script /opt/scripts/backup-mysql.sh :

#!/bin/bash
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M)
RETENTION=7

mkdir -p $BACKUP_DIR

# Sauvegarder
mysqldump -u backup_user -pMotDePasse \
  --single-transaction --quick \
  --all-databases | gzip > "$BACKUP_DIR/all_dbs_$DATE.sql.gz"

# Supprimer les sauvegardes anciennes
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION -delete

# Verifier la taille
ls -lh "$BACKUP_DIR/all_dbs_$DATE.sql.gz"

Ajoutez le cron :

chmod +x /opt/scripts/backup-mysql.sh
crontab -e
# Sauvegarde tous les jours a 3h du matin
0 3 * * * /opt/scripts/backup-mysql.sh >> /var/log/mysql-backup.log 2>&1

Verifier vos sauvegardes

Une sauvegarde non testee n'est pas une sauvegarde :

# Verifier l'integrite du fichier gz
gunzip -t monsite_backup.sql.gz

# Restaurer sur un serveur de test
mysql -u root -p test_restore < monsite_backup.sql
mysql -u root -p -e "SELECT COUNT(*) FROM test_restore.wp_posts;"

Testez vos restaurations regulierement. C'est la seule facon d'etre certain que vos sauvegardes fonctionnent.

# Articles similaires

// newsletter

Cet article vous a aide ? Recevez les prochains par email.