Reconstruindo indices do firebird após backup com erro

O Firebird é um banco de dados formidável que permite construir aplicativos orientados a RDBMS de forma fácil, barata e segura.

Todavia, se um banco resulta corrompido na constituição lógica ds seus índices, restaurar este banco pode ser complicado.

Um caso típico que estamos enfrentando hoje é quando um campo que não fazia parte da PK passa a ser parte da mesma. O indice é criado o backup pode ser feito mas na hora de restaurar, ele vai acusar a inconsistência e impedir a restauração mantendo asssim a integridade do banco na forma mais singela: ou tudo ou nada.

Nesse caso, uma seqüência de passos a serem seguidos pode ser  seguinte: Restaurar o backup sem os indices e depois reativar os indices. Observar onde há incongruencias, eliminar as mesmas e ativar esse indice de novo.

O primeiro passo, após fazer um backup sem problemas, é restaurar o banco sem ativar os índices.

gbak -user sysdba \
-pass senha \
-se service_mgr \
-p 8192 \
-i \
-r meu-backup.fbk /bd/banco.fdb

Com isso restauramos o arquivo meu-backup.fbk no banco /bd/banco.fdb (do micro local) usando o service_mgr para aumentar a performance na hora da restauração, com um tamanho de página de 8192bytes para compatibilizar com clusters de disco maiores e sem ativar os índices.

Se este passo deu certo, agora precisamos elaborar uma lista com os nomes dos índices a serem ativados.

O seguinte comando nos devolve uma lista ordenada  dos indices a serem ativados. Esta ordem é por prioridade e não alfabética.

select rdb$index_name 
from rdb$indices 
where (RDB$INDEX_INACTIVE=1) 
order by rdb$foreign_key nulls first;

Mas o melhor mesmo é produzir um script que nos permita utilizar esse resultado então criamos um arquivo que chamarei aqui de criar-script-reconstrucao-indices.sql com o seguinte conteúdo:

select 'ALTER INDEX '||rdb$index_name ||' ACTIVE;' 
from rdb$indices 
where (rdb$system_flag is null or rdb$system_flag = 0) 
order by rdb$foreign_key nulls first;

Podemos agora utilizar este script sobre o banco restaurado (mesmo que apenas sejam um ou dois indices que faltam criar)

isql-fb -pagelen 99999 \
-user sysdba \
-pass senha \
/bd/banco.fdb  \
-i criar-script-reconstrucao-indices.sql \
-o /tmp/recriar-indices.sql

Isso indicará ao isql-fb que é para usar o script chamado criar-script-reconstrucao-indices.sql como entrada (ou seja, como se estivessemos digitando o conteúdo lá dentro do isql-fb) e redirecionamos a saída para /tmp/recriar-indices.sql

Feito isto, teremos no arquivo /tmp/recriar-indices.sql uma sequencia de instruções como no exemplo a seguir:

ALTER INDEX PK_PEDIDOS_COMPRAS  ACTIVE;
ALTER INDEX PK_PATRIMONIO_INST ACTIVE;
ALTER INDEX PATRIMONIO_IDX1 ACTIVE;
ALTER INDEX PK_PAGTO_COMPRA ACTIVE;
...

Depois disso, precisamos rodar esse script no servidor assim:

isql-fb \
-user sysdba \
-pass senha \
/bd/banco.fdb \
-i recriar-indices.sql

Ele vai ir criando cada um dos índices na ordem estabelecida. Se um deles dá erro, o erro aparecerá na tela (com detalhes do que é que está corrompendo o banco). Use esta informação para corrigir seu banco e depois volte a realizar o procedimento até obter uma saída sem erros