Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

Para engenheiros de DevOps e administradores de sistemas, os snapshots de máquinas virtuais (VM) são uma ferramenta fundamental. Eles oferecem uma maneira rápida e conveniente de capturar o estado de um servidor antes de um patch arriscado, uma grande mudança de configuração ou uma implantação de aplicativo. Se algo der errado, a reversão leva segundos.

No entanto, quando essa mesma metodologia é aplicada a bancos de dados transacionais — como PostgreSQL, MySQL, Oracle ou Microsoft SQL Server — os snapshots de VM se transformam de uma rede de segurança em uma bomba-relógio.

Confiar em snapshots de hipervisor padrão para backups de banco de dados é uma das causas mais comuns de corrupção de dados, páginas corrompidas (torn pages) e interrupções de produção irrecuperáveis. Neste artigo, exploraremos o conflito arquitetural entre hipervisores e mecanismos de banco de dados, a mecânica da corrupção de dados durante snapshots e as melhores práticas de engenharia necessárias para fazer backup de bancos de dados virtualizados com segurança.

O Conflito de Arquitetura: Hipervisores vs. Mecanismos de Banco de Dados

Para entender por que os snapshots de VM colocam os bancos de dados em risco, devemos primeiro examinar como ambos os sistemas gerenciam o estado e as operações de E/S (I/O).

Como os Hipervisores Executam Snapshots

Quando um hipervisor (como VMware ESXi, Microsoft Hyper-V ou KVM) tira um snapshot, ele não copia o disco. Em vez disso, ele congela o arquivo de disco virtual atual (por exemplo, .vmdk ou .vhdx) em um estado somente leitura e cria um novo disco delta (disco de diferenciação). Todas as gravações subsequentes são direcionadas para esse disco delta.

Quando o snapshot é excluído, o hipervisor deve confirmar (consolidar) os dados do disco delta de volta para o disco base. Snapshots padrão não têm conhecimento algum dos aplicativos em execução dentro do sistema operacional convidado. Eles capturam o estado do disco exatamente como ele existe naquele microssegundo.

Como os Bancos de Dados Transacionais Gerenciam o Estado

Bancos de dados transacionais são projetados em torno das propriedades ACID (Atomicidade, Consistência, Isolamento, Durabilidade). Para obter alto desempenho mantendo a conformidade ACID, os bancos de dados não gravam cada transação diretamente nos arquivos de dados primários no disco imediatamente. Em vez disso, eles usam uma arquitetura complexa de várias camadas:

  1. Buffer Pool / Shared Buffers: Os dados são lidos e modificados na memória do sistema.
  2. Write-Ahead Log (WAL) / Redo Logs: As alterações são gravadas sequencialmente em um arquivo de log altamente otimizado no disco para garantir a durabilidade.
  3. Checkpoints / Lazy Writers: Periodicamente, o banco de dados libera as páginas modificadas (sujas) da memória para os arquivos de dados reais no disco.

Devido a essa arquitetura, os arquivos de dados físicos no disco estão quase sempre fora de sincronia com o estado real do banco de dados. O verdadeiro estado do banco de dados existe apenas como uma combinação dos arquivos de dados no disco, dos logs WAL/Redo e dos dados que residem atualmente na memória.

A Zona de Perigo: O que Acontece Durante um Snapshot de VM

Ao tirar um snapshot de VM padrão de um servidor de banco de dados, você está capturando um estado de consistência de falha (crash-consistent).

Consistência de Falha vs. Consistência de Aplicativo

Um snapshot com consistência de falha é o equivalente a puxar o cabo de força do servidor físico. O estado do disco é capturado, mas o que estava na memória é perdido, e o que estava em trânsito para o controlador de armazenamento é abruptamente cortado.

Embora os bancos de dados modernos sejam projetados para se recuperar de perda inesperada de energia reproduzindo o Write-Ahead Log, confiar na recuperação de falhas como sua estratégia principal de backup é altamente perigoso. Se o seu banco de dados abranger vários discos virtuais (por exemplo, arquivos de dados na Unidade D: e WAL na Unidade E:), o hipervisor pode não tirar o snapshot de ambos os discos no mesmo microssegundo exato. Se o snapshot do disco WAL for capturado apenas uma fração de segundo após o snapshot do disco de dados, o banco de dados não conseguirá reconciliar os números de sequência na restauração, resultando em corrupção fatal.

O Efeito “VM Stun” em Sistemas de Alta Transação

O processo de criação de snapshot — e, mais importante, o processo de consolidação de snapshot — causa um fenômeno conhecido como “VM Stun” (travamento da VM).

Para alternar a E/S do disco base para o disco delta com segurança, o hipervisor deve pausar brevemente (travar) a máquina virtual. Para um servidor web com pouca carga, esse travamento pode durar de 10 a 50 milissegundos e passar despercebido. No entanto, para um banco de dados de alto rendimento com E/S massiva, consolidar um grande disco delta pode travar a VM por vários segundos.

Durante um VM stun:
* As conexões de rede caem, causando timeouts de aplicativos.
* Clusters de alta disponibilidade (como SQL Server Always On, PostgreSQL Patroni ou MySQL Galera) perdem as verificações de heartbeat.
* O cluster pode assumir que o nó travado está morto, acionando um failover desnecessário e disruptivo (cenário de split-brain).

Páginas Corrompidas (Torn Pages) e Desalinhamento de E/S

Os mecanismos de banco de dados normalmente gravam dados em tamanhos de página específicos (por exemplo, 8 KB para PostgreSQL e SQL Server, 16 KB para InnoDB). No entanto, o sistema operacional subjacente e as matrizes de armazenamento processam E/S em blocos menores (por exemplo, 4 KB ou 512 bytes).

Se um hipervisor tirar um snapshot exatamente enquanto o banco de dados está gravando uma página de 8 KB, o snapshot pode capturar os primeiros 4 KB dos novos dados e os últimos 4 KB dos dados antigos. Isso cria uma página corrompida (torn page). Quando você tentar restaurar o snapshot, o banco de dados lerá a página, falhará na validação da soma de verificação (checksum) e marcará o banco de dados como corrompido.

Consequências no Mundo Real para Mecanismos de Banco de Dados Específicos

Diferentes mecanismos de banco de dados reagem a snapshots com consistência de falha de várias maneiras, mas nenhum deles lida com isso de forma elegante em um ambiente de produção.

  • PostgreSQL: O PostgreSQL depende fortemente do diretório pg_wal. Se um snapshot capturar o diretório de dados ($PGDATA) e o WAL fora de sincronia, o PostgreSQL falhará ao iniciar, exibindo um erro PANIC: could not locate a valid checkpoint record.
  • MySQL/InnoDB: O InnoDB usa um doublewrite buffer para evitar páginas corrompidas, o que oferece alguma proteção contra estados de consistência de falha. No entanto, se o arquivo ibdata1 e o ib_logfile forem capturados fora de sincronia, o mecanismo InnoDB travará na recuperação.
  • Microsoft SQL Server: O SQL Server é altamente sensível ao congelamento de E/S. Sem a integração adequada com o VSS (Volume Shadow Copy Service), restaurar um SQL Server a partir de um snapshot de VM padrão resultará frequentemente em bancos de dados suspeitos e cadeias de log quebradas, destruindo suas capacidades de Recuperação para um Ponto no Tempo (PITR).

Melhores Práticas para Fazer Backup de Bancos de Dados Virtualizados com Segurança

Para proteger bancos de dados transacionais, você deve migrar de backups com consistência de falha para backups com consistência de aplicativo. Isso exige que o mecanismo de backup se comunique com o mecanismo de banco de dados, forçando-o a liberar a memória para o disco e pausar as operações de E/S momentaneamente enquanto o snapshot é realizado.

1. Aproveite o Quiescing com Reconhecimento de Aplicativo (VSS e fsfreeze)

Para Windows (SQL Server):
Sempre garanta que sua solução de backup utilize o Microsoft Volume Shadow Copy Service (VSS). Quando um backup com reconhecimento de VSS é acionado, o VSS Writer do SQL Server congela a E/S do banco de dados, libera transações pendentes para o disco e garante que o snapshot seja perfeitamente consistente com o aplicativo.

Para Linux (PostgreSQL / MySQL):
O Linux não possui um equivalente nativo ao VSS. Para obter consistência de aplicativo, você deve usar scripts de pré-congelamento (pre-freeze) e pós-descongelamento (post-thaw) em conjunto com as ferramentas de convidado do hipervisor (por exemplo, VMware Tools).

Aqui está um exemplo de um pre-freeze-script do VMware para PostgreSQL 15+ que prepara o banco de dados com segurança para um snapshot:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# Certifique-se de que este script seja executável (chmod +x)

# 1. Diga ao PostgreSQL para se preparar para um backup
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. Libere os buffers do sistema de arquivos para o disco
sync

# 3. Congele o sistema de arquivos (assumindo que os dados estão em /var/lib/pgsql)
fsfreeze -f /var/lib/pgsql

E o post-thaw-script correspondente para retomar as operações:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. Descongele o sistema de arquivos
fsfreeze -u /var/lib/pgsql

# 2. Diga ao PostgreSQL que o backup foi concluído
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. Use Utilitários de Backup Nativos do Banco de Dados

Embora snapshots com consistência de aplicativo sejam melhores que snapshots padrão, eles ainda carregam o risco de VM stun. A abordagem mais segura para backups de banco de dados é usar utilitários de backup de streaming nativos que operam independentemente do hipervisor.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
Essas ferramentas realizam backups a quente (hot backups), sem bloqueio, copiando os arquivos de dados e rastreando simultaneamente as alterações no redo log.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. Implemente a Recuperação para um Ponto no Tempo (PITR) via Arquivamento de Log

Um snapshot diário ou backup completo protege você apenas até o minuto em que foi realizado. Se o seu banco de dados travar às 16:00 e seu último snapshot foi às 02:00, você perde 14 horas de dados transacionais.

Para obter verdadeira resiliência empresarial, você deve combinar backups completos com consistência de aplicativo com arquivamento contínuo de logs (fazendo backup do WAL, Redo Logs ou Transaction Logs a cada poucos minutos). Isso permite que os DBAs restaurem o banco de dados para um minuto específico ou até mesmo para um ID de transação específico antes de um desastre.

Estratégias de Backup Empresarial com CloudSave

Gerenciar scripts de pré-congelamento personalizados, tarefas cron para dumps nativos e envio de logs em dezenas de servidores de banco de dados é um pesadelo operacional para equipes de DevOps. É aqui que uma plataforma de nível empresarial como o CloudSave se torna crítica.

O CloudSave preenche a lacuna entre a virtualização e a arquitetura de banco de dados. Em vez de confiar em snapshots cegos do hipervisor, o CloudSave utiliza agentes com reconhecimento de aplicativo que se integram nativamente ao SQL Server, PostgreSQL, MySQL e Oracle.

Quando o CloudSave inicia um backup:
1. Ele se comunica diretamente com o mecanismo de banco de dados via APIs nativas (como VSS para Windows ou streaming de WAL nativo para Linux).
2. Ele orquestra a liberação dos buffers de memória para o disco sem causar travamentos disruptivos na VM.
3. Ele captura com segurança os arquivos de dados e gerencia automaticamente o truncamento dos logs de transação.
4. Ele faz backup contínuo dos logs de transação, permitindo a Recuperação para um Ponto no Tempo (PITR) granular com poucos cliques.

Ao transferir a complexidade da consistência de aplicativo para o CloudSave, DBAs e administradores de sistemas podem garantir a integridade dos dados sem sacrificar o desempenho ou a disponibilidade de seus clusters de produção.

Conclusão

Snapshots de máquinas virtuais são uma ferramenta incrível para o gerenciamento de infraestrutura, mas são fundamentalmente incompatíveis com os requisitos ACID de bancos de dados transacionais. Confiar em snapshots de hipervisor com consistência de falha expõe sua organização a páginas corrompidas, cadeias de replicação quebradas e perda catastrófica de dados.

Para proteger seus dados de missão crítica, você deve implementar o quiescing com reconhecimento de aplicativo, utilizar metodologias de backup de banco de dados nativas e manter arquivos contínuos de logs de transação. Ao adotar soluções de backup empresarial criadas para esse fim, você pode garantir que seus bancos de dados permaneçam altamente disponíveis, totalmente recuperáveis e completamente seguros.