Configurando Backups Incrementais do MySQL com Percona XtraBackup
Percona XtraBackup (PXB) é o padrão da indústria para a realização de backups a quente e não-bloqueantes de instâncias MySQL, MariaDB e Percona Server. Embora os backups completos sejam essenciais, grandes bancos de dados exigem uma estratégia eficiente para minimizar o tempo de inatividade e o uso de armazenamento. Backups incrementais fornecem essa eficiência ao capturar apenas as alterações de dados que ocorreram desde o último backup bem-sucedido.
Este guia explora como aproveitar o PXB para implementar uma estratégia robusta de backup incremental. Cobriremos os conceitos centrais, os comandos necessários para realizar snapshots incrementais sequenciais e o processo multi-etapas exigido para uma restauração bem-sucedida.
Entendendo o Mecanismo Incremental do Percona XtraBackup
O PXB depende do funcionamento interno do motor de armazenamento InnoDB, especificamente rastreando as alterações usando o Log Sequence Number (LSN). Cada página InnoDB é marcada com um LSN. Quando o PXB realiza um backup incremental, ele registra apenas as páginas cujo LSN é maior do que o LSN registrado no momento do backup anterior.
Crucialmente, os backups incrementais exigem um backup base completo para estabelecer o ponto de partida. Todos os backups incrementais subsequentes são encadeados, referenciando o backup imediatamente anterior (que pode ser o backup base ou outro incremental).
Arquivos e Conceitos Chave
- LSN (Log Sequence Number): O marcador usado para determinar onde as alterações começam e terminam.
- xtrabackup_checkpoints: Um arquivo criado durante cada backup contendo o
to_lsn(o LSN atingido no final do backup) e, para backups incrementais, ofrom_lsn(o LSN inicial). --incremental-basedir: A flag essencial usada durante as execuções incrementais, apontando o PXB para o diretório do backup anterior (que determina o LSN inicial).
Passo 1: Realizando o Backup Base Completo
Antes de tirar qualquer snapshot incremental, um backup base completo e consistente deve ser criado. Isso estabelece a base para toda a cadeia de backups.
Primeiro, definiremos nossa estrutura de diretórios:
# Define o diretório base para o backup completo
BASE_DIR="/data/backups/2023-10-01_FULL"
# Cria o diretório
mkdir -p $BASE_DIR
# Executa o backup completo
xtrabackup --backup \n --target-dir=$BASE_DIR \n --user=root --password=secret_password \n --datadir=/var/lib/mysql
# Verifica o LSN do backup completo
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'
Nota: O
target-dirdeve estar vazio ou não existente ao iniciar o processo de backup. Sempre use credenciais com permissões apropriadas (por exemplo, privilégiosRELOAD,LOCK TABLES,PROCESS,SUPER).
Passo 2: Realizando o Primeiro Backup Incremental
Para realizar o primeiro backup incremental, devemos referenciar o diretório do backup base completo usando a flag --incremental-basedir. O PXB lerá o to_lsn do backup base e copiará apenas as páginas que foram alteradas desde aquele ponto.
# Define o diretório para o primeiro backup incremental
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"
# Executa o backup incremental, referenciando a base completa
xtrabackup --backup \n --target-dir=$INCREMENTAL_1_DIR \n --incremental-basedir=/data/backups/2023-10-01_FULL \n --user=root --password=secret_password
Passo 3: Encadeando Backups Incrementais Subsequentes
Para qualquer backup incremental subsequente (INC2, INC3, etc.), o --incremental-basedir deve apontar para o diretório do backup incremental imediatamente anterior.
Se quisermos criar o INC2 com base nas alterações desde o INC1:
# Define o diretório para o segundo backup incremental
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"
# Executa o backup incremental, referenciando o incremental anterior (INC1)
xtrabackup --backup \n --target-dir=$INCREMENTAL_2_DIR \n --incremental-basedir=/data/backups/2023-10-02_INC1 \n --user=root --password=secret_password
Este encadeamento continua enquanto você mantiver a sequência. Se qualquer elo na cadeia for quebrado (ou seja, um diretório estiver faltando), o processo de restauração falhará.
Restauração: Aplicando Alterações Incrementais
A restauração de um conjunto de backup incremental é um processo multi-etapas que envolve a aplicação das alterações sequencialmente ao backup base. Ao contrário de um backup completo, os backups incrementais não podem ser copiados diretamente para o diretório de dados.
Fase de Restauração 1: Preparando o Backup Base
Primeiro, o backup base deve ser preparado. Isso é tipicamente feito em uma área de preparação temporária para garantir a segurança dos dados.
Ao preparar o backup base, o PXB executa duas ações essenciais:
1. Aplica transações confirmadas (o redo log).
2. Reverte transações não confirmadas.
Usamos a flag --prepare, mas, criticamente, adicionamos a flag --apply-log-only. Isso impede que o PXB reverta transações não confirmadas, o que é necessário porque os logs incrementais subsequentes precisam desses fragmentos de transação para completar a restauração.
# Define diretório de preparação
RESTORE_TARGET="/data/restore_staging"
# Copia os arquivos completos do backup base para a área de preparação
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET
# Prepara o backup base, mantendo-o pronto para incrementos
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only
# Procure a confirmação: 'completed OK!'
Fase de Restauração 2: Aplicando Backups Incrementais Sequencialmente
Em seguida, aplique cada backup incremental na ordem cronológica exata em que foram realizados. Cada comando deve referenciar o diretório de preparação (o backup base atualmente sendo modificado) e usar a flag --incremental-dir apontando para o snapshot incremental específico.
# Aplica o Incremental 1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-02_INC1 \n --apply-log-only
# Aplica o Incremental 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-03_INC2 \n --apply-log-only
# ... continue para todos os incrementos necessários ...
Fase de Restauração 3: Finalizando a Preparação
Uma vez que o último snapshot incremental desejado tenha sido aplicado, execute a etapa final de preparação sem a flag --apply-log-only. Isso permite que o PXB realize a limpeza final, revertendo quaisquer transações que ainda estavam não confirmadas em toda a sequência de backup, resultando em um estado consistente.
# Finaliza a preparação (sem --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET
# IMPORTANTE: Procure a confirmação final que indica 'xtrabackup: Recovery completed OK!'
Fase de Restauração 4: Copiando Dados de Volta para o MySQL
Após a preparação bem-sucedida, os dados no diretório de preparação ($RESTORE_TARGET) estão consistentes e prontos para uso pelo servidor MySQL.
- Pare o serviço MySQL.
- Certifique-se de que o diretório de dados do MySQL esteja vazio ou tenha sido feito backup (opcional: use a opção
--move-backse permitido, mas--copy-backé mais seguro para recuperação). - Use
xtrabackup --copy-backpara mover os arquivos. - Corrija as permissões.
- Reinicie o MySQL.
# Para o serviço MySQL
service mysql stop
# Copia os arquivos preparados de volta para o diretório de dados do MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET
# Garante a propriedade correta para os arquivos
chown -R mysql:mysql /var/lib/mysql
# Inicia o MySQL
service mysql start
Melhores Práticas para Gerenciamento de Backup Incremental
Automação e Scripting
As estratégias de backup incremental são mais eficazes quando totalmente automatizadas. Os scripts devem gerenciar o encadeamento de LSNs automaticamente, identificando dinamicamente o diretório de backup mais recente a ser usado para a flag --incremental-basedir.
Política de Retenção
As cadeias incrementais podem se tornar muito longas, tornando a restauração lenta. Uma boa prática comum é a estratégia Grandfather-Father-Son (GFS) ou backups incrementais diferenciais (onde todos os incrementos referenciam a base completa). Periodicamente, reinicie a cadeia realizando um novo backup completo para iniciar uma cadeia nova e curta.
Compressão e Limitação (Throttling)
Para servidores muito ocupados, considere usar a opção --throttle durante a fase de backup para limitar as operações de E/S. Use --compress para reduzir o tamanho do backup, o que é altamente benéfico para os conjuntos de dados menores gerados por backups incrementais.
# Exemplo com compressão e limitação
xtrabackup --backup \n --target-dir=$INCREMENTAL_3_DIR \n --incremental-basedir=$INCREMENTAL_2_DIR \n --compress \n --throttle=100
Verificação e Monitoramento
Sempre teste seus procedimentos de restauração regularmente. Um backup que não pode ser restaurado é inútil. Monitore o espaço em disco consumido pela sua cadeia incremental, especialmente antes de iniciar um novo backup base completo.