Debian und Ubuntu Backupscript

Gerne teile ich hier mein kleines Debian/Ubuntu Backupscript, welches ich vor einer Weile für mich geschrieben habe.
Das Script sorgt für ein komplettes Backup des Root-Verzeichnisses inkl. MySQL/(MariaDB)-Datenbanken und einer Liste der installierten Pakete nach Status.

Changelog

  • 12.03.2014 – v1.2 – Ausnahmen hinzugefügt und Backup auch bei unkritischen Fehlern
  • 12.03.2014 – v1.1.3 – Ausnahmen hinzugefügt
  • 14.01.2014 – v1.1.2 – Ausnahmen hinzugefügt
  • 12.01.2014 – v1.1.1 – „nice“-Priorität behoben
  • v1.1 – „nice“ benutzen, bessere Fehlermitteilung für „tar“
  • v1.0 – initial release

Der Aufbau des Backups

Es erfolgt die Erstellung des Ordners „FULL_BACKUP_$DATUM_$ZEIT“ im aktuellen Verzeichnis mit folgendem Inhalt:

  • dump.sql – ein komplettes Backup der MySQL-Datenbanken, exklusive „event“ Tabelle
  • packages.list – Eine Liste aller installierten Pakete
  • package-states-auto – Eine Liste automatisch installierter Pakete
  • package-states-manual – Eine Liste manuell installierter Pakete
  • fullbackup.tar – Das Backup des Root-Verzeichnisses

Konfiguration

Das Script ist im Standard so konfiguriert, dass der Wartungs-Benutzer „debian-sys-maintainer“ für den MySQL-Login verwendet wird. Das hat den Vorteil, dass kein Passwort in der Datei gesetzt werden muss.
Soll dieser Benutzer NICHT verwendet werden, wird MAINTAINERLOGIN=“yes“ zu MAINTAINERLOGIN=“no“ abgeändert. Folglich ist es notwendig, dass das Root-Passwort für den MySQL-Login in ROOTPW gesetzt wird. Das Ergebnis könnte dann so aussehen:

MAINTAINERLOGIN="no"
ROOTPW="meingeheimespasswort"

Außerdem ist es nun möglich, die Priorität des Backups zu setzen. -19 ist die höchte Priorität, 19 die niedrigste! Das ist kein Tippfehler. :) Standard ist 0, ergo „normal“:

PRIORITY="0"

Das Script

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

######################## CONFIG START ########################
MAINTAINERLOGIN="yes"
ROOTPW="" # Optional, leave empty if MAINTAINERLOGIN=yes
PRIORITY="0" # "-19" is highest, "19" is lowest
######################### CONFIG END #########################

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DATE=`date +%d%m%Y_%H%M`
TAR=`which tar`
DPKG=`which dpkg`
APTMARK=`which apt-mark`
NICE=`which nice`
MYSQLDUMP=`which mysqldump`
LOGINLINE="-uroot -p$ROOTPW"

function revertchanges {
	rm -r ./FULL_BACKUP_$DATE
}

if [ $MAINTAINERLOGIN == "yes" ] ; then
	echo -en "Testing debian-sys-maintainer login...\t\t\t"
	MAINTLOGIN=`mysqladmin --defaults-file=/etc/mysql/debian.cnf ping 2>&1 | grep "Access denied"`
	if [ ! -z "$MAINTLOGIN" ] ; then
		echo -e "\e[00;31m ERR: Login failed\e[00m"
		exit 1
	fi
	echo -e "\e[00;32m OK\e[00m"
	LOGINLINE="--defaults-file=/etc/mysql/debian.cnf"
else
	echo -en "Testing root login...\t\t\t\t\t"
	MAINTLOGIN=`mysqladmin -uroot -p$ROOTPW ping 2>&1 | grep "Access denied"`
	if [ ! -z "$MAINTLOGIN" ] ; then
		echo -e "\e[00;31m ERR: Login failed\e[00m"
		exit 1
	fi
	echo -e "\e[00;32m OK\e[00m"
fi

mkdir -p ./FULL_BACKUP_$DATE

echo -en "Full backup...\t\t\t\t\t\t"
GREPTAR=$($NICE -$PRIORITY $TAR -cpf FULL_BACKUP_$DATE/fullbackup.tar --directory=/ --exclude FULL_BACKUP_$DATE/fullbackup.tar --exclude=proc --exclude=sys --exclude=dev/pts --exclude=var/spool --exclude=var/run --exclude=run --exclude=tmp . 2>&1)
TAREXC=$?
if [ $TAREXC -eq 2 ] ; then
        echo -e "\e[00;31m FATAL ERR\e[00m"
        echo -e "\n\n\n$GREPTAR"
        revertchanges
        exit 1
fi
if [ $TAREXC -eq 1 ] ; then
        echo -e "\e[00;31m WARNING:\e[00m"
        echo -e "\n\n\n$GREPTAR"
fi
if [ $TAREXC -eq 0 ] ; then
        echo -e "\e[00;32m OK \e[00m"
fi

echo -en "Saving list of installed packages...\t\t\t"
$DPKG --get-selections | awk '!/deinstall|purge|hold/ {print $1}' >  ./FULL_BACKUP_$DATE/packages.list
$APTMARK showauto >  ./FULL_BACKUP_$DATE/package-states-auto
$APTMARK showmanual >  ./FULL_BACKUP_$DATE/package-states-manual
echo -e "\e[00;32m OK\e[00m"

echo -en "Backup all MySQL databases (skipping \"event\")... \t"
$NICE -$PRIORITY $MYSQLDUMP $LOGINLINE --all-databases --ignore-table=mysql.event > ./FULL_BACKUP_$DATE/dump.sql
if [ $? -ne 0 ] ; then
	echo -e "\e[00;31m ERR\e[00m"
	revertchanges
	exit 1
fi
echo -e "\e[00;32m OK\e[00m"
echo -e "\n\nSuccessfully saved backup to FULL_BACKUP_$DATE"
exit 0

Usage: # ./script.sh
Vorab als ausführbar markieren: chmod +x script.sh

27 Antworten auf “Debian und Ubuntu Backupscript

  1. Kai

    Hallo,
    auch von mir ein FETTES Dankeschön!
    Daumen hoch! :-)

    Eine kleine Frage dazu:
    Gibt´s eine Möglichkeit, einen bestimmten Pfad auszuschließen?
    bei mir wäre es ZB.: /srv/*

    Über eine schnelle Antwort würde ich mich freuen
    und im Voraus
    Herzlichen Dank!

    Grüße

  2. rene

    Hallo,

    leider bricht es bei mir mit folgendem Fehler ab:
    —————–%<—————–
    Saving list of installed packages… OK
    Backup all MySQL databases (skipping "event")… /usr/bin/nice: Unbekannte Option »–defaults-file=/etc/mysql/debian.cnf«
    „/usr/bin/nice –help“ liefert weitere Informationen.
    ERR
    —————–%<—————–

    Wie kann der Abbruch verhindert werden?

    Danke und Gruß
    Rene

  3. Jona

    Hi,
    erstmal vielen Dank für dieses super Script!
    Ich habe es mittlerweile auf allen meinen Servern laufen um regelmäßige automatisierte Backups anzulegen.
    Habe diesen Artikel auch direkt mal in meinem Blog geteilt.

  4. Thorsten

    Hallo Andre,

    könntest Du bitte noch (ausführlich) nachliefern, wie man das Archiv auf einem „zerstörten“ System zurückspielt?
    Was muss man beachten, wenn man das Backup auf einem neu installierten System aufspielt?

    Das wäre super.
    Danke!

    Grüsse
    Thorsten

  5. Robin

    Hi,

    für dickere Backups ist das Script leider etwas träge.

    Wie wäre es mit einem inkrementellen Backup in dieser Art? http://blog.joergboesche.de/linux-serverbackup-verschluesselte-inkrementelle-sicherung-mit-duplicity

    Dann würde ich noch die Einzelnen Datenbanken auch in einzelne Dumps speichern, das ist durchaus flexibler.

    Liebe Grüße

    Robin

    PS: Nen Push des Backups auf nen anderen Server wäre ggf auch eine Idee :) Ich schiebe meine Backups aktuell per rsync auf eine HiDrivePlatte, allerdings ist diese Lösung nicht zum empfehlen.

  6. Christoph

    Vielen Dank für das Skript. Das ist echt prima.
    Einen Vorschlag noch: Man könnte noch mit dd (dd if=/dev/sdx of=… bs=512 count=1) Bootsektor und Partitionstabelle sichern. Ich glaube, dann hat man für den Fall der Fälle alles zusammen.
    Beste Grüße
    Christoph

  7. Frank

    Hi Andre,
    danke für dein Script. Ich bin Linux Anfänger und habe es jetzt einfach mal gestartet –
    gibt es Dinge die ich anpassen muss (abgesehen vom Benutzer/Passwort)?

  8. Richard

    Hi,

    auch ich bin ein Bewunderer! Du leistest hier Pionierarbeit und auch für Anfänger kann man so schnell und einfach lernen wie etwas funktioniert und traut sich dann sogar den einen oder anderen eigenen Schritt zu, um etwas zu optimieren. DANKE.

    Ich habe eine Frage: wenn ich nun alle Files mit einem Backup in dieser Art durchgeführt habe – wie würde ich dann rasch wieder denselben Stand auf einem Notfallsystem oder auf z.B. einer neuen virtuellen Maschine ausrollen ohne einen kompletten Snapshot durchzuführen?

    Würde mich über eine Antwort sehr freuen.

    LG Richard

    P.S. Auch mein Mailserver schnurrt und fühle mich wohl mit meinem eigenen Familien Mail- Web- Owncloud- /server. :-)

    1. André P. Autor

      Hi,

      natürlich erst einmal ganz vielen Dank, sowas animiert zum Weitermachen. :)

      Wie das ganze zurück zu spielen ist, werde ich morgen mal ergänzen, schon doof, dass es fehlt, das stimmt.

      Generell gibt es da mehrere Ansätze, einfach drüber entpacken geht im Zweifelsfall natürlich auch. Aber mehr dann morgen.

      Danke für dein Feedback!

      Grüße
      André

        1. André P. Autor

          Hi, vorab schreibe ich dir schon mal hier den Vorgang. :)
          So würdest du zum Beispiel ein Full-Recover durchführen. Danach unbedingt neustarten!

          tar -xvf /PFAD/fullbackup.tar -C /

          Sowas ist aber auch nur für den Notfall gedacht, weshalb ich eben auch die DPKG-Seclections mit exportiere. Es „kann“ sogar sehr gut funktionieren, muss aber nicht. :)
          In dem Fall könntest du das System einfach neu installieren und die Pakete aus den Listen wiederherstellen:

          sudo apt-mark auto $(cat package-states-auto.lst)
          sudo apt-mark manual $(cat package-states-manual.lst)

          Die Konfigurationsdateien könnten dann aus dem Backup gezogen- und einzeln eingespielt werden.
          Ein MySQL-Recover:

          mysql -u root -p < dump.sql

          Ich schreibe das dann noch ausführlicher! :)
          André

          1. Hermann

            Blöde Frage…. wenn man quasi alles in der root Partition „überschreibt“ (mit dem Entpacken des Backups in /), warum müssen dann noch die zwei apt-mark Befehle getätigt werden?

            (vorausgesetzt /opt & /usr liegen auch in der root Partition müsste doch alles allein schon durch das Entpacken des Archivs korrekt vorhanden sein?)

          2. André P. Autor

            Ohje, bin da immer noch nicht zu gekommen. :) Das würde ich nämlich auch noch beschreiben wollen.

            Die Liste der Pakete erfasse ich aus dem Grund, dass ich oft eine Neuinstallation bevorzuge. Die Pakete können also auch sauber im Original installiert- und im Anschluss manuell konfiguriert werden.
            Wie schon gesagt, es ist nicht sonderlich toll, das Backup einfach darüber zu bügeln. Aber im Notfall immer noch besser als ein System, das offline ist.

            Beste Grüße

  9. Ronny

    GENIAL!
    Erst einmal: Daumen hoch für deine wirklich fantastische Arbeit!
    Hole mir hier immer wieder gern Inspiration und habe nach unzähligen erfolglosen attempts endlich meinen Mailserver nach deiner Anleitung lauffähig bekommen.
    Nun schnorrt er wie ein Kätzchen und ich bin dir heute noch sehr zu Dank verpflichtet.

    Dieses Backup-Script ist auch etwas, das ich mir schon selbst basteln wollte, leider fehlte mir die Zeit und ich hab immer alles „schnell“ händisch gemacht.
    Werde es noch erweitern, um das erstellte Backup per VPN auf meine NAS zu sichern.

    You, Sir … are genius. :)

    1. André P. Autor

      Hi,
      danke für das viele Lob! :)
      Ich habe teilweise das Gefühl, dass ich das hier alles nur für mich selber schreibe und das gar keiner liest. Ist natürlich schön zu hören, dass dem nicht so ist. ;)

      Grüße

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.