Voici un petit script bash que vous placerez dans un cron pour sauvegarder vos bases de données. Pour une exécution toutes les heures, ce script :

  • Garde un historique des modifications heure par heure pour les deux dernières semaines avec rdiff-backup
  • Créer un fichier dump .sql par tables par bases de données
  • Garde un backup journalier compressé avec gzip

Prérequis

Le seul prérequis est rdiff-backup.

Configuration

Il nécessite toutefois un brin de configuration.

  • IGNOREDB : Les bases de données à ignorer séparées par un espace
  • DIR : Le répertoire où sauvegarder les données avec le / final
  • USER : L'utilisateur MySQL
  • PWD : Son mot de passe (peut être vide si aucun)
  • HOST : Le serveur MySQL

Script de sauvegarde MySQL

Certain apprécierons (dont moi-même) moyennement le mot de passe en clair dans le script, mais libre à vous de trouver une autre solution et surtout de créer un utilisateur avec des permissions limitées.

Voici la bête :

#!/bin/bash

# Databases to ignore, separated by a space or pipe
IGNOREDB="mysql information_schema innodb"
DIR='/backup/databases/' 		# With trailing slash
USER='backup'
PWD=''
HOST=''

if [[ -z "$PWD" ]] 
then
	DATABASES=`mysql -h "$HOST" -u$USER -e "SHOW DATABASES;" | tail -n+2` 
else
	DATABASES=`mysql -h "$HOST" -u$USER --password=$PWD -e "SHOW DATABASES;" | tail -n+2` 
fi

IGNOREDB=`echo "$IGNOREDB" | tr ' ' '|'`
DATABASES=`echo "$DATABASES" | grep -v -E "^$IGNOREDB$"`

for DB in $DATABASES; do

	DBDIR="$DIR$DB"
	mkdir -p "$DBDIR"

	if [[ -z "$PWD" ]] 
	then
		TABLES=`mysql -h $HOST -u$USER -e "SHOW TABLES FROM $DB;" | tail -n+2`
	else
		TABLES=`mysql -h $HOST -u$USER -p$PWD -e "SHOW TABLES FROM $DB;" | tail -n+2`
	fi

	TBLDATE=`date +%Y-%m-%d`
	DUMPDIR="$DBDIR/last"
	mkdir -p "$DUMPDIR"

	for TBL in $TABLES; do
		
		TBLFILE="$DUMPDIR/$TBL.sql"
		if [[ -z "$PWD" ]] 
		then
			mysqldump -h "$HOST" -u$USER "$DB" "$TBL" > "$TBLFILE"
		else
			mysqldump -h "$HOST" -u$USER -p$PWD "$DB" "$TBL" > "$TBLFILE"
		fi

	done

	RDIFFDIR="$DBDIR/rdiff"
	mkdir -p "$RDIFFDIR"
	rdiff-backup "$DUMPDIR" "$RDIFFDIR"
	rdiff-backup -v0 --force --remove-older-than 2W "$RDIFFDIR"

	INCRDIR="$DBDIR/increments/$TBLDATE"
	mkdir -p "$INCRDIR"
	cp "$DUMPDIR/"* "$INCRDIR"
	gzip -fq "$INCRDIR/"*

done