Parece que fazer backup é tipo usar guarda-chuva em dia de chuva: você acha que vai te salvar de qualquer perrengue. Mas se o guarda-chuva tem um furo, você vai se molhar do mesmo jeito. Com backup e restauração é igual: se algo der ruim, você pode perder dados ou, pior ainda, acabar com o banco corrompido. Por isso é tão importante entender os erros e como evitar eles.
Problemas na restauração de dados
- Incompatibilidade de versões do PostgreSQL
Um dos problemas mais chatos e comuns é tentar restaurar dados feitos numa versão do PostgreSQL em outra (tipo, tentar restaurar backup da versão 11 na 15). O PostgreSQL não garante compatibilidade retroativa entre versões.
Por que isso rola?
- O formato dos dados pode mudar entre versões.
- Algumas funções e parâmetros podem ser removidos ou alterados.
Como evitar?
- Sempre faça backup usando
pg_dump, e não copiando direto o diretório de dados do PostgreSQL. Opg_dumpgera scripts SQL universais que podem ser restaurados em qualquer versão compatível. - Confere a compatibilidade das versões antes de restaurar. Dá pra achar essa info na documentação oficial do PostgreSQL.
Olha um exemplo. Você fez backup no PostgreSQL 14:
pg_dump -U user -d my_database -f backup.sql
Agora tenta restaurar no PostgreSQL 15:
psql -U user -d my_database -f backup.sql
E recebe erros tipo:
ERROR: unrecognized configuration parameter "old_function"
Solução: atualiza a versão do PostgreSQL no servidor ou usa a ferramenta pg_upgrade pra migrar.
- Falta de arquivos WAL necessários
Às vezes, restaurar o banco de um backup incremental ou diferencial pode falhar do nada — tudo porque faltam arquivos WAL (Write-Ahead Logging). O PostgreSQL depende deles pra "repassar" as mudanças depois do último backup completo. Se esses arquivos sumiram ou estão corrompidos, o banco não consegue terminar a restauração.
Isso acontece, por exemplo, quando o arquivamento dos arquivos WAL não estava ativado, ou alguém apagou a pasta sem querer pra liberar espaço. Então, se você vai usar backups incompletos, ativa o arquivamento no postgresql.conf:
archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'
E não esquece de checar sempre se o arquivamento tá funcionando e se os arquivos estão inteiros e no lugar. É um esforço pequeno pra garantir que a restauração não vai te deixar na mão.
- Backup corrompido
Seu arquivo de backup pode estar corrompido, o que deixa ele inútil pra restauração.
Por que isso rola?
- Integridade do arquivo foi pro saco durante o envio ou armazenamento.
- Falha inesperada durante a criação do backup.
Como evitar?
Usa compressão e checksums pra garantir a integridade do backup. Por exemplo, gera um hash MD5 do arquivo depois de criar:
md5sum backup.sql > backup.sql.md5
Sempre confere o arquivo de backup antes de restaurar:
md5sum -c backup.sql.md5
Problema e solução
Você tenta restaurar um arquivo corrompido:
pg_restore -U user -d my_database backup.dump
E vê isso:
pg_restore: fatal error: input file appears to be a text file, but you are using the 'pg_restore' command-line tool; try using psql instead
Solução: tenta abrir o arquivo num editor de texto e vê se ele tá inteiro. Se o estrago for pequeno, dá pra editar o SQL manualmente.
- Permissões insuficientes do usuário.
Às vezes, na hora de restaurar, aparecem erros porque o usuário não tem permissão suficiente, principalmente se você tenta restaurar com um usuário limitado.
Por que isso rola?
O usuário não tem permissão pra criar tabelas, schemas ou objetos do banco.
Como evitar?
Restaura usando um usuário que tenha as permissões certas:
pg_restore -U postgres -d my_database backup.dump
- Sobrescrever banco de dados existente
Outro erro comum é restaurar o banco de um backup quando já tem dados lá. Se você "apaga" registros sem querer, já era, não tem volta.
Por que isso rola?
Você não usa a flag --clean, então o novo backup é adicionado por cima dos dados antigos.
Como evitar?
Na restauração, usa a flag --clean pra apagar a estrutura existente:
pg_restore --clean -U user -d my_database backup.dump
- Erro de transação não finalizada
Na restauração, podem rolar problemas com dados que ficaram presos numa transação não finalizada. Isso é ainda mais comum em bancos grandes.
Por que isso rola?
A transação foi "quebrada" por causa de uma falha no servidor.
Como evitar?
Garante que o servidor PostgreSQL finalize todas as transações limpas antes de restaurar. Se der ruim, reinicia o servidor com:
sudo service postgresql restart
Como evitar erros na restauração
A gente falou como evitar problemas específicos, mas tem umas dicas gerais que ajudam a prevenir quase tudo:
Testa a restauração regularmente. Cria um banco de testes separado e tenta restaurar os dados lá.
Guarda várias cópias dos backups. Usa serviço na nuvem, armazenamento local e servidor remoto.
Automatiza a criação dos backups. Usa cron ou ferramentas parecidas pra agendar tudo.
Confere a integridade dos arquivos. Usa checksums pra garantir que o backup não tá corrompido.
Mantém as versões do PostgreSQL sincronizadas. Nunca deixa pra depois as atualizações do PostgreSQL, senão pode dar incompatibilidade no futuro.
Exemplos reais e soluções
Caso 1: Perda de arquivos WAL. Seu servidor caiu do nada e você percebeu que os arquivos WAL necessários sumiram. Nesse caso, não dá pra restaurar sem um backup completo. O jeito mais fácil é sempre conferir a configuração do arquivamento dos WAL.
Caso 2: Backup corrompido. Você subiu o backup pro servidor, mas na hora de conferir viu que o arquivo tava vazio. Nessas horas, usa o backup de outro lugar ou tenta restaurar o que der da cópia corrompida.
Caso 3: Incompatibilidade de versões. Na migração de dados do PostgreSQL 12 pro PostgreSQL 14, apareceram erros. Faz a exportação com pg_dump e restaura usando a versão nova.
GO TO FULL VERSION