Configurando Backups Incrementais do MySQL com o Percona XtraBackup

Domine a arte de backups MySQL de alta eficiência usando snapshots incrementais do Percona XtraBackup (PXB). Este guia completo detalha os passos cruciais para configurar, executar e restaurar backups incrementais sequenciais baseados no rastreamento LSN. Aprenda a realizar o backup de base completo inicial, a encadear corretamente os incrementos subsequentes usando `--incremental-basedir`, e a navegar pelo processo de restauração multifásico, garantindo tempo de inatividade mínimo e gerenciamento de armazenamento ideal para grandes bases de dados.

49 visualizações

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, o from_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-dir deve estar vazio ou não existente ao iniciar o processo de backup. Sempre use credenciais com permissões apropriadas (por exemplo, privilégios RELOAD, 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.

  1. Pare o serviço MySQL.
  2. Certifique-se de que o diretório de dados do MySQL esteja vazio ou tenha sido feito backup (opcional: use a opção --move-back se permitido, mas --copy-back é mais seguro para recuperação).
  3. Use xtrabackup --copy-back para mover os arquivos.
  4. Corrija as permissões.
  5. 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.