Die folgende Anleitung habe ich mit einer Linksys NSLU2 und Unslung 6.10 inkl. OpenSSH ausprobiert. Sollte aber auch mit jeder anderen NAS, die mit Linux läuft und SSH-Zugriff von außen erlaubt zulassen.
Das Skript muss mit hoher Wahrscheinlichkeit von Euch noch angepasst werden. Es handelt sich nicht um eine AufDenServerOhneZuDenkenKopierenUndAusführen-Variante. Also Skript genau anschauen und verstehen.
Das Problem
Ich möchte von meinem Webserver jede Nacht ein Backup machen und dieses auf meinen NAS-Server zu Hause kopieren. Gesichert werden sollen die MySQL-Datenbanken und die Verzeichnisse mit den Dateien.
Die Voraussetzungen
- Linux-Webserver mit der Möglichkeit Skripte auszuführen und Cronjobs zu erstellen
- NAS mit Linux auf die man von außen Zugriff per SSH hat
Das Vorgehen im Groben
- Ein Archiv der MySQL-Datenbanken mit tar erzeugen
- Ein Archiv des zu sichernden Verteichnisses mit tar erzeugen
- Archive per SCP übertragen
- Archive auf dem Server löschen
Kopieren per SCP ohne Passwort-Eingabe
Da ich den SCP-Befehl benutze um die Dateien zu übertragen muss ich das Problem lösen diesen ohne Abfrage des Passwortes auszuführen. SCP kennt leider keinen Parameter um das Passwort mit in der Kommandozeile zu übergeben. Dir Syntax für unser Problem ist
scp <dateiname> user@host.de:/ziel/verzeichnnis
Danach wird allerdings nach einem Passwort gefragt, was wir zunächst umgehen müssen.
Dafür gibt es eine prima Anleitung, die ich für diesen Zweck verwendet habe. Einfach Step by Step abarbeiten.
Backup Script auf Server erstellen
Wenn das grundsätzliche Kopieren per SCP vom Server auf die NAS funzt, geht es an das Skript, welches alles automatisch ausführt. Dieses läuft später per Cronjob auf dem Webserver.
In dem Skript gehe ich von der Konfiguration auf meinem Rootserver aus. Das müsst Ihr evtl. für Eure Zwecke anpassen.
- MySQL-Datenbanken liegen in /var/lib/mysql
- Die Daten der einzelnen Domains liegen für neunzehn72.de in /home/n/neunzehn72.de
Es gibt also für jeden Buchstaben ein Subdirectory, in diesem Fall “n” wo dann neunzehn72.de liegt.
Skript Teil 1 - Die Variablen
today=`date +%Y%m%d`
webroot='/home'
dbuser='root'
dbpass='password'
databases=( neunzehn72_blog zweiteMySQLDB dritteMySQLDB )
domains=( neunzehn72.de zweite-domain.de dritte-domain.de )
databases sind die einzelnen Unterverzeichnisse unterhalb vom MySQL-Verzeichnis in denen die jeweiligen Datenbanken liegen.
domains sind auch jeweils die Unterverzeichnisse unterhalb des Webroots, in meinem Fall heißen die genau wie die Domain selbst.
Skript Teil 2 - Datenbanken sichern
for database in ${databases[@]}
do
filename=$today\_$database\_mysql.tar.gz
mysqldump -u $dbuser -p$dbpass --add-drop-table $database > /root/backup/$database.sql
tar zcvf /root/backup/$filename /root/backup/$database.sql >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/save/backup
rm /root/backup/$filename
rm /root/backup/$database.sql
done
In dieser Schleife wird jede Datenbank per mysqldump exportiert und dann als Tar-Archiv im Verzeichnis /root/backup abgelegt. Anschließend dann per SCP auf die NAS geschoben und wieder auf dem Server gelöscht. Im Dateinamen des Archives ist jeweils das Tagesdatum enthalten.
Skript Teil 3 - Webroots sichern
for domain in ${domains[@]}
do
firstletter=${domain:0:1}
filename=$today\_${domain/./_}.tar.gz
tar zcvf /root/backup/$filename /home/$firstletter/$domain >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/sav/backup
rm /root/backup/$filename
done
Der dritte Teil des Skriptes funktioniert ähnlich dem zweiten. Lediglich die Variable “firstletter” wird erstellt, da ich den ersten Buchstaben der Domain für den Pfad benötige.
Das komplette Skript gibt es hier noch einmal zum Download.
Cronjob erstellen
Zuletzt müssen wir noch einen Cronjob erstellen. Ich lasse das Skript jede Nach um 5:00 Uhr laufen. Dazu in der crontab einen Eintrag erzeugen
0 5 * * * /root/backup_remote.sh > /dev/null
und die Crontab installieren. Wie das genau geht findet Ihr notfalls über Google.
Viel Spaß damit. Es bleibt genug Raum für Verbesserungen, z.B.
- für jeden Tag ein Verzeichnis auf dem Backup-NAS erstellen
- Backups nur für einen bestimmten Zeitraum aufbewahren
Das Sichern der MySQL-Dateien direkt ist keine gute Idee, steht auch irgendwo in der Dokumentation, da man sich da auch evtl. vorliegende LOCKs mitsichert und die Datenbank evtl. inkonsistent ist in der Sicherung.
Laut Doku sollte man sich mit mysqldump --opt einen Dump erzeugen und den sichern.
Danke für den Hinweis. Das werde ich auf jeden Fall noch ändern.
gutes tutorial. jedoch stimme ich jens zu. wenn du nur die dateien sicherst kannst du im schlimmesten fall nur datenschrott erhalten. oder daten die nicht mehr in der form vorhanden sind wie sie sollten.
Ich habs schon geändert. Muss nur noch hier den Post aktualisieren. Kommt im Laufe des Tages.
Skript ist jezt aktualisiert und die Sicherung erfolgt per mysqldump.
Danke für die Tipps 😉
Ich würde ein --lock-tables oder --lock-all-tables an das mysqldump anhängen, da ansonsten auch da Inkonsistenzen auftreten können.
Gruß
Rolf