A recuperação de banco PostgreSQL resgata dados de clusters corrompidos, arquivos WAL perdidos e tablespaces que falharam. Além disso, ela funciona em servidores Linux e Windows, com ou sem backup configurado via pg_dump ou pg_basebackup. Neste guia, você entende a estrutura interna do PostgreSQL e como a recuperação atua.
Como o PostgreSQL organiza os dados
O PostgreSQL guarda cada banco em um diretório dentro do data cluster ($PGDATA). Dentro desse diretório, cada relação (tabela, índice) corresponde a um arquivo numérico no subdiretório base/. Dessa forma, localizar os arquivos de uma tabela específica não depende do PostgreSQL estar funcionando.
Além disso, o WAL (Write-Ahead Log) registra todas as alterações antes de gravá-las nos arquivos de dados. Por isso, quando o cluster para de forma abrupta, o WAL permite replicar as transações perdidas e restaurar a consistência.
Quando o PostgreSQL não sobe
O PostgreSQL recusa o início por vários motivos. Em primeiro lugar, arquivos WAL corrompidos ou faltando impedem o recovery automático. Além disso, o arquivo pg_control corrompido ou ausente bloqueia qualquer tentativa de subir o cluster. Por outro lado, tablespaces em volumes desmontados geram erros de caminho inválido.
Contudo, em nenhum desses cenários os dados desaparecem. Portanto, preservar o diretório $PGDATA intacto é o primeiro passo da recuperação.
Recuperação forense por leitura de página
O PostgreSQL organiza os dados em páginas de 8 KB (por padrão), igual ao SQL Server. Cada página carrega tuplas (registros), cabeçalho e informações de versão (MVCC). Dessa forma, o especialista usa ferramentas de leitura direta de página, como o pg_filedump, para extrair registros mesmo sem o servidor rodando.
Em seguida, reconstrói as tabelas em um cluster limpo e exporta os dados em formato utilizável. Além disso, quando o WAL está parcialmente disponível, o especialista aplica as entradas válidas para avançar o banco até o momento mais recente possível.
Perguntas frequentes sobre recuperação PostgreSQL
Cluster com pg_control corrompido tem solução? Sim. O especialista recria o pg_control com os parâmetros corretos e reinicia o recovery. Na maioria dos casos, o cluster sobe em modo de recuperação.
pg_dump ainda funciona com banco corrompido? Às vezes. Se a corrupção afeta poucas tabelas, o pg_dump exporta o restante normalmente. Para tabelas corrompidas, a leitura forense de página é o caminho.
Tablespace em disco separado que falhou perdeu os dados? Não necessariamente. Os dados vivem no disco externo. Portanto, recuperar o disco restaura o acesso ao tablespace.
Conclusão
A recuperação de banco PostgreSQL é viável em quase todos os cenários de falha, desde que o diretório $PGDATA exista. Em resumo, preserve os arquivos, não reinstale o servidor e acione especialistas. Precisa recuperar um banco PostgreSQL? A Crowdertech recupera clusters e WAL por forense de página. Veja também banco de dados corrompido.
Fontes: PostgreSQL Documentation · CERT.br.