Recuperar dados de um banco Firebird corrompido
O seu banco Firebird parou de abrir, uma consulta falha com internal Firebird consistency check ou o gbak não consegue fazer o backup. Esta página traz a ordem de passos que salva o máximo de dados, do menos ao mais drástico. As páginas de erros explicam o que significam as mensagens mais comuns.
Primeiro: faça uma cópia e trabalhe só na cópia
Pare o servidor Firebird ou, no mínimo, garanta que nada esteja conectado ao banco. Depois copie o arquivo, junto com o arquivo .delta ao lado dele, se houver (um bloqueio do nbackup), e os arquivos secundários de um banco multiarquivo. Uma cópia feita enquanto o servidor grava no arquivo fica inconsistente, e toda tentativa de reparo altera o arquivo em que é executada. Se o próprio disco está falhando, copie o arquivo para outro disco antes de qualquer coisa.
Depois: tente as ferramentas do próprio Firebird
Elas vêm com toda instalação do Firebird e muitas vezes recuperam o banco inteiro: índices, triggers, usuários e tudo mais. Na cópia:
gfix -v -full -n copia.fdb # valida, só relata
gfix -mend -full -ignore copia.fdb # faz o gbak pular registros danificados
gbak -b -v -ig -g copia.fdb copia.fbk # backup: sem checksums, sem coleta de lixo
gbak -c -v copia.fbk restaurado.fdb # restaura em um banco novo
Acrescente -user SYSDBA -password ... conforme o seu servidor exigir. Se o gbak -b terminar, o banco restaurado é o resultado: confira a quantidade de linhas das tabelas importantes. O gfix -mend descarta os registros que não consegue ler, então compare com o original antes de confiar na cópia restaurada.
Se o gbak ainda falhar: extraia os dados com o fbrescue
O fbrescue é uma ferramenta gratuita e de código aberto (licença MIT) para bancos Firebird 2.5–5.0. Ele lê o arquivo do banco diretamente, sem o motor do Firebird, e exporta todas as linhas que consegue ler. Não para no primeiro registro ou página danificada e nunca grava no arquivo. Baixe o executável para o seu sistema em Releases: Windows, Linux, macOS; não precisa instalar nada.
fbrescue scan copia.fdb # o que está danificado, por tabela
fbrescue export copia.fdb --out resgate --format sql # schema.sql + INSERTs por tabela
Também existem --format csv e --format jsonl. As linhas que não puderam ser lidas ficam listadas em resgate/_errors.jsonl, com a página e o motivo, e o código de saída é 2 quando algo ficou de fora. Para carregar o resultado em um banco novo:
isql -ch UTF8 -i resgate/schema.sql novo.fdb
isql -ch UTF8 -i resgate/CLIENTES.sql novo.fdb # e assim por diante, para cada tabela
Se o texto sair ilegível, o banco provavelmente guarda texto em CHARACTER SET NONE: informe a codificação real, em geral --charset WIN1252 ou --charset ISO8859_1 em programas brasileiros.
Se quiser ajuda, abra uma issue e anexe a saída de fbrescue report copia.fdb: ela descreve o dano sem nenhum dos seus dados, e com os nomes de tabelas e colunas trocados por números. Pode escrever em português.
O que o fbrescue faz com cada dano
- Registros danificados: são pulados e listados; o resto da tabela é exportado.
- Páginas danificadas ou zeradas: as linhas dessas páginas se perdem, o resto do banco não. Páginas de dados que as páginas de ponteiros da tabela já não alcançam são encontradas lendo o arquivo inteiro.
- Páginas fora do lugar (a partir do Firebird 3 cada página guarda o próprio número): são lidas de onde estão.
- Inventário de transações danificado (
cannot find tip page): as linhas ainda são exportadas; quando o estado de uma transação se perdeu, vale a versão mais nova, com um aviso. - Página de cabeçalho danificada: o tamanho de página e a versão são deduzidos do resto do arquivo.
- Definições de tabelas perdidas: tabelas e colunas saem com nomes inventados (
TABLE_131,FIELD_2). Se os próprios layouts dos registros se perderam, passe ao fbrescue os comandos CREATE TABLE do seu banco (--ddl schema.sql): o script que o criou, a saída doisql -xou uma exportação anterior do fbrescue.
Quanto volta de cada tipo de dano foi medido em centenas de cópias danificadas de um banco de teste no Firebird 2.5, 3.0, 4.0 e 5.0: veja a taxa de recuperação.
O fbrescue extrai os dados; ele não conserta o arquivo no lugar. Índices, triggers, procedures e usuários não são exportados: crie-os de novo no banco novo. Como ele se compara ao gfix/gbak e ao IBSurgeon FirstAID: comparação; respostas curtas: FAQ.
O banco não está danificado, só não há Firebird para abri-lo?
A mesma ferramenta exporta bancos íntegros: abrir um arquivo .fdb sem o Firebird, exportar para CSV ou Excel, levar os dados para o PostgreSQL.
Erros comuns
internal Firebird consistency check (decompression overran buffer (179))— os bytes de um registro estão danificadosinternal Firebird consistency check (wrong record length (183))— um registro não corresponde ao layout da sua tabelainternal Firebird consistency check (cannot find tip page (165))— o inventário de transações está danificadodatabase file appears corrupt/page is of wrong type— uma página contém algo diferente do esperadoI/O error during "read" operation— o arquivo é menor que o banco, ou o disco está falhandogbak: ERROR…Exiting before completion due to errors— o backup de um banco danificado para no meio