Configurando Backups Incrementais do MySQL com Percona XtraBackup

Construa e restaure backups incrementais do MySQL com Percona XtraBackup, incluindo backups completos, encadeamento LSN, etapas de preparação e cópia de volta.

Configurando Backups Incrementais do MySQL com Percona XtraBackup

O Percona XtraBackup (PXB) pode fazer backups a quente de servidores compatíveis com MySQL que possuem dados InnoDB. Backups completos são simples, mas bancos de dados grandes geralmente precisam de backups incrementais do MySQL para que você não esteja copiando as mesmas páginas todas as noites.

Este guia aborda os comandos para um backup base completo, backups incrementais encadeados e a sequência de restauração que aplica cada incremental em ordem.

Entendendo o Mecanismo Incremental do Percona XtraBackup

O PXB depende do funcionamento interno do mecanismo de armazenamento InnoDB, especificamente rastreando alterações usando o Número de Sequência de Log (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 que o LSN registrado no momento do backup anterior.

Crucialmente, 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 (Número de Sequência de Log): 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 alcançado no final do backup) e, para backups incrementais, o from_lsn (o LSN inicial).
  • --incremental-basedir: A flag essencial usada durante 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.

Comece definindo um diretório claro para o backup completo:

# Defina o diretório base para o backup completo
BASE_DIR="/data/backups/2023-10-01_FULL"

# Crie o diretório
mkdir -p $BASE_DIR

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

# Verifique o LSN do backup completo
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'

Nota: O target-dir deve estar vazio ou não existir ao iniciar o processo de backup. Os privilégios necessários variam de acordo com a versão do MySQL e do XtraBackup, então crie um usuário de backup dedicado usando as orientações de privilégios atuais da Percona em vez de reutilizar o root.

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 mudaram desde aquele ponto.

# Defina o diretório para o primeiro backup incremental
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"

# Execute o backup incremental, referenciando o backup base completo
xtrabackup --backup \
  --target-dir=$INCREMENTAL_1_DIR \
  --incremental-basedir=/data/backups/2023-10-01_FULL \
  --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 baseado nas alterações desde o INC1:

# Defina o diretório para o segundo backup incremental
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"

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

Este encadeamento continua enquanto você mantiver a sequência. Se algum elo da cadeia for quebrado (ou seja, um diretório estiver faltando), o processo de restauração falhará.

Restauração: Aplicando Alterações Incrementais

Restaurar um conjunto de backups incrementais é um processo de várias etapas que envolve aplicar as alterações sequencialmente ao backup base. Diferente de um backup completo, 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 realiza duas ações essenciais:

  1. Aplica transações confirmadas (o log de refazer).
  2. Reverte transações não confirmadas.

Usamos a flag --prepare, mas, crucialmente, 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.

# Defina o diretório de preparação
RESTORE_TARGET="/data/restore_staging"

# Copie os arquivos do backup base completo para a área de preparação
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# Prepare o backup base, mantendo-o pronto para incrementos
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# Procure pela 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 feitos. 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.

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

# Aplique o Incremental 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-03_INC2 \
  --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.

# Finalize a preparação (sem --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# IMPORTANTE: Procure pela confirmação final que indica 'xtrabackup: Recovery completed OK!'

Fase de Restauração 4: Copiando os 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 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.
# Pare o serviço MySQL
sudo systemctl stop mysql

# Copie os arquivos preparados de volta para o diretório de dados do MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# Garanta a propriedade adequada dos arquivos
sudo chown -R mysql:mysql /var/lib/mysql

# Inicie o MySQL
sudo systemctl start mysql

Melhores Práticas para Gerenciamento de Backups Incrementais

Automação e Scripts

Estratégias de backup incremental são mais eficazes quando totalmente automatizadas. Scripts devem gerenciar o encadeamento LSN automaticamente, identificando dinamicamente o diretório de backup mais recente para usar na flag --incremental-basedir.

Política de Retenção

Cadeias incrementais podem se tornar muito longas, tornando a restauração lenta e frágil. Periodicamente, renove a cadeia fazendo um novo backup completo. Algumas equipes também mantêm backups completos semanais e mensais sob um modelo de retenção Avô-Pai-Filho.

Compressão e Limitação

Para servidores muito ocupados, considere usar a opção --throttle durante a fase de backup para limitar 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 \
  --target-dir=$INCREMENTAL_3_DIR \
  --incremental-basedir=$INCREMENTAL_2_DIR \
  --compress \
  --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.

Conclusão

O XtraBackup incremental funciona apenas quando a cadeia está intacta: backup completo, primeiro incremental baseado no backup completo, e então cada incremental posterior baseado no backup anterior. Durante a restauração, prepare a base com --apply-log-only, aplique cada incremental em ordem, execute uma preparação final sem --apply-log-only, e só então copie os dados preparados de volta para o MySQL.