CodeGym /Cursos /SQL SELF /Problemas e erros na restauração de dados

Problemas e erros na restauração de dados

SQL SELF
Nível 44, Lição 3
Disponível

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

  1. 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. O pg_dump gera 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.

  1. 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.

  1. 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.

  1. 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
  1. 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
  1. 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.

2
Tarefa
SQL SELF, nível 44, lição 3
Bloqueado
Restauração do banco de dados a partir de um backup
Restauração do banco de dados a partir de um backup
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION