Auf der Suche nach einem Backup Shell Script für meinen Debian Server wurde ich in den weiten des Internets nicht fündig. Zumindest fand ich kein Script das genau das tat was ich wollte. Also machte ich mich selbst ans Werk. Vorweg: Das Script erstellt nicht einfach eine simple Kopie des Festplatteninhalts. Dies verbraucht meiner Meinung nach zu viel Speicherplatz. Sämtliche Debian Binarys müssen nämlich nicht gesichert werden. Denn diese sind von den Servern aus der sources.list abrufbar. Einzig und allein die Binarys unter /usr/local/ werden, neben den Konfigurationsdateien unter /etc/ und den Dateien unter /var/ /home/ und /root/, gesichtert. Natürlich können diese Verzeichnisse geändert werden. Es reicht die Variable TOBACKUP im Konfigurationsteil des Scriptes um die entsprechenden Verzeichnisse zu erweitern oder mit Hilfe der Variable TOEXCLUDE Unterverzeichnisse vom Backup auszuschließen. Die Kernel Version, Distribution, Architektur und der Installationszeitpunkt des Systems werden nochmals seperat in der Datei uname.txt gesichert.
Ebenso erstellt das Script SQL Dumps von allen MySQL Datenbanken des Servers und läd das gesamte Backup, verschlüsselt oder nur komprimiert, optional auch auf einen FTP Space übertragen. Wichtig ist das das Verzeichnis das in OUTDIR eingetragen ist exisitert. Sowohl bei lokalem speichern des Backups als auch beim remote Backup Vorgang auf den FTP Space. Eine Übertragung auf einen FTP Backup Space erfolgt nur, wenn FTP Zugangsdaten hinterlegt sind. Sollte etwas in die Option BACKUPPASS eingetragen sein verschlüsselt das Script die Daten mit GnuPG.
Die Kommentare im Script habe ich in englisch gehalten. Damit sollte eigentlich jeder zurecht kommen und ich muss das Script nicht mehrsprachig kommentiert online stellen. Auf alle Konfigurationsoptionen möchte ich hier im Text nicht weiter eingehen. Die Variablenbezeichnungen sowie die Kommentare sollten alles erklären.
#!/bin/sh ## Author: Tobias Jäck ## License: GPL version 3 ## ## <Configuration> ## ## Backup prefix PREFIX="yourprefix_" ## Dirs which should be backed TOBACKUP="/root/ /home/ /etc/ /var/ /usr/local/" ## Dirs which shouldn't be backed TOEXCLUDE="/yourdirstoexclude/" ## MySQL login data MYSQLUSER="yoursqluser" MYSQLPASS="yoursqlpass" MYSQLHOST="yoursqlhost" ## Dir to save backup OUTDIR="yourdirtosave" ## FTP login form the backup FTP server (optional) FTPHOST="optionalyourftphost" FTPUSER="optionalyourftpuser" FTPPASS="optionalyourftppss" ## Backup password (optional) BACKUPPASS="optionalyourpassword" ## Working dir WORKINGDIR="/tmp/" ## Logfile LOGFILE="/var/log/${PREFIX}backup.log" ## ## </Configuration> ## if [ -n "$OUTDIR" ]; then ## Set prozess priority renice -19 -p $$ 1> /dev/null 2>> $LOGFILE ## Set I/O priority ionice -c2 -n1 -p $$ 1> /dev/null 2>> $LOGFILE ## Date and time DATE=$(date "+%Y-%m-%d-%H-%M-%S") ## Create and enter working dir mkdir ${WORKINGDIR}${PREFIX}${DATE} cd ${WORKINGDIR}${PREFIX}${DATE} ## Save version uname -a > "uname.txt" TOBACKUP="${TOBACKUP} uname.txt" ## Create a list with installed deb pakets dpkg --get-selections > "deb.list" TOBACKUP="${TOBACKUP} deb.list" ## Create MySQL dump environment mkdir mysqldumps/ TOBACKUP="${TOBACKUP} mysqldumps/" ## Create MySQL dumps from all databases DBS="$(mysql -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS -Bse 'show databases' 2>> $LOGFILE)" if [ $? -ne 0 ]; then ## Delete temporary files rm -r ${WORKINGDIR}${PREFIX}${DATE} exit 1 fi for DB in $DBS; do mysqldump -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS $DB > "mysqldumps/${DB}.sql" done ## Exclude dirs if [ -n "$TOEXCLUDE" ]; then TOEXCLUDE="--exclude ${TOEXCLUDE}" fi ## Compress and / or encrypt files if [ -n "$BACKUPPASS" ]; then VAR_EXTENSION=".tar.bz2.gpg" tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | gpg --symmetric --bzip2-compress-level 9 --passphrase ${BACKUPPASS} > "${PREFIX}${DATE}${VAR_EXTENSION}" else VAR_EXTENSION=".tar.bz2" tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | bzip2 -c --best > "${PREFIX}${DATE}${VAR_EXTENSION}" fi if [ -n "$FTPHOST" ] && [ -n "$FTPUSER" ] && [ -n "$FTPPASS" ]; then ## Save backup on FTP server ncftpput -u $FTPUSER -p $FTPPASS $FTPHOST $OUTDIR "${PREFIX}${DATE}${VAR_EXTENSION}" 2>> $LOGFILE else ## Save backup lokal cp "${PREFIX}${DATE}${VAR_EXTENSION}" "$OUTDIR" 2>> $LOGFILE fi ## Delete temporary files rm -r ${WORKINGDIR}${PREFIX}${DATE} if [ $? -ne 0 ]; then exit 1 else exit 0 fi else echo "Error: Output dir is empty" >> $LOGFILE exit 1 fi
Der Name des komprimierten Backups setzt sich wie folgt zusammen: %Präfix%%Jahr%-%Monat%-%Tag%-%Stunde%-%Minute%-%Sekunde%.tar.bz2. Die Log Datei des Scripts findest du unter /var/log/%Präfix%backup.log. Enthalten sind dort Statistiken und Fehler zur FTP Übertragung sowie kritische Konfigurationsfehler.
Im Script werden Prozess und I/O Priorität angepasst um den Server nicht an seiner regulären Arbeit zu hindern. Beachte dabei das ein Ausführen von nice nur mit root Rechten möglich ist.
Mögliche Probleme mit Paketabhängigkeiten sollten sich nach dem erfolgreichen ausführen dieses Befehls erledigt haben:
sudo apt-get install ncftp bzip2 gnupg
Sowohl date als auch tar, nice, ionice dpkg und mysql / mysqldump sind normalerweise auf dem Server vorhanden.
Bei Fragen oder Problemen scheue nicht die Kommentarfunktion zu verwenden.


15 März 2010 um 23:21 Uhr
Hi,vielen Dank für deinen Kommentar und den Link hierher.Du hast einen wirklich informativen Blog, der unter anderem genau meine Interessen abdeckt.Werd dich mal bookmarken.Gruß Flo
18 März 2010 um 15:00 Uhr
In dem beschriebenen Tutorial auf meiner Seite wird jedoch das Ganze on-the-Fly auf den FTP-Server “gepiped”http://www.marco-rust.de/mysql-backup-on-the-fly/608/Gruß Marco
18 März 2010 um 18:26 Uhr
Vielen dank für deinen Kommentar Marco. Das ist eine elegante Lösung. Du schreibst, das die Daten direkt auf den FTP Server gepipped werden. Weißt du wie das Script / System von dir reagiert, wenn die FTP Verbindung nicht die Geschwindigkeit bereitstellt in der die Dumps erstellt / gepackt werden?
20 Juni 2010 um 00:37 Uhr
im schlimmsten Fall wahrscheinlich würde es wohl kein Update machen bzw keine angabe über etwaige fehler… ABER gleichzeitig frage ich imselben Skript per FTp Dateidatum und Size der letzten 30 Tage ab. Ergo man mit bissl magic (grep) viel mehr info rausholen, mails verschicken usw – es sollte auch kein perfekte Lösung sein, sondern ein ansatz für eine Lösung “ohne zwischenspeichern”.letztlich sind bisher alle dumps sauber angekommen…gruß Marco
21 Oktober 2010 um 23:23 Uhr
Hallo zusammen,ich bin linux einsteiger und finde dieses Skript hier wirklich gelungen.Doch wie spiele ich das backup von einem FTP server wieder zurück?einfach downloaden ( in welchen ordner) und einfach entpacken?grüße ,highliner
1 November 2010 um 07:42 Uhr
Ein kleiner Fehler im Script:
DATE=$(date “+٪Y-٪m-٪d-٪H-٪M-٪S”)
muss wie folgt aussehen:
DATE=$(date +%Y-%m-%d-%H%M%S)
Ansonsten gibt er bei mir das Datum+Zeit im Dateinamen nicht an.
5 November 2010 um 18:03 Uhr
@highliner
Es reicht das Archiv zu entschlüsseln und zu entpacken, die Dateien gemäß der Verzeichnisstruktur zu kopieren, die Paketliste über den gewünschten Paketmanager zu installieren und die SQL Dumps einzuspielen. Sobald ich Zeit finde werde ich ein Script zum zurückspielen des Backups online stellen. Ich habe das bisher immer händisch erledigt. Über das Kontaktformular kannst du es bei mir in Auftrag geben. Die Kosten dafür werden sich in Grenzen halten.
@Ingo
Das Script läuft mit der Zeile ‘DATE=$(date “+٪Y-٪m-٪d-٪H-٪M-٪S”)’ auf meinem Server. Interessieren würde mich aus welchem Grund das Datum bei dir nicht generiert wird.
14 November 2010 um 18:50 Uhr
@Loaden
danke Dir.
zum Datum:
schau mal ins skript bei Dir.Durch copy and paste werden komischerweise die % durch Punkte ersetzt.
so war es zumindest bei mir
21 November 2010 um 19:47 Uhr
Stimmt, hab ich nun auch so festgestellt. Die Prozentzeichen müssen im Code abgeändert werden, da diese sonst in Punkte umgewandelt werden:
Von: ٪
Zu: %
22 November 2010 um 23:04 Uhr
Vielen Dank. Hab die Zeichen angepasst. Der Editor im Backend hat sich da wohl nen Spaß draus gemacht.
29 Januar 2011 um 18:09 Uhr
Hi zusammen,
also eine kleine anleitung wie man das backup wieder zurückspielt währe für linux neulinge wie mich sehr sehr wünschenswert.
per google konnte ich leider nichts finden.
würde mich sehr freuen.
liebe grüße
highliner
16 Februar 2011 um 04:15 Uhr
Um ein Script zum Zurückspielen des Backups zu schreiben fehlt mir leider die Zeit bzw. das Geld. Da das Script für mich keinen Vorteil einbringt. Wie bereits erwähnt kannst du die Erstellung eines Scriptes zum automatisierten zurückspielen der Backups bei mir in Aufrag geben. Das ist ein sehr gutes Beispiel wie mit Open Source Geld verdient wird.
21 Juni 2011 um 20:39 Uhr
Hi,
hat jemand von euch auch probleme mit dem autobackup?
mysqldump: Got error: 1044: Access denied for user ‘root’@'localhost’ to database ‘information_schema’ when using LOCK TABLES
erscheint beim versuch des skript auszuführen
System debian 6
6 Juli 2011 um 12:25 Uhr
Hey,
dabei könnte es sich um diesen Bug in MySQL handeln. http://bit.ly/oEqlfi