====== Backup ======
===== Rsnapshot =====
ist ein einfach zu bedienendes Backupprogramm. [[https://wiki.ubuntuusers.de/rsnapshot/|Rsnapsho]]t hasiert auf rsync, es ist einfach zu bedienen und eignet sich sehr gut für Backups auf USB Festplatten.\\
**ein anderes einfaches Backup-Skript **
#!/bin/sh
NOW=$(date +"%d-%m-%Y")
# set mysql login info
MUSER="MySQL-UserNAME" # Username
MPASS="MySQL-SERVER-PASSWORD" # Password
MHOST="MySQL-SERVER-IP-ADDRESS" # Server Name
# guess binary names
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
# get all db names
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
FILE=mysql-$db.$NOW-$(date +"%T").gz
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9> $FILE
done
**Verzeichnisse sichern **
#!/bin/bash
# Simple backup with rsync
# local-mode, tossh-mode, fromssh-mode
SOURCES=(/root /etc /home /boot /lampp)
TARGET="/media/backup"
# edit or comment with "#"
#LISTPACKAGES=listdebianpackages # local-mode and tossh-mode
MONTHROTATE=monthrotate # use DD instead of YYMMDD
RSYNCCONF=(--delete)
#MOUNTPOINT="/media/daten" # check local mountpoint
#MAILREC="user@ domain"
#SSHUSER="sshuser"
#FROMSSH="fromssh-server"
#TOSSH="tossh-server"
SSHPORT=22
### do not edit ###
MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm"
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
LAST="last"; INC="--link-dest=$TARGET/$LAST"
LOG=$0.log
$DATE> $LOG
if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
TARGET=$TARGET/
fi
if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then
$ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '">> $LOG
$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' '>> $LOG 2>&1
fi
if [ "$MOUNTPOINT" ]; then
MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
fi
if [ -z "$MOUNTPOINT" ] || [ "$MOUNTED" ]; then
if [ -z "$MONTHROTATE" ]; then
TODAY=$($DATE +%y%m%d)
else
TODAY=$($DATE +%d)
fi
if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then
S="$SSH -p $SSHPORT -l $SSHUSER";
fi
for SOURCE in "${SOURCES[@]}"
do
if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then
$ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC">> $LOG
$RSYNC -e "$S" -avR "$FROMSSH:\"$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC>> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
$ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$TODAY\" $INC ">> $LOG
$RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$TODAY" $INC>> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if [ -z "$S" ]; then
$ECHO "$RSYNC -avR \"$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC">> $LOG
$RSYNC -avR "$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC>> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
done
if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
$ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST">> $LOG
$SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf \"$TARGET\"$TODAY \"$TARGET\"$LAST">> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] ); then
$ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST">> $LOG
$LN -nsf "$TARGET"$TODAY "$TARGET"$LAST>> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
else
$ECHO "$MOUNTPOINT not mounted">> $LOG
ERROR=1
fi
$DATE>> $LOG
if [ -n "$MAILREC" ]; then
if [ $ERROR ];then
$MAIL -s "Error Backup $LOG" $MAILREC <$LOG
else
$MAIL -s "Backup $LOG" $MAILREC <$LOG
fi
fi
===== rsnapshot-Tagessicherung mit Überwachung und Fehlermail =====
==== Ziel ====
Die tägliche ''rsnapshot''-Sicherung soll automatisch gestartet und überwacht werden.\\
Wenn die Sicherung fehlschlägt oder bereits ein Sicherungslauf aktiv ist, soll automatisch eine E-Mail an ''webmaster@waldhofer.com'' gesendet werden.
Die Lösung verwendet ein Shell-Skript mit:
* Start der Tagessicherung\\
* Protokollierung in eine Logdatei\\
* Fehlererkennung über den Rückgabecode\\
* Mailversand im Fehlerfall\\
* Sperre gegen Doppelstarts mit ''flock''
----
==== Wichtiger Hinweis ====
Die Tagessicherung ist bereits im Skript integriert.\\
Es ist **kein zusätzlicher Cronjob für ''rsnapshot daily'' ** notwendig.
Das Skript enthält den eigentlichen Sicherungsaufruf:
usr/bin/rsnapshot daily>> "$LOGFILE" 2>&1
Es genügt daher **ein einziger Cronjob**, der nur das Überwachungsskript startet.
----
==== Warum ''flock'' verwenden? ====
Mit ''flock'' wird verhindert, dass ein zweiter Sicherungslauf startet, wenn der erste noch aktiv ist.
Vorteile:
* keine Doppelstarts\\
* saubere Sperrlogik\\
* robust unter Ubuntu\\
* besser als einfache selbst gebaute PID-/Lockfile-Prüfungen
----
==== Skript anlegen ====
Datei erstellen:
sudo nano /usr/local/bin/rsnapshot_daily_monitor.sh
Inhalt:
#!/bin/bash
set -u
LOGFILE="/var/log/rsnapshot_daily.log"\
MAILTO="webmaster@domain.at"\
HOSTNAME="$(hostname -f 2>/dev/null || hostname)"\
LOCKFILE="/var/run/rsnapshot_daily.lock"
send_error_mail() {\
local subject="$1"\
local body="$2"
/usr/sbin/sendmail "$MAILTO" <> "$LOGFILE"\
send_error_mail \
"[FEHLER] rsnapshot bereits aktiv auf $HOSTNAME" \
"Der rsnapshot-Job wurde nicht gestartet, weil bereits ein Lauf aktiv ist.
Host: $HOSTNAME\
Zeit: $DATE_NOW\
Lockdatei: $LOCKFILE\
Logdatei: $LOGFILE"\
exit 1\
}
DATE_NOW="$(date '+%Y-%m-%d %H:%M:%S')"\
echo "==== Start rsnapshot daily: $DATE_NOW ====">> "$LOGFILE"
/usr/bin/rsnapshot daily>> "$LOGFILE" 2>&1\
RETVAL=$?
DATE_END="$(date '+%Y-%m-%d %H:%M:%S')"
if [ $RETVAL -eq 0 ]; then\
echo "==== Ende rsnapshot daily erfolgreich: $DATE_END ====">> "$LOGFILE"\
else\
echo "==== Ende rsnapshot daily FEHLER ($RETVAL): $DATE_END ====">> "$LOGFILE"\
send_error_mail \
"[FEHLER] rsnapshot Backup auf $HOSTNAME" \
"Die rsnapshot-Sicherung ist fehlgeschlagen.
Host: $HOSTNAME\
Zeit: $DATE_END\
Rueckgabecode: $RETVAL\
Logdatei: $LOGFILE
Die letzten 50 Zeilen aus dem Log:
$(tail -n 50 "$LOGFILE")"\
fi
exit $RETVAL\
} 9>"$LOCKFILE"\
----
==== Skript ausführbar machen ====
sudo chmod +x /usr/local/bin/rsnapshot_daily_monitor.sh
----
==== Cronjob einrichten ====
Root-Crontab bearbeiten:
sudo crontab -e
Eintrag hinzufügen:
0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh
Damit wird jeden Tag um 01:00 Uhr:
* das Skript gestartet\\
* die Tagessicherung ausgeführt\\
* das Ergebnis protokolliert\\
* im Fehlerfall eine Mail versendet
----
==== Wichtige Regel ====
Ein alter direkter Cronjob mit ''rsnapshot daily'' darf **nicht zusätzlich** aktiv sein.
Also **nicht beides gleichzeitig**:
0 1 * * * /usr/bin/rsnapshot daily\
0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh
Richtig ist nur:
0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh
----
==== Funktion testen ====
Skript manuell starten:
sudo /usr/local/bin/rsnapshot_daily_monitor.sh
echo $?
Bedeutung:
* ''0'' = Sicherung erfolgreich\\
* ''1'' oder anderer Wert ungleich ''0'' = Fehler erkannt
Logdatei ansehen:
sudo tail -n 50 /var/log/rsnapshot_daily.log
----
==== rsnapshot separat prüfen ====
Falls das Skript Fehler liefert, zuerst ''rsnapshot'' selbst testen:
Konfiguration prüfen:
sudo /usr/bin/rsnapshot configtest
echo $?
Tagessicherung direkt starten: sudo/usr/bin/rsnapshot daily\ echo$?\
----
==== Mailversand testen ====
Testmail senden:
echo -e "Subject: Testmail\n\nDas ist ein Test." | sudo /usr/sbin/sendmail webmaster@domain.at
Wenn die Mail ankommt, funktioniert der Versand über ''ssmtp'' bzw. ''sendmail''.
----
==== Logdatei ====
Die Logdatei ist:
/var/log/rsnapshot_daily.log
Dort stehen unter anderem:
* Startzeit des Sicherungslaufs\\
* Ende des Sicherungslaufs\\
* Erfolg oder Fehler\\
* eventuelle Fehlermeldungen von ''rsnapshot''
----
==== Typische Fehlerquellen ====
* Fehler in ''/etc/rsnapshot.conf''\\
* Zielverzeichnis nicht erreichbar\\
* fehlende Berechtigungen\\
* zu wenig Speicherplatz\\
* SSH-Probleme bei entfernten Sicherungszielen\\
* fehlerhafte Mail-Konfiguration\\
* bereits laufender zweiter Sicherungsjob
----
==== Zusammenfassung ====
Diese Lösung kombiniert:
* Tagessicherung\\
* Überwachung\\
* Logging\\
* Fehlermail\\
* Schutz vor Doppelstarts
in **einem einzigen Skript**.
Daher reicht **ein einziger Cronjob** völlig aus.