Configurazione dei Backup Incrementali di MySQL con Percona XtraBackup

Padroneggia l'arte dei backup MySQL ad alta efficienza utilizzando le snapshot incrementali di Percona XtraBackup (PXB). Questa guida completa illustra i passaggi cruciali per configurare, eseguire e ripristinare i backup incrementali sequenziali basati sul tracciamento LSN. Impara come eseguire il backup base completo iniziale, concatenare correttamente gli incrementi successivi utilizzando `--incremental-basedir`, e navigare nel processo di ripristino multi-fase, garantendo tempi di inattività minimi e una gestione ottimale dello storage per database di grandi dimensioni.

47 visualizzazioni

Configurazione di Backup MySQL Incrementali con Percona XtraBackup

Percona XtraBackup (PXB) è lo standard di settore per l'esecuzione di backup a caldo e non bloccanti di istanze MySQL, MariaDB e Percona Server. Sebbene i backup completi siano essenziali, i database di grandi dimensioni richiedono una strategia efficiente per ridurre al minimo i tempi di inattività e l'utilizzo dello storage. I backup incrementali offrono questa efficienza acquisendo solo le modifiche ai dati che si sono verificate dall'ultimo backup riuscito.

Questa guida esplora come sfruttare PXB per implementare una robusta strategia di backup incrementale. Tratteremo i concetti fondamentali, i comandi necessari per eseguire snapshot incrementali sequenziali e il processo in più fasi richiesto per un ripristino di successo.

Comprendere il Meccanismo Incrementale di Percona XtraBackup

PXB si basa sul funzionamento interno del motore di storage InnoDB, in particolare tracciando le modifiche utilizzando il Log Sequence Number (LSN). Ogni pagina InnoDB è contrassegnata da un LSN. Quando PXB esegue un backup incrementale, registra solo le pagine il cui LSN è maggiore dell'LSN registrato al momento del backup precedente.

Fondamentalmente, i backup incrementali richiedono un backup base completo per stabilire il punto di partenza. Tutti i successivi backup incrementali sono concatenati, facendo riferimento al backup immediatamente precedente (che può essere il backup base o un altro incrementale).

File e Concetti Chiave

  • LSN (Log Sequence Number): Il marcatore utilizzato per determinare dove iniziano e finiscono le modifiche.
  • xtrabackup_checkpoints: Un file creato durante ogni backup che contiene il to_lsn (l'LSN raggiunto alla fine del backup) e, per i backup incrementali, il from_lsn (l'LSN di partenza).
  • --incremental-basedir: Il flag essenziale utilizzato durante le esecuzioni incrementali, che indirizza PXB alla directory del backup precedente (che determina l'LSN di partenza).

Fase 1: Esecuzione del Backup Base Completo

Prima di eseguire qualsiasi snapshot incrementale, è necessario creare un backup base completo e coerente. Questo stabilisce le fondamenta per l'intera catena di backup.

Definiremo prima la nostra struttura di directory:

# Define the base directory for the full backup
BASE_DIR="/data/backups/2023-10-01_FULL"

# Create the directory
mkdir -p $BASE_DIR

# Execute the full backup
xtrabackup --backup \n  --target-dir=$BASE_DIR \n  --user=root --password=secret_password \n  --datadir=/var/lib/mysql

# Verify the LSN of the full backup
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'

Nota: La target-dir (directory di destinazione) deve essere vuota o inesistente all'avvio del processo di backup. Utilizzare sempre credenziali con autorizzazioni appropriate (ad esempio, privilegi RELOAD, LOCK TABLES, PROCESS, SUPER).

Fase 2: Acquisizione del Primo Backup Incrementale

Per eseguire il primo backup incrementale, dobbiamo fare riferimento alla directory del backup base completo utilizzando il flag --incremental-basedir. PXB leggerà il to_lsn dal backup base e copierà solo le pagine che sono cambiate da quel momento.

# Define the directory for the first incremental backup
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"

# Execute the incremental backup, referencing the full base
xtrabackup --backup \n  --target-dir=$INCREMENTAL_1_DIR \n  --incremental-basedir=/data/backups/2023-10-01_FULL \n  --user=root --password=secret_password

Fase 3: Concatenazione dei Backup Incrementali Successivi

Per qualsiasi backup incrementale successivo (INC2, INC3, ecc.), il flag --incremental-basedir deve puntare alla directory del backup incrementale immediatamente precedente.

Se vogliamo creare INC2 in base alle modifiche avvenute dopo INC1:

# Define the directory for the second incremental backup
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"

# Execute the incremental backup, referencing the previous incremental (INC1)
xtrabackup --backup \n  --target-dir=$INCREMENTAL_2_DIR \n  --incremental-basedir=/data/backups/2023-10-02_INC1 \n  --user=root --password=secret_password

Questa concatenazione continua finché si mantiene la sequenza. Se un collegamento della catena viene interrotto (ovvero, manca una directory), il processo di ripristino fallirà.

Ripristino: Applicazione delle Modifiche Incrementali

Il ripristino di un set di backup incrementale è un processo in più fasi che comporta l'applicazione sequenziale delle modifiche al backup base. A differenza di un backup completo, i backup incrementali non possono essere copiati direttamente nella directory dei dati.

Fase di Ripristino 1: Preparazione del Backup Base

Innanzitutto, il backup base deve essere preparato. Questo viene in genere fatto in un'area di staging temporanea per garantire la sicurezza dei dati.

Durante la preparazione del backup base, PXB esegue due azioni essenziali:
1. Applica le transazioni di cui è stato eseguito il commit (il redo log).
2. Esegue il rollback delle transazioni di cui non è stato eseguito il commit.

Utilizziamo il flag --prepare, ma, fondamentale, aggiungiamo il flag --apply-log-only. Ciò impedisce a PXB di eseguire il rollback delle transazioni non sottoposte a commit, cosa necessaria perché i log incrementali successivi richiedono quei frammenti di transazione per completare il ripristino.

# Define staging directory
RESTORE_TARGET="/data/restore_staging"

# Copy the full base backup files to the staging area
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# Prepare the base backup, keeping it ready for increments
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# Look for confirmation: 'completed OK!'

Fase di Ripristino 2: Applicazione Sequenziale dei Backup Incrementali

Successivamente, applicare ogni backup incrementale nell'esatto ordine cronologico in cui sono stati eseguiti. Ogni comando deve fare riferimento alla directory di staging (il backup base attualmente in fase di modifica) e utilizzare il flag --incremental-dir che punta allo specifico snapshot incrementale.

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

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

# ... continue for all required increments ...

Fase di Ripristino 3: Finalizzazione della Preparazione

Una volta applicato l'ultimo snapshot incrementale desiderato, eseguire il passaggio di preparazione finale senza il flag --apply-log-only. Ciò consente a PXB di eseguire la pulizia finale, annullando tutte le transazioni che erano ancora non sottoposte a commit nell'intera sequenza di backup, ottenendo uno stato coerente.

# Finalize the preparation (no --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# IMPORTANT: Look for the final confirmation that indicates 'xtrabackup: Recovery completed OK!'

Fase di Ripristino 4: Copia dei Dati in MySQL

Dopo la corretta preparazione, i dati nella directory di staging ($RESTORE_TARGET) sono coerenti e pronti per essere utilizzati dal server MySQL.

  1. Arrestare il servizio MySQL.
  2. Assicurarsi che la directory dei dati MySQL sia vuota o sottoposta a backup (opzionale: utilizzare l'opzione --move-back se consentito, ma --copy-back è più sicuro per il recupero).
  3. Utilizzare xtrabackup --copy-back per spostare i file.
  4. Correggere le autorizzazioni.
  5. Riavviare MySQL.
# Stop MySQL service
service mysql stop

# Copy prepared files back to the MySQL data directory
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# Ensure proper ownership for the files
chown -R mysql:mysql /var/lib/mysql

# Start MySQL
service mysql start

Migliori Pratiche per la Gestione dei Backup Incrementali

Automazione e Scripting

Le strategie di backup incrementale sono più efficaci se completamente automatizzate. Gli script dovrebbero gestire automaticamente la concatenazione LSN, identificando dinamicamente la directory di backup più recente da utilizzare per il flag --incremental-basedir.

Politica di Conservazione

Le catene incrementali possono diventare molto lunghe, rallentando il ripristino. Una pratica comune è la strategia Grandfather-Father-Son (GFS) o l'uso di backup incrementali differenziali (dove tutti gli incrementi fanno riferimento al backup base completo). Periodicamente, eseguire un rollover della catena eseguendo un nuovo backup completo per iniziare una catena fresca e breve.

Compressione e Throttling

Per server molto occupati, prendere in considerazione l'utilizzo dell'opzione --throttle durante la fase di backup per limitare le operazioni di I/O. Utilizzare --compress per ridurre le dimensioni del backup, il che è estremamente vantaggioso per i set di dati più piccoli generati dai backup incrementali.

# Example with compression and throttling
xtrabackup --backup \n  --target-dir=$INCREMENTAL_3_DIR \n  --incremental-basedir=$INCREMENTAL_2_DIR \n  --compress \n  --throttle=100

Verifica e Monitoraggio

Testare sempre regolarmente le procedure di ripristino. Un backup che non può essere ripristinato è inutile. Monitorare lo spazio su disco consumato dalla catena incrementale, soprattutto prima di avviare un nuovo backup base completo.