Betreibt man MySQL auf einen Server der Cron-Jobs erlaubt, kann man MySQL-Datenbanken täglich auf einen Schlag sichern. Dabei spielt es keine Rolle ob inzwischen neue Datenbanken erstellt oder welche gelöscht wurden, das Script selbst bleibt unverändert.

MySQL Backup: One Script to rule them all …

Das folgende Bash-Script ermittelt alle aktuell vorhandenen MySQL-Datenbanken, und schreibt im laufenden Datenbankserver-Betrieb komprimierte MySQL-Dumps in einen lokalen Ordner (BACKUP_DIR). Es kann eingestellt werden, wie viele solcher Kopien vorgehalten werden (HOLD_DAYS). Ältere Ordner werden automatisch gelöscht.

Gleich mit erledigt: MySQL Datenbanken prüfen und reparieren

Um die Integrität der zu wahren, werden alle MySQL-Datenbanken vor der Sicherung automatisch geprüft und Fehler ggf. korrigiert.

Idealer Weise sollte das Script täglich als Cron-Job laufen. Die gesicherten Dateien sollten entweder direkt auf eine Freigabe auf einem anderen Server abgelegt oder täglich per FTP oder WGET auf einen anderen Rechner gesichert werden.

Alles verpackt in einem einzigen Script, werden so Prüfen, Reparieren und Sichern aller MySQL-Datenbanken dann ab sofort täglich automatisch erledigt:

#!/bin/bash
#
# backup-mysql.sh 1.0.5
#
# Dumps all databases to seperate files.
# All files are created in a folder named by the current date.
# Folders exceeding the defined hold time are purged automatically.
# 
# (c)2015-2019 Harald Schneider
#

# Setup.start
#

HOLD_DAYS=7 
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/Users/hschneider/Work/_BACKUP/MySQL"

MYSQL_USR="root"
MYSQL_PWD="XXXXXXXXXXX"

# Use this on Linux
#
#MYSQL_CMD=/usr/bin/mysql  
#MYSQL_DMP=/usr/bin/mysqldump  
#MYSQL_CHECK=/usr/bin/mysqlcheck

# Use this for MAMP on macOS:
#
#MYSQL_CMD=/Applications/MAMP/Library/bin/mysql
#MYSQL_DMP=/Applications/MAMP/Library/bin/mysqldump
#MYSQL_CHECK=/Applications/MAMP/Library/bin/mysqlcheck

# Use this for AMPPS on macOS:
#
MYSQL_CMD=/Applications/AMPPS/mysql/bin/mysql
MYSQL_DMP=/Applications/AMPPS/mysql/bin/mysqldump
MYSQL_CHECK=/Applications/AMPPS/mysql/bin/mysqlcheck

#
# Setup.end


# Check and auto-repair all databases first
#
echo
echo "Checking all databases - this can take a while ..."
$MYSQL_CHECK -u $MYSQL_USR --password=$MYSQL_PWD --auto-repair --all-databases

# Backup
#
echo
echo "Starting backup ..."
mkdir -p "$BACKUP_DIR/$TIMESTAMP"
databases=`$MYSQL_CMD --user=$MYSQL_USR -p$MYSQL_PWD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"`
 
for db in $databases; do
  echo "Dumping $db ..."
  $MYSQL_DMP --force --opt --user=$MYSQL_USR -p$MYSQL_PWD --databases "$db" | gzip > "$BACKUP_DIR/$TIMESTAMP/$db.gz"
done

echo
echo "Cleaning up ..."
find $BACKUP_DIR -type d -mtime +$HOLD_DAYS -maxdepth 1 -mindepth 1 -exec rm -rf {} \;
echo "-- DONE!"

Wichtig: Das Zurücklesen einzelner MySQL-Datenbanken erfolgt per Kommandozeile mit mysql, nicht mysqldump:

sudo ./mysql -u root -p < FILENAME.sql

MySQL Backup: One line to rule them all …

Benötigt man keine separaten MySQL Dumps, kann man das Backup aller MySQL-Datenbanken auch elegant mit 1 Zeile erledigen. Ideal, um alle MySQL-Datenbanken schnell auf einen neuen Server umzuziehen. MySQL Dump erzeugt dann eine einzige Datei,  die alle MySQL-Datenbanken beinhaltet:

./mysqldump -u USERNAME -pPASSWORD –-all-databases > FILENAME.sql

Auch hier gilt: Für die Rücksicherung alle MySQL-Datenbanken muss hier anstatt mysqldump ebenfalls das Kommando mysql verwendet werden:

sudo ./mysql -u USERNAME -pPASSWORD < FILENAME.sql 

Benötigt man nur eine einzelne MySQL-Datenbank aus der Komplettsicherung, dann hilft der folgende Befehl:

sudo ./mysql -u root -p --one-database DATABASENAME < FILENAME.sql

Dann viel Spass damit – und immer schön sichern :-)