Recuperação para um ponto no tempo
Restaure para qualquer momento usando WAL.
Recuperação para um ponto no tempo é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O que é a recuperação para um ponto no tempo
A recuperação para um ponto no tempo (PITR) permite restaurar um banco de dados para qualquer momento específico no passado, e não apenas para o momento do último instantâneo de cópia de segurança.
Isso é possível porque o PostgreSQL grava continuamente cada alteração em um fluxo chamado registro de gravação antecipada (WAL). Ao reproduzir os registros WAL sobre uma cópia de segurança de base, você pode chegar exatamente ao ponto necessário.
O registro de gravação antecipada (WAL)
Cada instrução INSERT, UPDATE, DELETE e DDL é primeiro gravada no WAL antes de alterar os arquivos de dados reais. Isso garante a durabilidade mesmo que o servidor falhe durante uma gravação.
Para PITR, os segmentos de WAL arquivados são as fitas da máquina do tempo. A cópia de segurança de base é o ponto de partida; o WAL preenche tudo o que aconteceu depois dela.
-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;Ativando o arquivamento de WAL
Antes que PITR seja possível, o arquivamento de WAL deve ser ativado em postgresql.conf. Os parâmetros principais são wal_level, archive_mode e archive_command.
O comando de arquivamento copia cada segmento de WAL concluído para um local seguro, como um diretório local, uma montagem NFS ou um compartimento de armazenamento na nuvem.
-- View current WAL and archive settings
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'wal_level',
'archive_mode',
'archive_command',
'archive_status'
)
ORDER BY name;Criando uma cópia de segurança de base
Uma cópia de segurança de base é uma cópia consistente de todo o diretório de dados, criada enquanto o servidor está em execução. O PostgreSQL fornece o utilitário pg_basebackup e as funções SQL de baixo nível para coordenar esse processo.
A cópia de segurança, combinada com os segmentos de WAL arquivados registrados desde o momento de início da cópia, é tudo de que você precisa para PITR.
-- Check the latest base backup information
SELECT backup_start,
backup_end,
pg_size_pretty(backup_total) AS total_size
FROM pg_stat_basebackup;Definindo o momento-alvo da recuperação
Quando ocorre um desastre, o primeiro passo é identificar o carimbo de data e hora exato para o qual deseja restaurar. Uma abordagem comum é encontrar o carimbo imediatamente anterior ao evento prejudicial, como um DELETE em massa acidental.
Tabelas de registro de transações ou registros da aplicação geralmente contêm esse carimbo. O próprio WAL registra carimbos de confirmação quando track_commit_timestamp está ativado.
-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM pg_stat_activity
WHERE state = 'idle'
LIMIT 10;Parâmetros de recovery.conf / de recuperação
O comportamento da recuperação é controlado por parâmetros colocados em postgresql.conf (PostgreSQL 12+) ou no antigo arquivo recovery.conf. Os mais importantes são:
restore_command— como buscar segmentos de WAL arquivadosrecovery_target_time— o carimbo exato em que pararrecovery_target_action— o que fazer quando o alvo for alcançado (promote,pause,shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM pg_settings
WHERE name IN (
'restore_command',
'recovery_target_time',
'recovery_target_action',
'recovery_target_inclusive'
)
ORDER BY name;Outros tipos de alvo de recuperação
O tempo não é a única forma de definir um alvo de recuperação. O PostgreSQL é compatível com quatro tipos de alvo:
recovery_target_time— uma cadeia de caracteres de marca temporalrecovery_target_xid— um ID de transação específicorecovery_target_lsn— um número de sequência do WALrecovery_target_name— um ponto de restauração nomeado criado compg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;Simulando o desastre
Para praticar o PITR em um ambiente de teste, corrompa ou exclua dados intencionalmente depois de anotar a hora atual. Isso permite verificar se a recuperação chega ao momento correto e se as linhas excluídas retornam.
-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;
-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';
-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;Realizando a recuperação
A recuperação envolve três etapas:
- Pare a instância do PostgreSQL em execução.
- Restaure a cópia de segurança de base no diretório de dados.
- Configure os parâmetros de recuperação e inicie o PostgreSQL no modo de recuperação — ele reproduzirá o WAL até atingir a hora-alvo e, então, será promovido a um servidor normal de leitura e gravação.
Os registros do servidor mostram cada arquivo WAL sendo aplicado, o que facilita acompanhar o progresso.
-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
pg_last_xact_replay_timestamp() AS last_replayed_txn;Verificando a recuperação
Assim que o servidor for promovido, verifique se os dados estão no estado esperado. Confira as contagens de linhas, as marcas temporais das linhas mais recentes e quaisquer valores essenciais para o negócio.
É recomendável executar essas consultas de verificação antes de permitir o retorno do tráfego da aplicação, para que você possa prosseguir ou ajustar a hora-alvo, se necessário.
-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders' AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items' AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers' AS tbl, COUNT(*) AS rows FROM customers
ORDER BY tbl;Melhores práticas de PITR
Uma configuração de PITR confiável exige mais do que simplesmente ativar o arquivamento. As principais práticas incluem:
- Teste as restaurações regularmente — uma cópia de segurança não testada não é uma cópia de segurança.
- Monitore o atraso do arquivamento do WAL — lacunas no WAL arquivado impossibilitam a recuperação completa.
- Mantenha um histórico suficiente do WAL — mantenha os segmentos pelo menos até o ponto correspondente à sua cópia de segurança de base válida mais antiga.
- Use um local de armazenamento separado — se o disco principal falhar, o WAL arquivado no mesmo disco também será perdido.
-- Check for any WAL archiving failures
SELECT archived_count,
failed_count,
last_archived_wal,
last_archived_time,
last_failed_wal,
last_failed_time
FROM pg_stat_archiver;Verificação rápida
Teste sua compreensão da recuperação em um ponto no tempo.
Recapitulação: recuperação em um ponto no tempo
Nesta lição, você aprendeu como o registro de gravação antecipada do PostgreSQL possibilita a recuperação a qualquer momento passado:
- O arquivamento do WAL captura todas as alterações feitas após uma cópia de segurança de base.
- Os alvos de recuperação podem ser uma marca temporal, um ID de transação, um LSN ou um ponto de restauração nomeado.
- O processo de recuperação restaura a cópia de segurança de base, reproduz o WAL arquivado e promove o servidor quando o alvo é alcançado.
- A verificação confirma a integridade dos dados antes de reabrir o acesso ao tráfego.
- As melhores práticas incluem testes regulares de restauração, monitoramento do arquivamento e armazenamento externo do WAL.
O PITR é sua rede de segurança contra erros humanos e corrupção de dados — domine-o e você dominará a recuperação de desastres.
Perguntas Frequentes
A aula “Recuperação para um ponto no tempo” é grátis?
Sim — o texto completo de “Recuperação para um ponto no tempo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Recuperação para um ponto no tempo”?
Restaure para qualquer momento usando WAL. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Recuperação para um ponto no tempo”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Backups lógicos versus físicos
- Recuperação para um ponto no tempo
- Testando suas restaurações
- Planejamento de Recuperação de Desastres