Aller au contenu

MariaDB : sauvegarde et restauration

La sauvegarde logique (mariadb-dump) produit un fichier SQL qui recrée les bases. Elle convient aux volumes petits à moyens.

Fenêtre de terminal
mariadb-dump -u app -p --single-transaction boutique > boutique.sql

--single-transaction produit un instantané cohérent des tables InnoDB sans les verrouiller.

Option Effet
--single-transaction Instantané cohérent (InnoDB), sans verrou
--routines --triggers --events Inclut procédures, déclencheurs et événements
--no-data Structure seulement
--no-create-info Données seulement
--databases a b Plusieurs bases, avec CREATE DATABASE
--all-databases Toutes les bases
--ignore-table=boutique.journaux Exclut une table
Fenêtre de terminal
sudo mariadb-dump --all-databases --single-transaction --routines --triggers --events > toutes.sql

En root local, sudo suffit (authentification unix_socket).

Fenêtre de terminal
sudo mariadb-dump --single-transaction --databases boutique | gzip > boutique-$(date +%F).sql.gz

Vérifier l’archive : gzip -t boutique-2026-01-01.sql.gz et zcat boutique-2026-01-01.sql.gz | head.

Fenêtre de terminal
sudo mariadb -e "CREATE DATABASE IF NOT EXISTS boutique CHARACTER SET utf8mb4;"
sudo mariadb boutique < boutique.sql
zcat boutique-2026-01-01.sql.gz | sudo mariadb

Pour une sauvegarde faite avec --databases ou --all-databases, ne pas préciser de base à la restauration : le fichier contient les CREATE DATABASE et USE.

CREATE USER 'sauvegarde'@'localhost' IDENTIFIED VIA unix_socket;
GRANT SELECT, SHOW VIEW, TRIGGER, EVENT, LOCK TABLES ON *.* TO 'sauvegarde'@'localhost';

Avec un compte système sauvegarde, la sauvegarde ne nécessite aucun mot de passe.

Script /usr/local/bin/sauvegarde-mariadb :

#!/bin/bash
set -euo pipefail
dossier=/var/backups/mariadb
mkdir -p "$dossier"
mariadb-dump --all-databases --single-transaction --routines --triggers --events \
| gzip > "$dossier/toutes-$(date +%F).sql.gz"
find "$dossier" -name 'toutes-*.sql.gz' -mtime +14 -delete
Fenêtre de terminal
sudo chmod 750 /usr/local/bin/sauvegarde-mariadb

Service /etc/systemd/system/sauvegarde-mariadb.service :

[Unit]
Description=Sauvegarde MariaDB
[Service]
Type=oneshot
ExecStart=/usr/local/bin/sauvegarde-mariadb

Minuteur /etc/systemd/system/sauvegarde-mariadb.timer :

[Unit]
Description=Sauvegarde MariaDB quotidienne
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Fenêtre de terminal
sudo systemctl daemon-reload
sudo systemctl enable --now sauvegarde-mariadb.timer
systemctl list-timers sauvegarde-mariadb.timer

Le service tourne en root : il se connecte par unix_socket. Voir systemd : minuteurs.

Fenêtre de terminal
sudo apt install mariadb-backup
sudo mariadb-backup --backup --target-dir=/var/backups/mariadb-physique
sudo mariadb-backup --prepare --target-dir=/var/backups/mariadb-physique

La copie physique est plus rapide pour de gros volumes. La restauration exige un serveur arrêté et un dossier de données vide (mariadb-backup --copy-back) : lire la documentation avant usage.

  • Appliquer la règle 3-2-1 : 3 copies, 2 supports, 1 hors du serveur.
  • Tester régulièrement la restauration : une sauvegarde non testée est une hypothèse.
  • Protéger les fichiers (chmod 600, dossier réservé) : ils contiennent toutes les données.
  • Sauvegarder aussi /etc/mysql/.
Symptôme Piste
Access denied … when using LOCK TABLES Ajouter --single-transaction ou le droit LOCK TABLES
mariadb-dump: command not found Ancien nom : utiliser mariadb-dump (paquet mariadb-client)
Restauration très lente Fichier volumineux : SET autocommit=0 en tête du fichier et COMMIT; à la fin, ou sauvegarde physique
ERROR 1062 Duplicate entry à la restauration Données déjà présentes : restaurer dans une base vide
Got a packet bigger than 'max_allowed_packet' Augmenter max_allowed_packet dans la configuration

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

mariadb-dump existe sur les deux versions. Pour restaurer une sauvegarde faite sur 10.11 dans 11.8, tester d’abord sur une instance de test, puis lancer sudo mariadb-upgrade si une erreur de table apparaît.