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