Inter-Data > Blog > Automatisierte Backups mit Borg: Ein umfassender Tutorial mit einem Backupscript inklusive PostgreSQL- und MySQL-Datenbanken

Automatisierte Backups mit Borg: Ein umfassender Tutorial mit einem Backupscript inklusive PostgreSQL- und MySQL-Datenbanken

Datensicherung mit Borgbackup - das perfekte Script

Automatisierte Backups mit Borg: Ein umfassendes Tutorial für den produktiven Einsatz

Backups sind ein wesentlicher Bestandteil der Datenverwaltung. In diesem Artikel stelle ich ein umfassendes Skript vor, das PostgreSQL- und MySQL-Datenbanken mithilfe von Borg sichert. Dieses Skript ist speziell für Hetzner-Accounts entwickelt worden, funktioniert jedoch auf allen Plattformen, die Borg unterstützen oder auf eigenen Borg-Servern.

Das Backup-Skript

#!/usr/bin/env bash

########### Initialisierung ##############
#### https://docs.hetzner.com/de/robot/storage-box/backup-space-ssh-keys/

## Führe auf dem Clienten die folgenden Befehle aus:
# ssh-keygen
# cat ~/.ssh/id_rsa.pub | ssh -p23 u338XXX@u338XXX.your-storagebox.de install-ssh-key

###### Hier deine Daten einfügen #########
export BORG_PASSPHRASE="einPasswdfürsBackup"

BACKUP_USER="u338XXX"
REPOSITORY_DIR="zB_Servername"
##########################################

LOG="/var/log/storage_backup/backup.log"

full_path=$(realpath $0)
dir_path=$(dirname $full_path)
echo $dir_path

## Hinweis: Für die Verwendung mit einem Backup-Account muss
## 'your-storagebox.de' in 'your-backup.de' geändert werden.

REPOSITORY="ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}"

## Zeitstempel-Variable setzen
TIMESTAMP=$(date +'%Y-%m-%d_%H:%M')

##
## Ausgabe in Logdatei schreiben
##

exec > >(tee -i ${LOG})
exec 2>&1

start_time=$(date +'%Y-%m-%d %H:%M:%S')
echo "###### Backup gestartet: $start_time ######"

## Create list of installed software
##
dpkg --get-selections > /var/software.list

echo "Creating database dumps ..."
echo -n "Postgresql installed? "
if [ -x "$(command -v psql)" ]; then
  echo 'YES'
  /bin/bash $dir_path/backup-postgresql.sh
else
  echo 'NO!!!'
fi

echo -n "MariaDB / MySQL installed?: "
if [ -x "$(command -v mysqld)" ]; then
  echo 'YES'
  /bin/bash $dir_path/backup-mysql.sh
else
  echo 'NO!!!'
fi

## Überprüfen, ob eine spezielle Aktion durchgeführt werden soll
BACKUP_SUFFIX=""
case "$1" in
  NEW_INIT)
    echo "Überprüfe, ob das Verzeichnis backups/${REPOSITORY_DIR} existiert..."
    ssh -p23 ${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de "[ -d backups/${REPOSITORY_DIR} ] || mkdir -p backups/${REPOSITORY_DIR}"
    echo "Das Repository wird komplett gelöscht und neu angelegt..."
    borg delete --force --stats $REPOSITORY
    borg init --encryption=repokey $REPOSITORY
    BACKUP_SUFFIX="_NEW_INIT"
    ;;
  INIT)
    echo "Überprüfe, ob das Verzeichnis backups/${REPOSITORY_DIR} existiert..."
    ssh -p23 ${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de "[ -d backups/${REPOSITORY_DIR} ] || mkdir -p backups/${REPOSITORY_DIR}"
    echo "Überprüfe, ob das Repository existiert..."
    if borg info $REPOSITORY > /dev/null 2>&1; then
      echo "Das Repository existiert bereits. Vorgang wird abgebrochen."
      exit 1
    else
      echo "Das Repository wird neu angelegt..."
      borg init --encryption=repokey $REPOSITORY
    fi
    BACKUP_SUFFIX="_INIT"
    ;;
  ?)
    echo -e "\n######################################"
    echo -e "Verwendung des Backup-Skripts:"
    echo -e "######################################"
    echo -e "Ohne Parameter:"
    echo -e "  Führt ein reguläres Backup durch und hängt an den Backup-Namen das aktuelle Datum und die Uhrzeit."
    echo -e "\nParameter:"
    echo -e "  NEW_INIT  - Löscht das Repository komplett und legt es neu an."
    echo -e "  INIT      - Legt das Repository neu an, wenn es nicht bereits existiert."
    echo -e "  ?         - Zeigt diese Hilfemeldung an und bricht das Skript ab."
    echo -e "\nBeispiele:"
    echo -e "  ./backup_script.sh"
    echo -e "  ./backup_script.sh NEW_INIT"
    echo -e "  ./backup_script.sh INIT"
    echo -e "  ./backup_script.sh ?"
    echo -e "\nBackups auflisten mit:"
    echo -e "  borg list ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}\n"
    echo -e "Rücksichern einzelner Verzeichnisse mit:"
    echo -e "  cd /mytmp # Wechseln Sie in ein Testverzeichnis, um das Backup zu testen."
    echo -e "  borg extract ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}::${TIMESTAMP}${BACKUP_SUFFIX} etc var lib lib64 sbin usr bin"
    echo -e "######################################\n"
    echo -e "Komplette Rücksicherung mit:"
    echo -e "cd / # Wechseln Sie in das Root-Verzeichnis, um das gesamte System wiederherzustellen."
    echo -e "borg extract ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}::${TIMESTAMP}${BACKUP_SUFFIX}"
    echo -e "######################################\n"
    echo -e "Auf den Backup-Server verbinden:"
    echo -e "ssh -p23 ${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de"
    echo -e "Verzeichnisinhalt anzeigen:"
    echo -e "ls backups/${REPOSITORY_DIR}"
    echo -e "Verzeichnis der aktuellen Backups löschen:"
    echo -e "rm -rf backups/${REPOSITORY_DIR}"
    echo -e "######################################\n"
    exit 0
    ;;
esac

## Überprüfen, ob ein zusätzlicher Parameter übergeben wurde
if [ -n "$1" ] && [ "$1" != "INIT" ] && [ "$1" != "NEW_INIT" ]; then
  BACKUP_SUFFIX="_$1"
fi

##
## Zu sichernde Verzeichnisse
##
# Hier werden alle Verzeichnisse im Root-Verzeichnis gesichert, außer den ausgeschlossenen Verzeichnissen
DIRS_TO_BACKUP=(
    "/"
)

##
## Dateien ins Repository übertragen
##

echo "Übertrage Dateien ..."
borg create -v --stats                   \
    $REPOSITORY::"${TIMESTAMP}${BACKUP_SUFFIX}"  \
    "${DIRS_TO_BACKUP[@]}"               \
    --exclude /dev                       \
    --exclude /proc                      \
    --exclude /sys                       \
    --exclude /tmp                       \
    --exclude /run                       \
    --exclude /lost+found                \
    --exclude /mnt                       \
    --exclude /media                     \
    --exclude /var/lib/lxcfs             \
    --exclude /var/run                   \
    --exclude /var/cache                 \
    --exclude /var/tmp                   \
    --exclude /var/log

end_time=$(date +'%Y-%m-%d %H:%M:%S')
duration=$(date -u -d @$(( $(date -d "$end_time" +%s) - $(date -d "$start_time" +%s) )) +%H:%M:%S)

echo "###### Backup beendet: $end_time ######"
echo "Time (start): $start_time"
echo "Time (end):   $end_time"
echo "Duration:     $duration"

echo -e "\n######################################"
echo -e "Backups auflisten mit:"
echo -e "borg list ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}\n"

echo -e "Rücksichern einzelner Verzeichnisse mit:"
echo -e "cd /mytmp # Wechseln Sie in ein Testverzeichnis, um das Backup zu testen."
echo -e "borg extract ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}::${TIMESTAMP}${BACKUP_SUFFIX} etc var lib lib64 sbin usr bin"
echo -e "######################################\n"

echo -e "Komplette Rücksicherung mit:"
echo -e "cd / # Wechseln Sie in das Root-Verzeichnis, um das gesamte System wiederherzustellen."
echo -e "borg extract ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./backups/${REPOSITORY_DIR}::${TIMESTAMP}${BACKUP_SUFFIX}"
echo -e "######################################\n"

echo -e "Auf den Backup-Server verbinden:"
echo -e "ssh -p23 ${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de"
echo -e "Verzeichnisinhalt anzeigen:"
echo -e "ls backups/${REPOSITORY_DIR}"
echo -e "Verzeichnis der aktuellen Backups löschen:"
echo

 -e "rm -rf backups/${REPOSITORY_DIR}"
echo -e "######################################\n"

Das Skript ausführbar machen und benutzen

Um das Skript ausführbar zu machen und zu benutzen, folgen Sie diesen Schritten:

  1. Skriptdatei erstellen: Erstellen Sie eine neue Datei und fügen Sie den obigen Skriptcode ein. Speichern Sie die Datei zum Beispiel als backup_script.sh.

  2. Skript in /usr/local/sbin/ verschieben: Verschieben Sie das Skript in das Verzeichnis /usr/local/sbin/, um es systemweit ausführbar zu machen:

    sudo mv backup_script.sh /usr/local/sbin/backup_script.sh
    
  3. Ausführbar machen: Geben Sie folgenden Befehl ein, um das Skript ausführbar zu machen:

    sudo chmod +x /usr/local/sbin/backup_script.sh
    
  4. Benutzen des Skripts: Führen Sie das Skript aus, indem Sie es mit einem der unterstützten Parameter aufrufen:

    sudo /usr/local/sbin/backup_script.sh          # Führt ein reguläres Backup durch
    sudo /usr/local/sbin/backup_script.sh NEW_INIT # Löscht das Repository komplett und legt es neu an
    sudo /usr/local/sbin/backup_script.sh INIT     # Legt das Repository neu an, wenn es nicht bereits existiert
    sudo /usr/local/sbin/backup_script.sh ?        # Zeigt die Hilfemeldung an und bricht das Skript ab
    

Einen Cronjob anlegen

Um das Backup-Skript regelmäßig automatisch auszuführen, können Sie einen Cronjob anlegen. Ein Cronjob ist ein zeitgesteuerter Job, der von Cron, einem Hintergrundprozess (Daemon), auf Unix-ähnlichen Betriebssystemen ausgeführt wird.

  1. Crontab bearbeiten: Öffnen Sie die Crontab-Konfiguration mit dem folgenden Befehl:

    sudo crontab -e
    
  2. Cronjob hinzufügen: Fügen Sie eine neue Zeile hinzu, um das Backup-Skript täglich um 2 Uhr morgens auszuführen:

    0 2 * * * /usr/local/sbin/backup_script.sh
    
  3. Crontab speichern und schließen: Speichern Sie die Änderungen und schließen Sie den Editor.

Warum sind Backups wichtig?

Backups sind die letzte Verteidigungslinie gegen Datenverlust. Sie schützen vor Hardwarefehlern, Ransomware-Angriffen, menschlichen Fehlern und Softwareproblemen. Ohne regelmäßige Backups können Daten unwiederbringlich verloren gehen, was besonders für Unternehmen verheerend sein kann. Ein gutes Backup-System stellt sicher, dass Daten schnell und vollständig wiederhergestellt werden können, wodurch Ausfallzeiten minimiert und der Geschäftsbetrieb aufrechterhalten wird.

Vorteile von Borg Backup

Borg Backup ist ein deduplizierendes Backup-Tool, das für seine Effizienz und Zuverlässigkeit bekannt ist. Hier sind einige seiner Vorteile:

  1. Deduplizierung: Borg speichert nur einzigartige Datenblöcke und vermeidet so die redundante Speicherung, was Speicherplatz spart.
  2. Kompression: Es unterstützt verschiedene Kompressionsalgorithmen, um die Größe der Backups weiter zu reduzieren.
  3. Verschlüsselung: Borg bietet robuste Verschlüsselung, um die Sicherheit der gespeicherten Daten zu gewährleisten.
  4. Schnelle Backups: Dank seiner effizienten Handhabung von Änderungen sind inkrementelle Backups schnell und ressourcenschonend.
  5. Flexibilität: Borg funktioniert auf verschiedenen Plattformen und kann sowohl lokal als auch remote eingesetzt werden.

Fazit

Borg Backup bietet eine effiziente und zuverlässige Lösung für die Sicherung und Wiederherstellung von Daten. Mit diesem Skript können Sie PostgreSQL- und MySQL-Datenbanken sichern und sicherstellen, dass Ihre Daten jederzeit wiederhergestellt werden können. Ob Sie einen Hetzner-Account nutzen oder einen eigenen Borg-Server betreiben, dieses Skript bietet eine flexible und anpassbare Lösung für Ihre Backup-Anforderungen.