Ich möchte meine Backups automatisieren. Wie kann ich das einrichten?

Automatisierte Backups sind nicht Teil von Confixx. Mit Hilfe von Cronjobs ist es aber dennoch möglich. Als Zielordner wählen wählen wir das Files-Verzeichnis. Die Backups werden im Confixx-Format angefertigt und können so bei Bedarf bequem über die Confixx-Oberfläche wiederhergestellt werden.

1. Einfaches Backup des Home-Verzeichnis und der Datenbank ohne Rotation
Gehen Sie im Confixx auf Einstellungen->Crontab. Das Backup soll in diesem Fall täglich um 0 Uhr gemacht werden. Takten Sie es nicht kürzer als täglich und richten Sie es auch nicht zu Lastzeiten (8 bis 23 Uhr) ein, da das Backup je nach Größe sehr viel Systemleistung benötigt. Um das Backup nun täglich um 0 Uhr auszuführen, sind folgende Werte einzutragen:

Minute: 0
Stunde: 0
Tag im Monat: *
Monat: *
Wochentag: *

Der erste Cronjob packt dass html-Verzeichnis (dies muss in das Feld Befehl):

rm -f ~/files/html.tar.gz; cd ~/html; tar czf ~/files/html.tar.gz *


Der zweite all unsere Datenbanken. Dieser Befehl ist etwas komplexer, aber bis auf das Passwort (kursiv fett) so zu übernehmen:

rm -f ~/files/mysql.tar.gz; PASSWORD="PASSWORT"; USER=`whoami`; DBS=`mysql -u $USER -p$PASSWORD -B -e "SHOW DATABASES" | grep $USER`; PARAM="-cf"; cd ~/files/; for db in $DBS; do mysqldump -u $USER -p$PASSWORD -B -n --add-drop-table $db > $db; tar $PARAM mysql.tar $db; rm $db; PARAM="-rf"; done; gzip mysql.tar


Wichtig:
Der obige Befehl wird in der SSH-Umgebung aufgrund des Fehlens von mysqldump nicht funktionieren! PASSWORT ersetzen Sie bitte durch Ihr MySQL-Passwort.

2. Backup des Home-Verzeichnis und der Datenbank mit Rotation
Um Backups von verschiedenen Zeiträumen zur Verfügung zu haben, müssen wir, um auch den Speicherverbrauch einzuschränken eine Rotation einführen. Zunächst wollen wir ein tägliches Backup machen. Wir wollen auf die letzten vier Tage zurückgreifen können.
Dazu sind bei den Zeiten wieder die gleiche Zahlen einzutragen (die Uhrzeit können Sie natürlich anpassen).
Der Befehl ändert sich jedoch ein wenig. Es wird zunächst rotiert, und dann gepackt:

Zunächst werden die alten Dateien rotiert. Die Anzahl der Tage die wir zurückgehen können, steuern wir über die for-Schleife. Die fettgedruckte 4 ist dann einfach durch einen höheren bzw. niedrigeren Wert zu ersetzen.

ANZAHL=4; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f html.daily.$c.tar.gz html.daily.$d.tar.gz 2> /dev/null; done; cd ~/html; tar czf ~/files/html.daily.0.tar.gz *


In diesem Falle haben wir dann in html.daily.0.tar.gz unser frischestes Backup in html.daily.3.tar.gz das von vor 4 Tagen.

Ähnlich verfahren wir nun mit den Datenbanken:

  ANZAHL=4; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f mysql.daily.$c.tar.gz mysql.daily.$d.tar.gz 2> /dev/null; done; PASSWORD="PASSWORT"; USER=`whoami`; DBS=`mysql -u $USER -p$PASSWORD -B -e "SHOW DATABASES" | grep $USER`; PARAM="-cf"; cd ~/files/; for db in $DBS; do mysqldump -u $USER -p$PASSWORD -B -n --add-drop-table $db > $db; tar $PARAM mysql.daily.0.tar $db; rm $db; PARAM="-rf"; done; gzip mysql.daily.0.tar  


Um nun zusätzlich auch noch wöchentliche oder monatliche Backups zu erstellen, richten wir weitere Cronjobs ein. Die Zeiten und Befehle für ein wöchentliches Backup mit Rotation über 4 Wochen jeweils am Sonntag sind wie unten anzugeben. Der Cronjob sollte eine Minute vor dem nächsten Backup ausgeführt werden, damit es keine Überschneidungen gibt. Das Backup wird so eigentlich am Sonnabend um 23 Uhr 59 ausgeführt:

Minute: 59
Stunde: 23
Tag im Monat: *
Monat: *
Wochentag: 6

Wir können die Tagesbackups dafür natürlich wiederverwerten und kopieren einfach:

  ANZAHL=4; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f html.weekly.$c.tar.gz html.weekly.$d.tar.gz 2> /dev/null; done;cp -f ~/files/html.daily.0.tar.gz ~/files/html.weekly.0.tar.gz
 


In diesem Falle haben wir dann in html.weekly.0.tar.gz unser frischestes wöchentliches Backup in html.weekly.3.tar.gz das von vor 4 Wochen.
Das gleiche für die Datenbanken:

  ANZAHL=4; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f mysql.weekly.$c.tar.gz mysql.weekly.$d.tar.gz 2> /dev/null; done;cp -f ~/files/mysql.daily.0.tar.gz ~/files/mysql.weekly.0.tar.gz
 


Auch das monatlich Backup ist damit kein Problem mehr. Jeweils zum 1. des Monats. Die Backups werden in diesem Beispiel 6 Monate vorgehalten:

Minute: 59
Stunde: 23
Tag im Monat: 1
Monat: *
Wochentag: *

  ANZAHL=6; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f html.monthly.$c.tar.gz html.monthly.$d.tar.gz 2> /dev/null; done;cp -f ~/files/html.daily.0.tar.gz ~/files/html.monthly.0.tar.gz
 

 

  ANZAHL=6; let COUNT=$ANZAHL-2; for i in `seq 0 $COUNT`; do let c=$COUNT-$i; let d=$COUNT+1-$i; mv -f mysql.monthly.$c.tar.gz mysql.monthly.$d.tar.gz 2> /dev/null; done;cp -f ~/files/mysql.daily.0.tar.gz ~/files/mysql.monthly.0.tar.gz
 


3. Backup des Home-Verzeichnis und der Datenbank mit Rotation in einem Shellscript
Die Befehlsfolgen sind ziemlich komplex und unübersichtlich. Es bietet sich daher an, das ganze in einem Shellscript zu platzieren. Als Cronjob-Befehl ist dann lediglich der Pfad zum Script anzugeben.

Das Script könnte dann in etwa so aussehen:

  #!/bin/bash

ANZAHL_D=4 # Anzahl täglicher Backups (nicht kleiner 2)
ANZAHL_W=4 # Anzahl wöchentlicher Backups (nicht kleiner 2)
ANZAHL_M=4 # Anzahl monatlicher Backups (nicht kleiner 2)

TAG_WOCHE=0 # Am Sonntag werden wöchentliche Backups durchgeführt
TAG_MONAT=1 # Am 1. des Monats werden monatliche Backups durchgeführt

MYSQL_PASSWORD="PASSWORD"

# tägliches Backup
# /html
cd ~/files
let COUNT=$ANZAHL_D-2;
for i in `seq 0 $COUNT`; do
    let c=$COUNT-$i;
    let d=$COUNT+1-$i;
    mv -f html.daily.$c.tar.gz html.daily.$d.tar.gz 2> /dev/null;
done;
cd ~/html; tar czf ~/files/html.daily.0.tar.gz *


# MySQL
cd ~/files
let COUNT=$ANZAHL_D-2;
for i in `seq 0 $COUNT`; do
    let c=$COUNT-$i;
    let d=$COUNT+1-$i;
    mv -f mysql.daily.$c.tar.gz mysql.daily.$d.tar.gz 2> /dev/null;
done;

USER=`whoami`;
DBS=`mysql -u $USER -p$MYSQL_PASSWORD -B -e "SHOW DATABASES" | grep $USER`;
PARAM="-cf";
cd ~/files/;
for db in $DBS; do
    mysqldump -u $USER -p$MYSQL_PASSWORD -B -n
--add-drop-table $db > $db;
    tar $PARAM mysql.daily.0.tar $db;
    rm $db;
    PARAM="-rf";
done;
gzip mysql.daily.0.tar


# wöchentliches Backup
cd ~/files
DAY_WEEK=`date +%u`
if [ $DAY_WEEK -eq $TAG_WOCHE ]; then
    let COUNT=$ANZAHL_W-2;
    for i in `seq 0 $COUNT`; do
        let c=$COUNT-$i;
        let d=$COUNT+1-$i;
        mv -f html.weekly.$c.tar.gz html.weekly.$d.tar.gz 2> /dev/null;
        mv -f mysql.weekly.$c.tar.gz mysql.weekly.$d.tar.gz 2> /dev/null;
    done;
    cp -f ~/files/html.daily.0.tar.gz ~/files/html.weekly.0.tar.gz
    cp -f ~/files/mysql.daily.0.tar.gz ~/files/mysql.weekly.0.tar.gz
fi

# monatliches Backup
cd ~/files
DAY_MONTH=`date +%e`
if [ $DAY_MONTH -eq $TAG_MONAT ]; then
    let COUNT=$ANZAHL_M-2;
    for i in `seq 0 $COUNT`; do
        let c=$COUNT-$i;
        let d=$COUNT+1-$i;
        mv -f html.monthly.$c.tar.gz html.monthly.$d.tar.gz 2> /dev/null;
        mv -f mysql.monthly.$c.tar.gz mysql.monthly.$d.tar.gz 2> /dev/null;
    done;
    cp -f ~/files/html.daily.0.tar.gz ~/files/html.monthly.0.tar.gz
    cp -f ~/files/mysql.daily.0.tar.gz ~/files/mysql.monthly.0.tar.gz
fi

# Ende


Dieses Script fügen Sie bitte in einem Editor Ihrer Wahl ein. Speichern Sie die Datei wenn es geht im Unix-Format unter backup.sh ab, und laden Sie diese per FTP im Binärmodus in den Ordner files hoch. Führen Sie anschliessend ein chmod auf 700 aus. Als Cronjob können Sie nun folgendes angeben:

Minute: 0
Stunde: 0
Tag im Monat: *
Monat: *
Wochentag: *

Befehl:

  ~/files/backup.sh 2> /dev/null > /dev/null


Die Pipes auf /dev/null unterdrücken dabei lediglich die Ausgabe.

Das Skript kann nach Belieben erweitert werden. Bspw. kann ein Upload per FTP auf einen anderen Server eingerichtet werden. Dafür erstellen wir eine Datei .netrc, die eigentlich ins Home-Verzeichnis gehört. Confixx verbietet uns das, und wir müssen kurzzeitig auf den files-Ordner ausweichen.
Folgender Anhang an das Skript organisiert den Upload des täglichen Backups auf einen anderen FTP-Server in das Verzeichnis backup:

  FTP_HOST="serverx.domain.de"
FTP_USER="benutzername"
FTP_PASS="passwort"

echo "machine $FTP_HOST login $FTP_USER password $FTP_PASS" > ~/files/.netrc
chmod 600 ~/files/.netrc
HOME_BAK=$HOME
HOME=~/files
ftp $FTP_HOST <<EOF
cd backup
put html.daily.0.tar.gz html.daily.0.tar.gz
put mysql.daily.0.tar.gz html.daily.0.tar.gz
quit
EOF

rm ~/files/.netrc
HOME=$HOME_BAK


Mit dem Skript lässt sich experimentieren. Achten Sie jedoch auf Ihren Speicherplatz. Dieser sollte genug Platz für das Backup bieten. Kalkulieren Sie also auch Anzahl und Frequenz der Backups.

Zurück

nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter nilges-sytems platzhalter