Um einmal täglich einen MySQL oder MariaDB Dump aller Datenbanken zu erstellen, habe ich dieses Script geschrieben.
Es erstellt und packt einen Dump pro Datenbank und legt diesen im Backup-Verzeichnis ab. Alte Backups werden automatisch gelöscht. (Default: 14 Tage)
Der Aufruf des Scripts kann entweder per Cron oder direkt auf der Konsole erfolgen.
mysqldump.sh
#!/bin/bash
########################################################
#
# MySQL Backup Script
#
########################################################
RETENTION_DAYS="14"
BACKUP_DIR="/var/lib/mysql_backups"
MYSQLDUMP="/usr/bin/mysqldump"
MYSQLSHOW="/usr/bin/mysqlshow"
MYSQL_HOST="localhost"
MYSQL_USER="root"
MYSQL_PW="example"
# Plesk:
# MYSQL_PW=$(cat /etc/psa/.psa.shadow)
# Confixx:
# MYSQL_PW=$(grep mysqlUserPw /root/confixx/confixx_main.conf | cut -d"'" -f2)
# my.cnf:
# MYSQL_PW=$(awk -F "=" '/password/ {gsub(/ /,""); printf "%s", $2}' /root/.my.cnf)
MYSQLDUMP_PARAMETER="--single-transaction --opt --flush-logs --force --master-data --routines --triggers --events"
##########################################################
DATE_FORMAT="+%d.%m.%y"
CURRENT_DIR=$(date "$DATE_FORMAT")
DELETE_DIR=$(date --date="$RETENTION_DAYS days ago" "$DATE_FORMAT")
DBLIST=$("$MYSQLSHOW" --host="$MYSQL_HOST" --user="$MYSQL_USER" --password="$MYSQL_PW" | awk 'NR>=3 && NF>1 {printf "%s ", $2}')
mkdir -p "$BACKUP_DIR"/"$CURRENT_DIR"
for DB in $DBLIST; do
"$MYSQLDUMP" $MYSQLDUMP_PARAMETER --host="$MYSQL_HOST" --user="$MYSQL_USER" --password="$MYSQL_PW" "$DB" \
| gzip > "$BACKUP_DIR"/"$CURRENT_DIR"/"$DB".sql.gz
done
if [ -d "$BACKUP_DIR"/"$DELETE_DIR" ]; then
rm -f "$BACKUP_DIR"/"$DELETE_DIR"/*.sql.gz
rmdir "$BACKUP_DIR"/"$DELETE_DIR"
fi
exit 0