Configurazione dei backup incrementali MySQL con Percona XtraBackup
Costruisci e ripristina backup incrementali MySQL con Percona XtraBackup utilizzando backup completi, concatenamento LSN, fasi di preparazione e copy-back.
Configurazione dei backup incrementali MySQL con Percona XtraBackup
Percona XtraBackup (PXB) può eseguire backup a caldo di server compatibili con MySQL che utilizzano InnoDB. I backup completi sono semplici, ma i database di grandi dimensioni spesso necessitano di backup incrementali MySQL per non copiare le stesse pagine ogni notte.
Questa guida copre i comandi per un backup completo di base, backup incrementali concatenati e la sequenza di ripristino che applica ogni incrementale in ordine.
Comprendere il meccanismo incrementale di Percona XtraBackup
PXB si basa sul funzionamento interno del motore di archiviazione InnoDB, in particolare monitorando le modifiche utilizzando il Log Sequence Number (LSN). Ogni pagina InnoDB è contrassegnata con un LSN. Quando PXB esegue un backup incrementale, registra solo quelle pagine il cui LSN è maggiore dell'LSN registrato al momento del backup precedente.
Fondamentalmente, i backup incrementali richiedono un backup completo di base per stabilire il punto di partenza. Tutti i backup incrementali successivi sono concatenati, facendo riferimento al backup immediatamente precedente (che può essere il backup di 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 contenente
to_lsn(l'LSN raggiunto alla fine del backup) e, per i backup incrementali,from_lsn(l'LSN di partenza). --incremental-basedir: Il flag essenziale utilizzato durante le esecuzioni incrementali, che indica a PXB la directory del backup precedente (che determina l'LSN di partenza).
Passo 1: Esecuzione del backup completo di base
Prima di effettuare qualsiasi snapshot incrementale, è necessario creare un backup completo di base coerente. Questo stabilisce le fondamenta per l'intera catena di backup.
Inizia definendo una directory chiara per il backup completo:
# Definisci la directory di base per il backup completo
BASE_DIR="/data/backups/2023-10-01_FULL"
# Crea la directory
mkdir -p $BASE_DIR
# Esegui il backup completo
xtrabackup --backup \
--target-dir=$BASE_DIR \
--user=root --password=secret_password \
--datadir=/var/lib/mysql
# Verifica l'LSN del backup completo
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'
Nota: La
target-dirdeve essere vuota o inesistente all'avvio del processo di backup. I privilegi richiesti variano a seconda della versione di MySQL e XtraBackup, quindi crea un utente di backup dedicato utilizzando le linee guida attuali sui privilegi di Percona invece di riutilizzareroot.
Passo 2: Esecuzione del primo backup incrementale
Per eseguire il primo backup incrementale, dobbiamo fare riferimento alla directory del backup completo di base utilizzando il flag --incremental-basedir. PXB leggerà il to_lsn dal backup di base e copierà solo le pagine che sono cambiate da quel punto.
# Definisci la directory per il primo backup incrementale
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"
# Esegui il backup incrementale, facendo riferimento al backup completo di base
xtrabackup --backup \
--target-dir=$INCREMENTAL_1_DIR \
--incremental-basedir=/data/backups/2023-10-01_FULL \
--user=root --password=secret_password
Passo 3: Concatenamento dei backup incrementali successivi
Per qualsiasi backup incrementale successivo (INC2, INC3, ecc.), il --incremental-basedir deve puntare alla directory del backup incrementale immediatamente precedente.
Se vogliamo creare INC2 basato sulle modifiche successive a INC1:
# Definisci la directory per il secondo backup incrementale
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"
# Esegui il backup incrementale, facendo riferimento al precedente incrementale (INC1)
xtrabackup --backup \
--target-dir=$INCREMENTAL_2_DIR \
--incremental-basedir=/data/backups/2023-10-02_INC1 \
--user=root --password=secret_password
Questo concatenamento continua finché mantieni la sequenza. Se un qualsiasi anello della catena viene interrotto (cioè una directory mancante), il processo di ripristino fallirà.
Ripristino: Applicazione delle modifiche incrementali
Il ripristino di un set di backup incrementali è un processo in più fasi che prevede l'applicazione sequenziale delle modifiche al backup di 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 di base
Innanzitutto, il backup di base deve essere preparato. Questo viene tipicamente fatto in un'area di staging temporanea per garantire la sicurezza dei dati.
Quando si prepara il backup di base, PXB esegue due azioni essenziali:
- Applica le transazioni committate (il redo log).
- Esegue il rollback delle transazioni non committate.
Usiamo il flag --prepare, ma, criticamente, aggiungiamo il flag --apply-log-only. Questo impedisce a PXB di eseguire il rollback delle transazioni non committate, necessario perché i log incrementali successivi necessitano di quei frammenti di transazione per completare il ripristino.
# Definisci la directory di staging
RESTORE_TARGET="/data/restore_staging"
# Copia i file del backup completo di base nell'area di staging
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET
# Prepara il backup di base, mantenendolo pronto per gli incrementi
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only
# Cerca conferma: 'completed OK!'
Fase di ripristino 2: Applicazione sequenziale dei backup incrementali
Successivamente, applica ogni backup incrementale nell'esatto ordine cronologico in cui sono stati effettuati. Ogni comando deve fare riferimento alla directory di staging (il backup di base attualmente in modifica) e utilizzare il flag --incremental-dir che punta allo snapshot incrementale specifico.
# Applica Incrementale 1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
--incremental-dir=/data/backups/2023-10-02_INC1 \
--apply-log-only
# Applica Incrementale 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
--incremental-dir=/data/backups/2023-10-03_INC2 \
--apply-log-only
# ... continua per tutti gli incrementi necessari ...
Fase di ripristino 3: Finalizzazione della preparazione
Una volta applicato l'ultimo snapshot incrementale desiderato, esegui il passo finale di preparazione senza il flag --apply-log-only. Questo permette a PXB di eseguire la pulizia finale, eseguendo il rollback di tutte le transazioni ancora non committate nell'intera sequenza di backup, ottenendo uno stato coerente.
# Finalizza la preparazione (senza --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET
# IMPORTANTE: Cerca la conferma finale che indica 'xtrabackup: Recovery completed OK!'
Fase di ripristino 4: Copia dei dati di nuovo in MySQL
Dopo una preparazione riuscita, i dati nella directory di staging ($RESTORE_TARGET) sono coerenti e pronti per essere utilizzati dal server MySQL.
- Ferma il servizio MySQL.
- Assicurati che la directory dei dati di MySQL sia vuota o sia stata sottoposta a backup (opzionale: usa l'opzione
--move-backse consentito, ma--copy-backè più sicuro per il ripristino). - Usa
xtrabackup --copy-backper spostare i file. - Correggi i permessi.
- Riavvia MySQL.
# Ferma il servizio MySQL
sudo systemctl stop mysql
# Copia i file preparati nella directory dei dati di MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET
# Assicura la corretta proprietà dei file
sudo chown -R mysql:mysql /var/lib/mysql
# Avvia MySQL
sudo systemctl start mysql
Best practice per la gestione dei backup incrementali
Automazione e scripting
Le strategie di backup incrementale sono più efficaci quando completamente automatizzate. Gli script dovrebbero gestire automaticamente il concatenamento 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, rendendo il ripristino lento e fragile. Periodicamente, rinnova la catena effettuando un nuovo backup completo. Alcuni team mantengono anche backup completi settimanali e mensili secondo un modello di conservazione Nonno-Padre-Figlio.
Compressione e limitazione
Per server molto occupati, considera l'uso dell'opzione --throttle durante la fase di backup per limitare le operazioni I/O. Usa --compress per ridurre la dimensione del backup, particolarmente vantaggioso per i set di dati più piccoli generati dai backup incrementali.
# Esempio con compressione e limitazione
xtrabackup --backup \
--target-dir=$INCREMENTAL_3_DIR \
--incremental-basedir=$INCREMENTAL_2_DIR \
--compress \
--throttle=100
Verifica e monitoraggio
Testa sempre regolarmente le tue procedure di ripristino. Un backup che non può essere ripristinato è inutile. Monitora lo spazio su disco consumato dalla tua catena incrementale, specialmente prima di avviare un nuovo backup completo di base.
Conclusione
XtraBackup incrementale funziona solo quando la catena è intatta: backup completo, primo incrementale basato sul backup completo, poi ogni incrementale successivo basato sul backup precedente. Durante il ripristino, prepara il backup di base con --apply-log-only, applica ogni incrementale in ordine, esegui una preparazione finale senza --apply-log-only, e solo allora copia i dati preparati di nuovo in MySQL.