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, ilfrom_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, privilegiRELOAD,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.
- Arrestare il servizio MySQL.
- Assicurarsi che la directory dei dati MySQL sia vuota o sottoposta a backup (opzionale: utilizzare l'opzione
--move-backse consentito, ma--copy-backè più sicuro per il recupero). - Utilizzare
xtrabackup --copy-backper spostare i file. - Correggere le autorizzazioni.
- 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.