====== 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.