Konfiguration inkrementeller MySQL-Backups mit Percona XtraBackup

Erstellen und Wiederherstellen inkrementeller Percona XtraBackup MySQL-Backups mit vollständigen Backups, LSN-Verkettung, Vorbereitungsschritten und Copy-Back.

Konfiguration inkrementeller MySQL-Backups mit Percona XtraBackup

Percona XtraBackup (PXB) kann Hot-Backups von MySQL-kompatiblen Servern mit InnoDB-Daten erstellen. Vollständige Backups sind einfach, aber große Datenbanken benötigen oft inkrementelle MySQL-Backups, um nicht jede Nacht dieselben Seiten zu kopieren.

Diese Anleitung behandelt die Befehle für ein vollständiges Basis-Backup, verkettete inkrementelle Backups und die Wiederherstellungssequenz, die jedes inkrementelle Backup in der richtigen Reihenfolge anwendet.

Verständnis des inkrementellen Mechanismus von Percona XtraBackup

PXB basiert auf den internen Abläufen der InnoDB-Speicher-Engine und verfolgt Änderungen mithilfe der Log Sequence Number (LSN). Jede InnoDB-Seite ist mit einer LSN markiert. Wenn PXB ein inkrementelles Backup durchführt, zeichnet es nur die Seiten auf, deren LSN größer ist als die LSN zum Zeitpunkt des vorherigen Backups.

Entscheidend ist, dass inkrementelle Backups ein vollständiges Basis-Backup benötigen, um den Startpunkt festzulegen. Alle nachfolgenden inkrementellen Backups werden verkettet und verweisen auf das unmittelbar vorhergehende Backup (das das Basis-Backup oder ein anderes inkrementelles Backup sein kann).

Wichtige Dateien und Konzepte

  • LSN (Log Sequence Number): Der Marker, der verwendet wird, um zu bestimmen, wo Änderungen beginnen und enden.
  • xtrabackup_checkpoints: Eine Datei, die während jedes Backups erstellt wird und die to_lsn (die LSN am Ende des Backups) und bei inkrementellen Backups die from_lsn (die Start-LSN) enthält.
  • --incremental-basedir: Das wesentliche Flag, das bei inkrementellen Läufen verwendet wird und PXB auf das Verzeichnis des vorherigen Backups verweist (das die Start-LSN bestimmt).

Schritt 1: Durchführen des vollständigen Basis-Backups

Bevor inkrementelle Snapshots erstellt werden, muss ein vollständiges, konsistentes Basis-Backup erstellt werden. Dies legt die Grundlage für die gesamte Backup-Kette fest.

Definieren Sie zunächst ein klares Verzeichnis für das vollständige Backup:

# Definieren Sie das Basisverzeichnis für das vollständige Backup
BASE_DIR="/data/backups/2023-10-01_FULL"

# Erstellen Sie das Verzeichnis
mkdir -p $BASE_DIR

# Führen Sie das vollständige Backup aus
xtrabackup --backup \
  --target-dir=$BASE_DIR \
  --user=root --password=secret_password \
  --datadir=/var/lib/mysql

# Überprüfen Sie die LSN des vollständigen Backups
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'

Hinweis: Das target-dir muss leer oder nicht vorhanden sein, wenn der Backup-Prozess gestartet wird. Die erforderlichen Berechtigungen variieren je nach MySQL- und XtraBackup-Version. Erstellen Sie daher einen dedizierten Backup-Benutzer gemäß den aktuellen Berechtigungsrichtlinien von Percona, anstatt root wiederzuverwenden.

Schritt 2: Erstellen des ersten inkrementellen Backups

Um das erste inkrementelle Backup durchzuführen, müssen wir mit dem Flag --incremental-basedir auf das vollständige Basis-Backup-Verzeichnis verweisen. PXB liest die to_lsn aus dem Basis-Backup und kopiert nur die Seiten, die sich seit diesem Zeitpunkt geändert haben.

# Definieren Sie das Verzeichnis für das erste inkrementelle Backup
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"

# Führen Sie das inkrementelle Backup aus, das auf das vollständige Basis-Backup verweist
xtrabackup --backup \
  --target-dir=$INCREMENTAL_1_DIR \
  --incremental-basedir=/data/backups/2023-10-01_FULL \
  --user=root --password=secret_password

Schritt 3: Verketten nachfolgender inkrementeller Backups

Für jedes nachfolgende inkrementelle Backup (INC2, INC3 usw.) muss --incremental-basedir auf das unmittelbar vorhergehende inkrementelle Backup-Verzeichnis verweisen.

Wenn wir INC2 basierend auf den Änderungen seit INC1 erstellen möchten:

# Definieren Sie das Verzeichnis für das zweite inkrementelle Backup
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"

# Führen Sie das inkrementelle Backup aus, das auf das vorherige inkrementelle Backup (INC1) verweist
xtrabackup --backup \
  --target-dir=$INCREMENTAL_2_DIR \
  --incremental-basedir=/data/backups/2023-10-02_INC1 \
  --user=root --password=secret_password

Diese Verkettung wird fortgesetzt, solange die Sequenz beibehalten wird. Wenn ein Glied in der Kette unterbrochen wird (d. h. ein Verzeichnis fehlt), schlägt der Wiederherstellungsprozess fehl.

Wiederherstellung: Anwenden inkrementeller Änderungen

Die Wiederherstellung eines inkrementellen Backup-Sets ist ein mehrstufiger Prozess, bei dem die Änderungen nacheinander auf das Basis-Backup angewendet werden. Im Gegensatz zu einem vollständigen Backup können inkrementelle Backups nicht direkt in das Datenverzeichnis kopiert werden.

Wiederherstellungsphase 1: Vorbereiten des Basis-Backups

Zunächst muss das Basis-Backup vorbereitet werden. Dies geschieht normalerweise in einem temporären Staging-Bereich, um die Datensicherheit zu gewährleisten.

Bei der Vorbereitung des Basis-Backups führt PXB zwei wesentliche Aktionen aus:

  1. Anwenden von festgeschriebenen Transaktionen (das Redo-Log).
  2. Zurücksetzen von nicht festgeschriebenen Transaktionen.

Wir verwenden das Flag --prepare, aber entscheidend ist, dass wir das Flag --apply-log-only hinzufügen. Dies verhindert, dass PXB nicht festgeschriebene Transaktionen zurücksetzt, was notwendig ist, da die nachfolgenden inkrementellen Logs diese Transaktionsfragmente benötigen, um die Wiederherstellung abzuschließen.

# Definieren Sie das Staging-Verzeichnis
RESTORE_TARGET="/data/restore_staging"

# Kopieren Sie die vollständigen Basis-Backup-Dateien in den Staging-Bereich
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# Bereiten Sie das Basis-Backup vor und halten Sie es bereit für Inkremente
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# Suchen Sie nach der Bestätigung: 'completed OK!'

Wiederherstellungsphase 2: Anwenden inkrementeller Backups nacheinander

Als nächstes wenden Sie jedes inkrementelle Backup in der exakten chronologischen Reihenfolge an, in der sie erstellt wurden. Jeder Befehl muss auf das Staging-Verzeichnis (das aktuell modifizierte Basis-Backup) verweisen und das Flag --incremental-dir verwenden, das auf das spezifische inkrementelle Snapshot verweist.

# Inkrementelles Backup 1 anwenden
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-02_INC1 \
  --apply-log-only

# Inkrementelles Backup 2 anwenden
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-03_INC2 \
  --apply-log-only

# ... für alle erforderlichen Inkremente fortsetzen ...

Wiederherstellungsphase 3: Abschließen der Vorbereitung

Sobald das letzte gewünschte inkrementelle Snapshot angewendet wurde, führen Sie den letzten Vorbereitungsschritt ohne das Flag --apply-log-only aus. Dies ermöglicht PXB, die endgültige Bereinigung durchzuführen, indem alle Transaktionen zurückgesetzt werden, die über die gesamte Backup-Sequenz hinweg noch nicht festgeschrieben waren, was zu einem konsistenten Zustand führt.

# Abschließen der Vorbereitung (ohne --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# WICHTIG: Suchen Sie nach der endgültigen Bestätigung, die 'xtrabackup: Recovery completed OK!' anzeigt

Wiederherstellungsphase 4: Kopieren der Daten zurück zu MySQL

Nach erfolgreicher Vorbereitung sind die Daten im Staging-Verzeichnis ($RESTORE_TARGET) konsistent und bereit für die Verwendung durch den MySQL-Server.

  1. Stoppen Sie den MySQL-Dienst.
  2. Stellen Sie sicher, dass das MySQL-Datenverzeichnis leer ist oder gesichert wurde (optional: verwenden Sie die Option --move-back, falls erlaubt, aber --copy-back ist sicherer für die Wiederherstellung).
  3. Verwenden Sie xtrabackup --copy-back, um die Dateien zu verschieben.
  4. Korrigieren Sie die Berechtigungen.
  5. Starten Sie MySQL neu.
# Stoppen Sie den MySQL-Dienst
sudo systemctl stop mysql

# Kopieren Sie die vorbereiteten Dateien zurück in das MySQL-Datenverzeichnis
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# Stellen Sie die korrekte Eigentümerschaft für die Dateien sicher
sudo chown -R mysql:mysql /var/lib/mysql

# Starten Sie MySQL
sudo systemctl start mysql

Best Practices für die Verwaltung inkrementeller Backups

Automatisierung und Skripterstellung

Inkrementelle Backup-Strategien sind am effektivsten, wenn sie vollständig automatisiert sind. Skripte sollten die LSN-Verkettung automatisch verwalten und dynamisch das aktuellste Backup-Verzeichnis identifizieren, das für das Flag --incremental-basedir verwendet werden soll.

Aufbewahrungsrichtlinie

Inkrementelle Ketten können sehr lang werden, was die Wiederherstellung langsam und anfällig macht. Führen Sie regelmäßig einen Rollover der Kette durch, indem Sie ein neues vollständiges Backup erstellen. Einige Teams behalten auch wöchentliche und monatliche vollständige Backups unter einem Großvater-Vater-Sohn-Aufbewahrungsmodell.

Komprimierung und Drosselung

Für sehr ausgelastete Server sollten Sie während der Backup-Phase die Option --throttle verwenden, um I/O-Operationen zu begrenzen. Verwenden Sie --compress, um die Backup-Größe zu reduzieren, was besonders vorteilhaft für die kleineren Datensätze ist, die durch inkrementelle Backups erzeugt werden.

# Beispiel mit Komprimierung und Drosselung
xtrabackup --backup \
  --target-dir=$INCREMENTAL_3_DIR \
  --incremental-basedir=$INCREMENTAL_2_DIR \
  --compress \
  --throttle=100

Überprüfung und Überwachung

Testen Sie Ihre Wiederherstellungsverfahren regelmäßig. Ein Backup, das nicht wiederhergestellt werden kann, ist nutzlos. Überwachen Sie den von Ihrer inkrementellen Kette belegten Speicherplatz, insbesondere bevor Sie ein neues vollständiges Basis-Backup initiieren.

Fazit

Inkrementelles XtraBackup funktioniert nur, wenn die Kette intakt ist: vollständiges Backup, erstes inkrementelles Backup basierend auf dem vollständigen Backup, dann jedes spätere inkrementelle Backup basierend auf dem vorherigen Backup. Stellen Sie während der Wiederherstellung das Basis-Backup mit --apply-log-only bereit, wenden Sie jedes inkrementelle Backup in der Reihenfolge an, führen Sie eine letzte Vorbereitung ohne --apply-log-only durch, und kopieren Sie erst dann die vorbereiteten Daten zurück zu MySQL.