Frage zu Backuplösung

Domi

Member
Hallo Leute, ich bin mal wieder da und habe eine Frage die bestimmt leicht anfängt und sehr komplex für mich endet :o

Ich fange mal an... Ich habe einen v-Server, und ein selbst gebasteltes Skript was ich momentan manuell starte und mir meine Daten sichert. Der eine oder andere wird vielleicht denken "wozu die Mühe, geht doch viel einfacher..." oder warum ich diverse Dinge mit sichere. Aber ich fange mal mit meinem kleinen Bauwerk an.
Code:
# !/bin/sh
# Skript zum sichern von Daten
BACKUP="/srv/backup"
DATEDIR=`date +%Y-%m-%d_%H%M`

VHOSTS="/srv/vhost"
VMAILS="/srv/vmail"
LOGS="/var/log"

APACHE="/etc/apache2"
DOVECOT="/etc/dovecot"
MySQL="/etc/mysql"
POSTFIX="/etc/postfix"

# SQL Daten für Sicherung
DB_USER="debian-sys-maint"
DB_PASS="xxxx"

# Backup Verzeichnis erstellen
mkdir $BACKUP/$DATEDIR

# Sicherung, Apache-Verzeichnis
cd $APACHE
tar cfz $BACKUP/$DATEDIR/apache.tar.gz *

# Sicherung, Dovecot-Verzeichnis
#cd $DOVECOT
#tar cfz $BACKUP/$DATEDIR/dovecot.tar.gz *

# Sicherung, MySQL-Verzeichnis
cd $MySQL
tar cfz $BACKUP/$DATEDIR/mysql.tar.gz *

# Sicherung, Postfix-Verzeichnis
#cd $POSTFIX
#tar cfz $BACKUP/$DATEDIR/postfix.tar.gz *

# htdocs, emails, logs und SQL sichern
cd $VHOSTS
tar cfz $BACKUP/$DATEDIR/vhosts.tar.gz * -X ~/exclude-vhost.lst

#cd $EMAILS
#tar cfz $BACKUP/$DATEDIR/emails.tar.gz *

cd $LOGS
tar cfz $BACKUP/$DATEDIR/logs.tar.gz * -X ~/exclude-logs.lst

mysqldump -u $DB_USER -p$DB_PASS --all-databases > $BACKUP/$DATEDIR/sql-backup.sql

# SQL Dump packen und .sql löschen
cd $BACKUP/$DATEDIR/
tar cvfz sql-backup.tar.gz sql-backup.sql
rm sql-backup.sql
Das eine oder andere habe ich bewusst aus-kommentiert, da ich es auf dem Server wo die Datei gerade liegt, nicht benötige. Es führen natürlich viele Wege nach Rom um seine Daten zu sichern, dieses ist meiner den ich mir selbst gelegt habe :)

Da ich das natürlich immer manuell starte, habe ich mir überlegt ob ich mir ein cron-job erstelle in "/etc/cron.d" das wie folgt aussehen würde...
Code:
# /etc/cron.d/backup: crontab fragment for backup
#  Cron fuer selbst erstelltes Backup-Script

# Backup-Script, taeglich um 1:00
0  1  *  *  1  root  /root/backup.sh
Ob das so funktioniert, kann ich noch nicht sagen da ich diesen Eintrag erst heute erstellt habe. Jetzt ist meine Frage, ob es Debian basierte Programme für Datensicherung gibt, die man vielleicht jemandem ans Herz legen kann.

Im Prinzip möchte ich die Daten sichern die ich jetzt auch sichere. Eine normale Archivierung mit TAR reicht mir auch aus, was mir aber noch fehlt ist eine kleine Erweiterung für meine Sicherung... Es soll (wenn cron funktioniert) Montags um 1:00 gesichert werden, und wenn möglich am Montag um 4:00 soll der Ordner (oder das Paket) auf einen anderen FTP verschoben werden.

Mein Harken ist eigentlich der Versandt des Backups via FTP. Mein Plan ist auch, dass ich 4 Backups pro Monat mache (jede Woche) und die letzten 8 Pakete aufhebe. Somit hätte ich eine Spanne von 2 Monaten auf die ich zurück greifen könnte.

Also ist die Frage, wie mein Skript aussehen müsste, um die Daten der letzten X Tage aufzuheben?! Oder ob es da eine ganz andere Lösung gibt durch irgend ein Programm...

Joa.. Mehr habe ich erst einmal nicht.
Mfg. Anubis
 
Ich verwende tartarus, das gibt es auch direkt fertig als Debian Paket und ist recht einfach zu konfigurieren. Dabei handelt es sich letztendlich um eine Script-Sammlung, die auch so Sachen mitbringt, wie ältere Backups nach einer gewissen Zeit zu löschen, die Dinger per FTP irgendwo hin zu schieben, auf Wunsch sogar zu verschlüsseln etc.
Über Hooks läßt sich das ganze individualisieren. Ich nutze beispielsweise einen Hook, um meinen MySQL zu dumpen, lasse tartarus den Dump sichern und löschen ihn anschließend wieder.
 
Ahh... Das finde ich ja schon mal genial, mit der Anleitung von Hetzner und der Dokumentation hab ich mir schon mal eine kleine Variante von tartarus gebaut.

Im Moment wird ein lokales Backup gemacht, zum testen... Was bei mir nur noch nicht so funktionieren will, sind die "exclude" Ordner. Wenn ich nur einen Ordner angebe, funktioniert es.. bei mehreren Ordnern schlägt es fehl :( Obwohl ich noch davon ausgehe, dass die Pfadangabe noch angepasst werden muss...

test.conf
# Ausschlussverzeichnisse
EXCLUDE="/backup/" "/logs/
und anschließend folgt dann diese Meldung,
Code:
root@srv02 ~ # /usr/sbin/tartarus /etc/tartarus/test.conf
/etc/tartarus/test.conf: line 13: */logs/: No such file or directory
Checking for updates...
done
syncing...
Beginning backup run...
Storing backup to /srv/backup/tartarus-root-20120124-1159.tar.bz2...
sichern soll er mir in meiner Test Datei "/srv/vhost/", was nur funktioniert wenn ich logs wieder raus nehme. Was mich dann noch interessiert, ist es beabsichtigt das er in dem gesamten Archiv den Pfad komplett mit nimmt? :confused:

Ich habe ihm ja gesagt er braucht nur den Inhalt von "/srv/vhosts/" sichern, oder hab ich da etwas falsch gemacht?

Mfg. Anubis
 
Ich nutze den Exclude zwar nicht, aber probier mal
Code:
EXCLUDE="/backup /logs"
Letztendlich sind ja die Config-Dateien auch nur Shell-Scripte.
Und das der Pfad komplett im Archiv zu finden ist, ist eine Sache von tar, da müßtest du mal in die man-Page von tar schauen, mit welcher Option sich das abschalten läßt. Unabhängig davon wird aber nur das Unterverzeichnis gesichert, welches du in deiner test.conf ausgewählt hast. Da du nicht die komplette test.conf hier gepostet hast, kann ich das aber nicht beurteilen.
 
Okay, das Problem mit dem Exclude habe ich eben gelöst und anschließend deinen Post gesehen... :o

Und meine test.conf sieht wie folgt aus,
Code:
# /etc/tartarus/test.conf
# Allgemeine Einstellungen einlesen
source /etc/tartarus/generic-file.inc

# Name des Sicherungsprofils
NAME="test"

# Verzeichnis /srv sichern
DIRECTORY="/srv/vhost"

# Keine temporären Dateien sichern
# mehrere Ordner durch Leerzeichen trennen
EXCLUDE="/srv/vhost/*/backup/"

# keinen LVM-Snapshot erstellen
CREATE_LVM_SNAPSHOT="no"
Das mit den Pfaden, gucke ich mir dann einfach noch mal an. Vielleicht finde ich da ja etwas :) Alternative wäre dann, nämlich, dass ich nachts mein Backup mache mit dem Skript von oben, und mit tartarus die Daten einfach nur noch an einen entfernten FTP schubse :)

Sprich, 1:00 startet mein gebautes Backup-Skript, und 3:00 verschiebt tartarus die Daten auf einen externen FTP :D
 
Kannst du aus den 2 Scripten nicht eins bauen?Sprich wenn das Backup-script fertig durchgelaufen ist gleich das nächste hinterher.
 
Erst mal könntest du einfach dein Script als PRE-Hook in Tartarus einbinden, dadurch "wartet" tartarus darauf, daß dein Script fertig wird und legt dann los. Du brauchst auch nur tartarus per Cron aufzurufen, das macht dann den Rest.
Nachteil deiner Variante: Du mußt immer genug Platz auf deinem Server frei haben, um ein komplettes Backup hochzuladen, während tartarus schon während des Sicherns Daten überträgt. Das Backup ist dadurch auch schneller fertig.
Wenn du tartarus alles machen läßt, kannst du außerdem auch incrementelle Backups erstellen. Das mache ich beispielsweise: Wöchentliches Vollbackup und dazwischen täglich inkrementell. Die Backups halte ich dann auf dem FTP-Space für insgesamt vier Wochen vor. Tartarus löscht dann das abgelaufene Vollbackup erst dann wenig, wenn auch die darauf aufbauenden Incrementellen Backups alle gelöscht sind.
Auch ist das Sichern mehrerer Verzeichnisse mit tartarus kein Problem, du legst einfach für jedes zu sichernde Verzeichnis eine eigene Config-Datei an und rufst die Sicherung dann über ein Script auf, welches diese Dateien abarbeitet (steht ja bei Hetzner im Wiki). Mache ich so auch mit mehrere Verzeichnissen.
 
Okay, dann kann ich wohl wie sbr2d2 schon fragte, aus zwei Skripten eins bauen :)

Das mit dem "Hook" hört sich ja dann schon mal gut an. Das hatte ich noch nicht so ganz verstanden.. aber wenn er dann step-by-step die Leistungen durchgeht, passt das schon mal ganz gut :)

Was mich noch interessiert, dass hab ich entweder übersehen oder wurde nicht erklärt. In meinem Script mache ich auch ein SQL Dump... wie mache ich das mit tartarus? :)
 
Ich lasse eigentlich alles über tartarus machen und habe dabei nur zwei Ausnahmen: MySQLdump und das Ziehen der Liste der installierten Debian-Pakete, dafür habe ich kleine Shell-Scripte. Diese habe ich jeweils als Hook eingetragen. Hier mal meine Config für den Datenbank-Dump:
Code:
# Allgemeine Einstellungen einlesen
source /etc/tartarus/generic.inc
# Name des Sicherungsprofils
NAME="database"
# Verzeichnis /var/lib/mysqldump sichern
DIRECTORY="/var/lib/mysqldump"
# Keine temporären Dateien sichern
EXCLUDE=""
# keinen LVM-Snapshot erstellen
CREATE_LVM_SNAPSHOT="no"
# Informationen für Incrementelle Sicherungen speichern in
INCREMENTAL_TIMESTAMP_FILE="/var/spool/tartarus/database"

# Datenbank dumpen
TARTARUS_PRE_PROCESS_HOOK() {
   /usr/local/sbin/mysqlbackup.sh
}

# Datenbankdump wieder entfernen
TARTARUS_POST_STORE_HOOK() {
   rm -R /var/lib/mysqldump/*
}

# abschließendes Löschen alter Backups
source /etc/tartarus/post.inc
Da ich die Dumps der Datenbank nach dem Backup nicht mehr brauche, werden sie im POST_STORE_HOOK wieder gelöscht. Ich denke, damit wird die Verwendung der Hooks auch klarer. Den Dump schreibt mein Shellscript nach /var/lib/mysqldump
 
Okay, dass mit den Hooks ist jetzt doch etwas verständlicher für mich :)
Ich gehe mal davon aus, dass Du in deiner "mysqlbackup.sh" so etwas ähnliches geschrieben hast wie ich in meinem Beispiel ganz oben, oder?
Code:
mysqldump -u $DB_USER -p$DB_PASS --all-databases > $BACKUP/$DATEDIR/sql-backup.sql
Ich werde mich dann heute Abend mal ran machen und selbst etwas kleines bauen und testen :)

Mfg. Anubis
 
Meine mysqlbackup.sh ist schon etwas umfangreicher, da sie für jeden Datenbank ein Verzeichnis anlegt und dann die Tabellen dort einzeln per Dump ablegt. Damit ist dann auch der Restore einzelner Daten etwas einfacher, falls ich mich beim Bearbeiten der Datenbank mal verhauen sollte. Aber grundsätzlich ist deine Variante natürlich auch OK.
 
Okay, ich habe mir jetzt mal zum testen zwei .conf Dateien erstellt... Eine für meine vhosts, und einmal für die Datenbank...
Code:
# /etc/tartarus/vhost.conf
# Allgemeine Einstellungen einlesen
source /etc/tartarus/generic-file.inc

# Name des Sicherungsprofils
NAME="vhost"

# Verzeichnis /srv/mysqldump sichern
DIRECTORY="/srv/vhost"

# Keine temporären Dateien sichern
# mehrere Ordner durch Leerzeichen trennen
EXCLUDE="/srv/vhost/*/backup/"

# keinen LVM-Snapshot erstellen
CREATE_LVM_SNAPSHOT="no"
Code:
# /etc/tartarus/mysqldump.conf
# Allgemeine Einstellungen einlesen
source /etc/tartarus/generic-file.inc

# Name des Sicherungsprofils
NAME="mysqldump"

# Verzeichnis /srv/mysqldump sichern
DIRECTORY="/srv/mysqldump"

# Keine temporären Dateien sichern
# mehrere Ordner durch Leerzeichen trennen
EXCLUDE="/srv/vhost/*/backup/"

# keinen LVM-Snapshot erstellen
CREATE_LVM_SNAPSHOT="no"

# Datenbank Sicherung
TARTARUS_PRE_PROCESS_HOOK() {
 /usr/local/sbin/mysqldump.sh
}
Die Skripte einzeln starten geht ohne Probleme, muss ich die Skripte jetzt via Hook nacheinander laufen lassen, oder gibt es da eine andere Möglichkeit?
 
In der Anleitung von Hetzner steht ziemlich weit unten ein kleines Shellscript, welches du direkt verwenden kann, das die einzelnen tartarus-Profile nacheinander aufruft. Das rufst du einfach auf.
 
Spitze.. Funktioniert alles.. Ich werde jetzt mal schauen, ob der cron.d heute Nacht greift und ob alles funktioniert.

Vielen Dank schon mal bis hierhin für deine Mühe und Hilfe. Ich werde morgen noch mal ein Feedback geben, ob es funktioniert.

Gruß, Anubis

Nachtrag: Ich habe das Skript noch mal ein wenig verändert und bunkere die gesicherten Dateien in einem Ordner der das aktuelle Datum hat. Oder ist das nicht so sinnvoll, wegen dem löschen von Backups die älter als X sind?
 
Last edited by a moderator:
tartarus nimmt das Datum in den Dateinamen seiner Backup-Dateien mit auf und nutzt IIRC auch genau diese Info, um alte Backups zu löschen. Du solltest daher alle tartarus-Backups in das gleiche Verzeichnis sichern lassen.
 
Irgendwie dachte ich mir schon, dass Du mir so etwas sagen wirst :D
Gut, dann soll alles im gleichen Verzeichnis gespeichert werden... ich habe gestern meinen Cronjob einfach mal ausführen lassen, indem ich gesagt habe das er 5min später ausgeführt werden soll.

Resultat war, alles was ich eingetragen hatte, wurde ausgeführt. Ich muss mir dann nur mal eine Sicherung meiner ganzen Konfig machen. Wenn dann mal etwas sein sollte, kann ich das einfach zurück spielen und mich freuen :)

Nachtrag: Wie hast Du das eigentlich gelöst, wenn eine Datei benutzt wird? Ich habe gerade die Sicherung vom "vmail" angeworfen, und einer der Accounts scheint gerade aktiv zu sein (IMAP Konto) und als eine Datei gesichert werden sollte, meckerte er. Allerdings sagte er "Cannot stat: No such file or directory" was mir eigentlich sagt das die Datei gerade gelöscht worden ist :D
 
Last edited by a moderator:
Back
Top