tools.rdr-it.comScriptsBackup MySQL/MariaDB

🗄 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