I/O error during "read" operation for file
No Windows a operação se chama "ReadFile"; a linha seguinte costuma ser Error while trying to read from file, às vezes com Reached the end of the file ou um erro do sistema operacional.
O que significa
O motor pediu uma página ao sistema operacional e não a recebeu. Ou a página está além do fim do arquivo — o arquivo é menor do que o banco acha: uma cópia que parou no meio, um disco cheio, um download interrompido —, ou o disco não conseguiu lê-la.
Se o disco está falhando, pare de usá-lo: cada leitura pode piorar a situação. Primeiro copie o arquivo para outro disco, se preciso com uma ferramenta que pula setores ilegíveis (ddrescue no Linux), e trabalhe na cópia.
Se o arquivo está truncado, as páginas depois do fim se foram, e as linhas delas também. Tudo o que vem antes do corte pode ser salvo.
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.
O gbak costuma parar na primeira página que não consegue ler, mesmo quando a maior parte do banco está intacta.
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.
Para um arquivo truncado, o fbrescue scan informa as páginas que são referenciadas mas já não estão no arquivo, e a quais tabelas elas pertencem. A exportação lê todas as páginas que ainda existem e lista as linhas e valores que não conseguiu ler; blobs cujas páginas sumiram são gravados como NULL, e o resto da linha é mantido.