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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#!/bin/bash # # backup-mysql.sh 1.0.6 # # 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-2023 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 --routines --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:
1 |
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:
1 |
./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:
1 |
sudo ./mysql -u USERNAME -pPASSWORD < FILENAME.sql |
Benötigt man nur eine einzelne MySQL-Datenbank aus der Komplettsicherung, dann hilft der folgende Befehl:
1 |
sudo ./mysql -u root -p --one-database DATABASENAME < FILENAME.sql |
Dann viel Spass damit – und immer schön sichern :-)
Hey Harald,
Das Script wäre super hilfreich.
Leider klemmt es bei mir in Mac OS an access denied.
Hast du da Erfahrung wie ich das «umbiegen» könnte.
Habe schon alles probiert mit chmod o+w für den Ordner.
Und chmod x für das File.
Manuell im Terminal aufgerüfen funkzt das Skript 1A.
Aber über crontab kriege ich es einfach nicht zum laufen.
LG
Martin
Bedenke, daß beim Aufruf per Cron das Shell-Environment ein Anderes ist. Daher muss der Pfad zum Script komplett angegeben werden. Hier meine crontab, ebenfalls macOS:
Sollte es nicht klappen, bitte mal Deine crontab und einen Auszug Log senden:
Hey Harald,
vielen Dank deine Hilfe.
Denke du hast den Knoten (indirekt) platzen lassen.
Hatte das backup-mysql.sh Script ausserhalb des User-Verzeichnisses.
Jetzt habe ich das genau gleiche Script einfach in User/[UserName] verschoben und plötzlich funktz :)
Vielen Dank für deine schnelle und hilfreiche Rückmeldung!
Hast du womöglich ein ebenso geniales Script um das MAMP Sites-Verzeichnis passend zu den MySql-Files zu archivieren?
LG
Martin
Schön daß es nun funktioniert :-)
Pfade ausserhalb der User-Verzeichnisse werden von GateKeeper geblockt.
Für die Sites habe ich leider kein Skript. Die sind jedoch normalerweise im TimeMachine Backup enthalten.
Hast du recht ;)
Aber wäre schon irgendwie alles zusammen zu haben – ohne über TimeMachine. Dann gibt es keine Datenbestandsprobleme, wenn es doch mal ein paar Minuten/Stunden Differenz hätte :)
Vielen Dank und ein schönes Wochenende
Daaanke – Dir ebenfalls!
Vielen Dank für das wirklich gute script! Genau das was ich mir als Datensicherung vorstelle.
Gerne :-)