Une sauvegarde est un fichier texte d'instructions SQL. Sa capacité à se restaurer dépend de la façon dont elle a été écrite, et les valeurs par défaut ne conviennent pas à un site en production. La plupart des échecs d'import se jouent des semaines plus tôt, au moment de la sauvegarde.
La commande
mysqldump \
--single-transaction \
--quick \
--routines --triggers --events \
--default-character-set=utf8mb4 \
--set-gtid-purged=OFF \
dbname | gzip > db-$(date +\%F).sql.gz
Ce que chacune évite
- --single-transaction — un instantané cohérent sans verrouiller les tables. Sans elle, un site fréquenté est figé pendant toute la sauvegarde.
- --quick — diffuse ligne par ligne au lieu de charger une grande table en mémoire.
- --routines --triggers --events — non incluses par défaut. Une restauration sans elles paraît complète et perd sans bruit chaque procédure stockée et chaque événement planifié.
- --default-character-set=utf8mb4 — l'arabe et les émojis survivent à l'aller-retour.
--single-transaction n'est cohérente que pour InnoDB. Une table MyISAM dans la même base est sauvegardée sans cette garantie : convertissez-les, ou acceptez une copie incohérente de ces tables.
Vérifiez le fichier, pas le code de sortie
gzip -t db-2026-09-05.sql.gz # the archive is intact
zcat db-2026-09-05.sql.gz | tail -5 # ends with "Dump completed"
zcat db-2026-09-05.sql.gz | grep -c "CREATE TABLE"
Une sauvegarde coupée par un disque qui se remplit reste un gzip valide sur presque toute sa longueur. La ligne de fin est la preuve que mysqldump est allé au bout — et la vérifier coûte une commande.
Restaurez-la ailleurs, à intervalles réguliers
mysql -e "CREATE DATABASE restore_test CHARACTER SET utf8mb4"
zcat db-2026-09-05.sql.gz | mysql restore_test
mysql restore_test -e "SELECT COUNT(*) FROM orders"
Comparez ce nombre de lignes à la production. Une sauvegarde qui s'importe sans erreur et arrive avec la moitié des lignes est l'échec que personne ne voit, parce que l'import n'a rien dit du tout.
