Tag Archive: backup

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