Server-Backup Script
Achtung: Dieser Beitrag ist schon etwas älter.
Es kann sein, dass sein Inhalt nicht mehr aktuell ist, Links veraltet sind oder dass auch niemand mehr auf neue Kommentare antwortet.
Backups sind ja so eine Angelegenheit für sich. Einerseits weiss jeder das diese unerlässlich sind, andererseits wird dies meistens aus Bequemlichkeit gerne vernachlässigt. Bei dem Betrieb einer Servers ist der Punkt Datensicherheit noch um einiges wichtiger. Um die Hauptgefahr Bequemlichkeit gleich grundsätzlich auszuschließen, sollte man eine Backup-Routine automatisch anstoßen lassen. Dabei helfen kann das folgende Bash-Script. Dieses wird bei mir beispielsweise über einen Cronjob täglich gestartet und übernimmt das komplette Backup. Beim meinem Root-Server, welcher im Rechenzentrum von Strato steht, wird es mir besonders leicht gemacht: Strato bietet automatisch für jeden Server einen Backup-Server an, der die gleiche Größe hat wie die im Server eingebaute Festplatte – bei mir sind das 80 GByte. Zugegriffen wird auf diesen mittels FTP.
Das Script
Mein Script kopiert die zu sichernden Dateien in einen Backup-Ordner, welcher anschließend mit tar.bz2 komprimiert wird. Auch die MySQL-Datenbanken werden automatisch gesichert. Anschließend werden die komprimierten Dateien per FTP auf den Backup-Server geladen und das angelegte Backup-Verzeichnis auf dem Server wieder gelöscht. Um das Backup durchzuführen, muss natürlich auf dem Server noch genügend Speicherplatz vorhanden sein, um die zu sichernden Dateien in den Backup-Ordner zu kopieren.
Das Script funktioniert natürlich nicht nur mit einem Strato-Server. Gegebenenfalls müssen einige Angaben an die persönlichen Bedürfnisse angepasst werden.
Verbesserungsvorschläge, Ideen für neue Funktionen oder einfach nur Kritik kann gerne im Kommentar-Bereich hinterlassen werden oder einfach per E-Mail an office@beier-christian.eu.
Download
Systemvoraussetzungen: Linux (Getestet unter SuSE Linux 9.0 Pro)
Download: Download bei github
Ab sofort wird die Entwicklung (so wie es meine Zeit zulässt) unter dem Dach von Github fortgeführt. Alle neueren Downloads stehen dann dort zum Download bereit. Dort können auch in Zukunft Fehler und Wünsche gemeldet werden. http://github.com/cbeier/Server-Backup-Script/
Cronjob
Damit das Script automatisch ausgeführt wird, muss noch ein Cronjob eingerichtet werden. Dazu auf dem Server mit einem beliebigen Editor die Datei /etc/crontab öffnen und die folgende Zeile am Ende einfügen. Anschließend die Datei speichern.
Dadurch wird das Backup-Script jeden Morgen um 3.00 Uhr ausgeführt.
Changelog
- v1.1 – Bei der Sicherung bleiben nun die Dateirechte erhalten. (31.03.2007)
- v1.1.1 – Fehlerkorrektur: Beim FTP-Zugriff wird nun der eingestellte Server verwendet. (29.05.2007)
- v1.1.2 – Fehlerkorrektur: Fehler bei der Datenübertragung unter Debian behoben. (21.05.2009)
Abonniere den RSS-Feed für weitere Webdesign Tutorials und Artikel.
Artikel bei del.icio.us speichern, Kommentar-Feed, Trackback-URL
Bisher 25 Kommentare
Hallo,
danke für das Skript. Ich habe es ein bissl abgeändert:
!/bin/bash # Titel: Backup-Script
Description: Sicherung von /srv, /etc, /var/log und MYSQL-Datenbanken anlegen und automatisch auf einen festgelegten FTP-Server hochladen.
Copyright: Christian Beier (http://www.beier-christian.eu/)
Version 1.1
Allgemeine Angaben
MYSQL_USER=root
MYSQL_PASS=xxx
FTP_SERVER=backup.serverkompetenz.de
FTP_USER=b02xxx
FTP_PASS=xxx
Festlegung des Datums – Format: 20050710
DATE=
Das Script
Backup-Verzeichnis anlegen
mkdir /backup
mkdir /backup/mysql
Verzeichnisse die ins Backup integriert werden sollen
rsync -az –delete –delete-after /srv /backup
rsync -az –delete –delete-after /etc /backup
rsync -az –delete –delete-after /var/ /backup
rsync -az –delete –delete-after /bin/ /backup
rsync -az –delete –delete-after /boot/ /backup
rsync -az –delete –delete-after /home/ /backup
rsync -az –delete –delete-after /usr/ /backup
cd /backup/mysql
Sicherung der Datenbanken
mysqldump -AaCceQ -u$MYSQL_USER -p$MYSQL_PASS -r mysql.dbs
cd ../
Alle Dateien mit tar.bz2 komprimieren
tar cjfp files-$DATE.tar.bz2 srv
tar cjfp etc-$DATE.tar.bz2 etc
tar cjfp logs-$DATE.tar.bz2 log
tar cjfp logs-$DATE.tar.bz2 var
tar cjfp logs-$DATE.tar.bz2 home
tar cjfp logs-$DATE.tar.bz2 usr
tar cjfp mysql-$DATE.tar.bz2 mysql
Alle komprimierten Dateien per FTP auf den Backup-Server laden
ftp -u ftp://$FTP_USER:$FTP_PASS@$FTP_SERVER $DATE
Anschließend alle auf den Server angelegten Dateien wieder löschen
rm -r -f /backup
Auch habe ich den cronjob geändert, dass ich ein log geschrieben bekomme. Aber leider ist das logfile immer leer. Was mache ich falsch?
Gruss
Frank
Hallo Christian,
bei mir sieht das im Crontab so aus:
08 19 * * * root /home/backupscript/backup.sh > /home/backupscript/logs/backup.log
Gruss
Frank
Ergänzung zu meiner Nachricht von eben:
0 root@hxxxxx:/home/backupscript/ # ./backup.sh
-su: ./backup.sh: Keine Berechtigung
Ich denke daran liegt es, aber leider weiss ich nicht, wie ich das abstellen kann…
Gruss
Frank
wie wäre es mit chmod 777 backup.sh
Hi,
funktioniert soweit prima, nur das ich es nicht auf den Backupspace bekomme.
Hättest Du mir bitte einen Tip ?
In der Log steht: Unknown host “etc_dirs.Sat.tar.bz2″.
Kann ich mit “skip” auch einen Ordner im Verzeichnis ausschließen ?
Wenn ja wo baue ich das am dümmsten ein ?
Gruß
Pommes
Hi,
genau das hab ich schon lange gesucht. Einfach genial das Teilchen. Aber gibt es auch die Möglichkeit das Script so einzustellen das es ein bereits vorhandenes Backup überschreibt?
Hallo,
wie kann man denn das DB Backup wieder einspielen bzw. die mysql.dbs wiederherstellen?
danke
[...] Mit Hilfe des Server-Backup Script lassen sich alle MySQL-Datenbanken auf einem Server mit einmal sichern. Dabei werden alle Datenbanken in einer einzelnen *.dbs-Datei gesichert. In diesem Beitrag möchte ich nun zeigen, wie man aus der Sicherung die Datenbanken wiederherstellen kann. [...]
Ich bin ein Neuling in Sachen Linux und root Server.
Nun habe ich mir aber auch bei Strato einen Root Server gemietet und wollte nun dein Backup Script einbauen, habe auch die passenden Daten angepasst, denke ich jedenfalls. Danke erstmal für das Script.
Ich möchte nun das Script erstmal manuell Ausführen und dann kommt folgende Meldung:
der entfernte Rechner antwortet seit 15 Sekunden nicht.
Ich benutze WinSCP.
Ein Teil vom Script, so habe ich es angepasst:
Allgemeine Angaben
MYSQL_USER=root
MYSQL_PASS=**********
FTP_SERVER=backup.serverkompetenz.de
FTP_USER=**********
FTP_PASS=**********
Festlegung des Datums – Format: 20050710
DATE=
Kannst du mir vielleicht sagen was falsch ist. :(
Gruß Heiko
@Heiko: Je nachdem wie viele Daten du sichern möchtest, kann gerade die Komprimierung der Daten einige Zeit dauern. Wird denn trotz der Meldung das Skript noch ausgeführt?
Hallo und vielen Dank für deine Antwort.
Ich habe den Cronjob an dem Tag eingestellt wo ich auch meinen ersten Beitrag geschrieben habe. Denke also das er jede Nacht Startet aber bei Strato steht:
Genutzter Space: 4.00 kByte (0.00 Prozent)
Starte das Skript einmal von Hand und schaue was passiert. Schaue u.a. in das temporär angelegte Verzeichnis, ob die Dateien korrekt gepackt wurden etc.
Du kannst auch schauen, ob entsprechende Prozesse (z.B. tar) bei dem Vorgang ausgeführt werden. Ansonsten sollten auch Log-Dateien Aufschluss über das Verhalten geben.
Grundsätzlich sollte man Skripts immer erst per Hand ausprobieren, bevor man sie per Cronjob automatisch ausführen lässt.
bei mir kommt, wenn ich das script ausführe, ständig
“cannot execute binary file”
Terminalnachricht:
root@xxxxx:/# /backupsoftware/backup.sh
-bash: /backupsoftware/backup.sh: cannot execute binary file
@Marco:
Überprüfe bitte die Rechte der Datei (ob diese auch ausgeführt werden darf). Ansonsten versuche einmal den Aufruf mit:
$ ./backup.sh
Hallo Christian
Ich wollte mal nachfragen, ob es eine Möglichkeit gibt, dass das Backup immer überschrieben wird auf dem FTP Speicherplatz.
MfG
Pascal
@Pascal: Ja, klar gibt es die. Am einfachsten ist es, wenn du den Abschnitt »Alle Dateien mit tar.bzw2 komprimieren« mit folgendem Code ersetzt:
tar cjfp files.tar.bz2 srv
tar cjfp etc.tar.bz2 etc
tar cjfp logs.tar.bz2 log
tar cjfp mysql.tar.bz2 mysql
Dann wird das Datum bei dem Dateinamen nicht mehr berücksichtigt und die alten Daten bei jedem Durchlauf überschrieben.
Hallo Christian
Danke für die Info. Hätte man eigendlich auch selber drauf kommen sollen. Aber das es automatisch überschrieben wird wusste ich nicht…
Habe jetzt aber noch eine Frage. Da ich mich mit Bash Scripts nicht auskenne und per Google nichts finde. Ist es möglich das jedes mal die Ausgabe die man normalerweise sehen würde wenn man es per Hand ausfühert in eine Log Datei speichert?
Du kannst sämtliche Ausgaben des Terminals (die sonst auf dem Bildschirm ausgegeben werden) in eine Datei umleiten:
Das Script an sich gibt allerdings keine Meldungen aus.
[...] die aktuelle Version meines Server-Backup Script’s gab es einige Resonanz und auch recht viele Downloads. Dadurch gestärkt, plane ich gerade die [...]
Hallo Leute,
Habe folgendes Problem: Wenn ich das Script manuell starte funktionierts wunderbar.
Nur leider wir der Cronjob (10 11 * * * root /root/scripts/backup_log.sh) nicht ausgeführt. Ich habe keine Ahnung warum.
Kann mit bitte jemand weiterhelfen?
Hi :o)
Kann man das script auch für ein Backup des Kompletten FS nutzen? Also ohne jedes Verzeichnis einzeln anzugeben…
Grüße aus Unterfranken
Night
Schönes Script nur leider ist der FTP teil falsch
Alle komprimierten Dateien per FTP auf den Backup-Server laden
ftp -n $FTP_SERVER <<END_SCRIPT
quote USER $FTP_USER
quote PASS $FTP_PASS
put $DATE
quit
END_SCRIPT
funktioniert schon eher :)
Hallo,
bei dem wo ftp -u eine Fehlermeldung ausgibt u ist unbekannt kann auch das hier verwenden:
ftp -ni <<EOFTP
open FTP-SERVER
user FTP-ACCOUNT FTP-PASSWORD
bin
mput $DATE
quit
EOFTP
Gruß
Pireli
Mich interessiert es ebenfalls wie ich quasi wöchentlich den kompletten server sichern kann und beim überspielen das alte backup überschrieben wird
mfg aus Düben-DownTown
