Server-Backup Script

Mrz 31

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.

00 3 * * * root /root/bin/backup.sh

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.

Bisher 25 Kommentare

Avatar des Kommentators Frank Maute 16 Aug 07

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=

date +"%Y%m%d"

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

Avatar des Kommentators Christian Beier 16 Aug 07

Hallo Frank,
wie schreibst du denn den Eintrag in die Log?

Avatar des Kommentators Frank Maute 17 Aug 07

Hallo Christian,

bei mir sieht das im Crontab so aus:

08 19 * * * root /home/backupscript/backup.sh > /home/backupscript/logs/backup.log

Gruss
Frank

Avatar des Kommentators Frank Maute 17 Aug 07

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

Avatar des Kommentators Freexer 26 Aug 07

wie wäre es mit chmod 777 backup.sh

Avatar des Kommentators Pommes 27 Okt 07

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

Avatar des Kommentators Mirco 17 Dez 07

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?

Avatar des Kommentators chris 29 Feb 08

Hallo,

wie kann man denn das DB Backup wieder einspielen bzw. die mysql.dbs wiederherstellen?

danke

MySQL-Datenbanken wiederherstellen » Blog » BEIER-CHRISTIAN.eu | Christian Beier // design+foto 01 Mrz 08

[...] 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. [...]

Avatar des Kommentators Heiko 26 Mai 08

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=

date +"%Y%m%d"

Kannst du mir vielleicht sagen was falsch ist. :(

Gruß Heiko

Avatar des Kommentators Christian Beier 01 Jun 08

@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?

Avatar des Kommentators Heiko 02 Jun 08

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)

Avatar des Kommentators Christian Beier 02 Jun 08

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.

Avatar des Kommentators Marco 14 Aug 08

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

Avatar des Kommentators Christian Beier 18 Aug 08

@Marco:
Überprüfe bitte die Rechte der Datei (ob diese auch ausgeführt werden darf). Ansonsten versuche einmal den Aufruf mit:

$ cd backupsoftware
$ ./backup.sh

Avatar des Kommentators Pascal 24 Aug 08

Hallo Christian

Ich wollte mal nachfragen, ob es eine Möglichkeit gibt, dass das Backup immer überschrieben wird auf dem FTP Speicherplatz.

MfG
Pascal

Avatar des Kommentators Christian Beier 24 Aug 08

@Pascal: Ja, klar gibt es die. Am einfachsten ist es, wenn du den Abschnitt »Alle Dateien mit tar.bzw2 komprimieren« mit folgendem Code ersetzt:

# Alle Dateien mit tar.bz2 komprimieren
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.

Avatar des Kommentators Pascal 26 Aug 08

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?

Avatar des Kommentators Christian Beier 27 Aug 08

Du kannst sämtliche Ausgaben des Terminals (die sonst auf dem Bildschirm ausgegeben werden) in eine Datei umleiten:

$ ./backup.sh &> meine_log.txt

Das Script an sich gibt allerdings keine Meldungen aus.

Ideen für Server-Backup Script gesucht » Blog » BEIER-CHRISTIAN.eu | Christian Beier // design+foto 29 Aug 08

[...] die aktuelle Version meines Server-Backup Script’s gab es einige Resonanz und auch recht viele Downloads. Dadurch gestärkt, plane ich gerade die [...]

Avatar des Kommentators redi78 21 Sep 08

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?

Avatar des Kommentators DJNightfly 16 Okt 08

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

Avatar des Kommentators Robert 10 Dez 08

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 :)

Avatar des Kommentators pireli 03 Jan 09

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

Avatar des Kommentators Patrick 26 Feb 09

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

Schreibe einen Kommentar

* Pflichtfeld

Die E-Mail-Adresse wird nicht veröffentlicht.

Der Autor

Bild des Autors Christian Beier

Ich bin Christian Beier, 23, ausgebildeter Mediengestalter, Usability-Experte und Ruby on Rails Entwickler aus Potsdam/Berlin.
Mehr zur Person …

In diesem Weblog schreibe ich über Webdesign, Webdevelopment, Social Media, Usability und auch etwas über die Fotografie.

Tags

Aktuelle Beiträge

Aktuelle Kommentare

Twitternachrichten