🗄 Backup MySQL/MariaDB
Dump avec rotation, compression, rétention configurable
bashScript
Backup MySQL/MariaDB
Script de sauvegarde automatique avec rotation et compression.
Fonctionnalités
- Dump de toutes les bases ou d'une liste définie
- Compression gzip automatique
- Rotation avec rétention configurable (défaut 7 jours)
- Log horodaté
- Notification par email en cas d'échec (optionnel)
Script
#!/bin/bash
backup-mysql.sh — Sauvegarde MySQL/MariaDB avec rotation
Usage : ./backup-mysql.sh [--db nom_base]
Cron : 0 2 * /opt/scripts/backup-mysql.sh
set -euo pipefail
── Configuration ─────────────────────────────────────────────
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
MYSQL_USER="backup_user"
MYSQL_PASS="" # Laisser vide si ~/.my.cnf configuré
MYSQL_HOST="localhost"
LOG_FILE="/var/log/backup-mysql.log"
MAIL_ON_ERROR="" # [email protected] ou vide
Bases à exclure (séparées par |)
EXCLUDE_DBS="information_schema|performance_schema|sys|mysql"
── Fonctions ─────────────────────────────────────────────────
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }
error_exit() {
log "ERREUR: $1"
[[ -n "$MAIL_ON_ERROR" ]] && \
echo "Backup MySQL échoué sur $(hostname): $1" | \
mail -s "[BACKUP] Échec MySQL $(hostname)" "$MAIL_ON_ERROR"
exit 1
}
mysql_cmd() {
local args=(-h"$MYSQL_HOST" -u"$MYSQL_USER")
[[ -n "$MYSQL_PASS" ]] && args+=(-p"$MYSQL_PASS")
mysql "${args[@]}" "$@"
}
mysqldump_cmd() {
local args=(-h"$MYSQL_HOST" -u"$MYSQL_USER" --single-transaction
--routines --triggers --events --hex-blob)
[[ -n "$MYSQL_PASS" ]] && args+=(-p"$MYSQL_PASS")
mysqldump "${args[@]}" "$@"
}
── Init ──────────────────────────────────────────────────────
mkdir -p "$BACKUP_DIR"
DATE=$(date '+%Y%m%d_%H%M%S')
log "=== Démarrage backup MySQL ==="
Vérifier connexion
mysql_cmd -e "SELECT 1;" &>/dev/null || error_exit "Connexion MySQL impossible"
── Lister les bases ──────────────────────────────────────────
if [[ "${1:-}" == "--db" && -n "${2:-}" ]]; then
DATABASES=("$2")
log "Mode sélectif : base '$2'"
else
mapfile -t DATABASES < <(mysql_cmd -N -e "SHOW DATABASES;" 2>/dev/null | \
grep -vE "^($EXCLUDE_DBS)$")
log "Bases trouvées : ${#DATABASES[@]}"
fi
── Dump ─────────────────────────────────────────────────────
SUCCESS=0
FAIL=0
for DB in "${DATABASES[@]}"; do
[[ -z "$DB" ]] && continue
OUT_FILE="$BACKUP_DIR/${DB}_${DATE}.sql.gz"
log "Dump : $DB → $OUT_FILE"
if mysqldump_cmd "$DB" 2>/dev/null | gzip -9 > "$OUT_FILE"; then
SIZE=$(du -sh "$OUT_FILE" | cut -f1)
log " ✓ $DB ($SIZE)"
((SUCCESS++))
else
log " ✗ $DB — ÉCHEC"
rm -f "$OUT_FILE"
((FAIL++))
fi
done
── Rotation ─────────────────────────────────────────────────
log "Rotation : suppression des fichiers > ${RETENTION_DAYS}j"
DELETED=$(find "$BACKUP_DIR" -name "*.sql.gz" \
-mtime +"$RETENTION_DAYS" -print -delete | wc -l)
log " $DELETED fichier(s) supprimé(s)"
── Résumé ────────────────────────────────────────────────────
log "=== Fin backup : $SUCCESS succès, $FAIL échec(s) ==="
[[ $FAIL -gt 0 ]] && error_exit "$FAIL base(s) en échec"
exit 0
Prérequis
# Créer l'utilisateur MySQL de backup (minimal)
mysql -u root -p << 'SQL'
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'mot_de_passe_fort';
GRANT SELECT, SHOW DATABASES, LOCK TABLES, RELOAD, REPLICATION CLIENT ON . TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
SQL
Ou utiliser ~/.my.cnf pour éviter le mot de passe en clair
cat >> ~/.my.cnf << 'CNF'
[client]
user=backup_user
password=mot_de_passe_fort
host=localhost
CNF
chmod 600 ~/.my.cnf
Installation cron
chmod +x /opt/scripts/backup-mysql.sh
Backup quotidien à 2h du matin
echo "0 2 * root /opt/scripts/backup-mysql.sh >> /var/log/backup-mysql.log 2>&1" \
> /etc/cron.d/backup-mysql
🔧 Ouvrir tools.rdr-it.com — application complète →
Plus de 40 outils AdminSys gratuits · SSL · DNS · Docker · Nginx · SSH · Mermaid · et plus