Konfiguration inkrementeller MySQL-Backups mit Percona XtraBackup

Meistern Sie die Kunst der hocheffizienten MySQL-Backups mit inkrementellen Snapshots von Percona XtraBackup (PXB). Diese umfassende Anleitung beschreibt die entscheidenden Schritte zur Konfiguration, Ausführung und Wiederherstellung sequenzieller inkrementeller Backups auf Basis der LSN-Nachverfolgung. Erfahren Sie, wie Sie das anfängliche vollständige Basis-Backup durchführen, nachfolgende Inkremente korrekt mithilfe von `--incremental-basedir` verketten und den mehrphasigen Wiederherstellungsprozess navigieren, um Ausfallzeiten zu minimieren und die optimale Speicherverwaltung für große Datenbanken zu gewährleisten.

52 Aufrufe

Konfiguration inkrementeller MySQL-Backups mit Percona XtraBackup

Percona XtraBackup (PXB) ist der Industriestandard für nicht-blockierende Hot-Backups von MySQL-, MariaDB- und Percona Server-Instanzen. Während vollständige Backups unerlässlich sind, erfordern große Datenbanken eine effiziente Strategie, um Ausfallzeiten und Speicherplatz zu minimieren. Inkrementelle Backups bieten diese Effizienz, indem sie nur die Datenänderungen erfassen, die seit dem letzten erfolgreichen Backup aufgetreten sind.

Diese Anleitung untersucht, wie PXB zur Implementierung einer robusten inkrementellen Backup-Strategie genutzt werden kann. Wir behandeln die Kernkonzepte, die notwendigen Befehle für die Durchführung sequenzieller inkrementeller Snapshots und den mehrstufigen Prozess, der für eine erfolgreiche Wiederherstellung erforderlich ist.

Verstehen des inkrementellen Mechanismus von Percona XtraBackup

PXB stützt sich auf die interne Funktionsweise der InnoDB-Speicher-Engine, insbesondere auf die Verfolgung von Änderungen mithilfe der Log Sequence Number (LSN). Jede InnoDB-Seite ist mit einer LSN gekennzeichnet. Wenn PXB ein inkrementelles Backup durchführt, werden nur die Seiten kopiert, deren LSN größer ist als die LSN, die zum Zeitpunkt des vorherigen Backups aufgezeichnet wurde.

Entscheidend ist, dass inkrementelle Backups ein vollständiges Basis-Backup benötigen, um den Ausgangspunkt 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, die am Ende des Backups erreicht wurde) und bei inkrementellen Backups die from_lsn (die Start-LSN) enthält.
  • --incremental-basedir: Das wesentliche Flag, das während inkrementeller Läufe verwendet wird und PXB auf das Verzeichnis des vorherigen Backups verweist (das die Start-LSN bestimmt).

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

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

Zuerst definieren wir unsere Verzeichnisstruktur:

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

# Verzeichnis erstellen
mkdir -p $BASE_DIR

# Vollständiges Backup ausführen
xtrabackup --backup \n  --target-dir=$BASE_DIR \n  --user=root --password=secret_password \n  --datadir=/var/lib/mysql

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

Hinweis: Das target-dir muss beim Start des Backup-Prozesses leer oder nicht vorhanden sein. Verwenden Sie immer Anmeldeinformationen mit den entsprechenden Berechtigungen (z. B. RELOAD, LOCK TABLES, PROCESS, SUPER-Privilegien).

Schritt 2: Erstellen des ersten inkrementellen Backups

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

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

# Inkrementelles Backup ausführen und auf das vollständige Basis-Backup verweisen
xtrabackup --backup \n  --target-dir=$INCREMENTAL_1_DIR \n  --incremental-basedir=/data/backups/2023-10-01_FULL \n  --user=root --password=secret_password

Schritt 3: Verketten nachfolgender inkrementeller Backups

Bei jedem nachfolgenden inkrementellen Backup (INC2, INC3 usw.) muss --incremental-basedir auf das unmittelbar vorhergehende Verzeichnis des inkrementellen Backups verweisen.

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

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

# Inkrementelles Backup ausführen und auf das vorherige inkrementelle Backup (INC1) verweisen
xtrabackup --backup \n  --target-dir=$INCREMENTAL_2_DIR \n  --incremental-basedir=/data/backups/2023-10-02_INC1 \n  --user=root --password=secret_password

Diese Verkettung wird fortgesetzt, solange Sie die Sequenz beibehalten. 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-Satzes ist ein mehrstufiger Prozess, bei dem die Änderungen sequenziell 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

Zuerst 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 durch:
1. Anwenden bestätigter Transaktionen (des Redo-Logs).
2. Zurückrollen nicht bestätigter Transaktionen.

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

# Staging-Verzeichnis definieren
RESTORE_TARGET="/data/restore_staging"

# Dateien des vollständigen Basis-Backups in den Staging-Bereich kopieren
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# Basis-Backup vorbereiten, um es für inkrementelle Backups bereitzuhalten
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# Auf Bestätigung warten: 'completed OK!'

Wiederherstellungsphase 2: Sequenzielles Anwenden inkrementeller Backups

Als Nächstes wenden Sie jedes inkrementelle Backup in der exakten chronologischen Reihenfolge an, in der es erstellt wurde. Jeder Befehl muss auf das Staging-Verzeichnis (das aktuell modifizierte Basis-Backup) verweisen und das Flag --incremental-dir verwenden, das auf den spezifischen inkrementellen Snapshot zeigt.

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

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

# ... für alle erforderlichen inkrementellen Backups fortfahren ...

Wiederherstellungsphase 3: Abschließen der Vorbereitung

Sobald der 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, alle Transaktionen zurückzurollen, die über die gesamte Backup-Sequenz noch nicht bestätigt waren, und so einen konsistenten Zustand zu erzielen.

# Vorbereitung abschließen (kein --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# WICHTIG: Auf die endgültige Bestätigung warten, die 'xtrabackup: Recovery completed OK!' anzeigt

Wiederherstellungsphase 4: Daten zurück nach MySQL kopieren

Nach erfolgreicher Vorbereitung sind die Daten im Staging-Verzeichnis ($RESTORE_TARGET) konsistent und können vom MySQL-Server verwendet werden.

  1. MySQL-Dienst stoppen.
  2. Stellen Sie sicher, dass das MySQL-Datenverzeichnis leer oder gesichert ist (optional: verwenden Sie die Option --move-back, falls zulässig, aber --copy-back ist für die Wiederherstellung sicherer).
  3. Verwenden Sie xtrabackup --copy-back, um die Dateien zu verschieben.
  4. Berechtigungen korrigieren.
  5. MySQL neu starten.
# MySQL-Dienst stoppen
service mysql stop

# Vorbereitete Dateien zurück in das MySQL-Datenverzeichnis kopieren
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# Korrekte Berechtigungen für die Dateien sicherstellen
chown -R mysql:mysql /var/lib/mysql

# MySQL starten
service mysql start

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 das aktuellste Backup-Verzeichnis dynamisch identifizieren, das für das Flag --incremental-basedir verwendet werden soll.

Aufbewahrungsrichtlinie

Inkrementelle Ketten können sehr lang werden, was die Wiederherstellung verlangsamt. Eine gängige Best Practice ist die Grandfather-Father-Son (GFS)-Strategie oder die Verwendung differentieller inkrementeller Backups (bei denen alle Inkremente auf das vollständige Basis-Backup verweisen). Führen Sie periodisch ein neues vollständiges Backup durch, um eine neue, kurze Kette zu starten.

Komprimierung und Drosselung

Für sehr stark ausgelastete Server sollten Sie die Option --throttle während der Backup-Phase verwenden, um E/A-Vorgänge zu begrenzen. Verwenden Sie --compress, um die Backup-Größe zu reduzieren, was für die kleineren Datensätze, die von inkrementellen Backups generiert werden, sehr vorteilhaft ist.

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

Überprüfung und Überwachung

Testen Sie Ihre Wiederherstellungsverfahren immer 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.