Holger Janßen-Kroll

Beratung · Entwicklung · Internet

MySQL-Backup: Erweiterung

Einleitung

Aufgabe ist es, ein kleines Skript zu schreiben, dass täglich alle vorhandenen MySQL-Tabellen ein einzelne Dateien sichert und pro Tag ein Verzeichnis für diese Dateien anlegt.

Es sollen immer die letzten 14 Tage vorhanden sein.

Zusätzlich soll pro Woche ein Backup dauerhaft aufbewahrt werden.

Das Skript

#! /bin/sh

BASE=/var/backups/mysql_tables
DAILY=${BASE}/daily/
WEEKLY=${BASE}/weekly/

# create daily directory
TODAY=$(date +%Y-%m-%d)
if [ ! -d ${DAILY}${TODAY} ]; then
        mkdir ${DAILY}${TODAY}
fi;

for db in $(mysql -u [dbuser] -p[dbpwd] -e "show databases" | tail -n +2); do
        mysqldump --add-drop-table -u [dbuser] -p[dbpwd] $db | gzip > ${DAILY}${TODAY}/$db.sql.gz
done;

# create weekly directory
THISWEEK=$(date +%Y-%W)
if [ ! -d ${WEEKLY}${THISWEEK} ]; then
        mkdir ${WEEKLY}${THISWEEK}
fi;

# hardlink dailiy backup files to current week
for file in $(ls ${DAILY}${TODAY}/*.gz); do
        ln -f ${file}  ${WEEKLY}${THISWEEK}/$(basename ${file})
done;


# only leave last 14 entries in the daily backup
ls ${DAILY} | head -n-14 | xargs rm -rf

Erläuterungen

  • Zeile 3-5: Einfache Festlegung der Zielverzeichnisse
  • Zeile 8: Ermitteln des aktuellen Datums im Format YYYY-MM-DD für den Verzeichnisnamen des aktuellen Backups
  • Zeile 9-11: Erstellen des Verzeichnisses sofern es nicht existiert
  • Zeile 13-15: Erstellen der eigentlichen Backup-Dateien
    • Also Datenbank-Benutzer und für das DB-Passwort wurden hier die Platzhalter [dbuser] und [dbpwd] verwendet.
    • Das tail -n+2 filtert die Spaltenüberschrift databases aus der Datenbankliste heraus.
  • Zeile 18: Ermitteln der aktuellen Kalenderwoche im Format YYYY-WW
  • Zeile 19-21: Erstellen des Wochen-Verzeichnisses, sofern es nicht existiert
  • Zeile 24-26: (Hartes) Verlinken des aktuellen Backups im Wochenverzeichnis
    • Der Schalter -f bewirkt ein Überschreiben von evtl. vorhandenen Dateien vom Vortag
    • Es werden Hardlinks verwendet, damit die Tagesbackups nach zwei Wochen ohne Probleme gelöscht werden können.
  • Zeile 30: Entfernen von Tages-Backups, die älter als 14 Tage sind
    • head -n-14
      Gibt alle bis auf die letzten 14 Zeilen der Eingabe aus. Diese 14 Zeilen enthalten bei alphabetischer Sortierung die Backupverzeichnisse der letzten 14 Tage. Diese sollen also nicht gelöscht werden.
    • Besonders diese Zeile ist mit Vorsicht zu genießen, z.B. falls das Backup-Verzeichnis noch andere Einträge als die MySQL-Tages-Backup enthalten sollte

Dieses Skript kann nun an beliebiger Stelle von einem Cron-Job ausgeführt werden. Es ist nur darauf zu achten, dass der Ausführende User die entsprechenden Schreibrechte im Backup-Verzeichnis besitzt.

Zurück


Einen Kommentar schreiben

Was ist die Summe aus 3 und 6?