15 de diciembre de 2010

Activar todos los índices en Firebird

ActivarDesactivarIndices.exe
Interfaz

Como primer entrada de este blog (me imagino que ya conocen mi blog de comics) voy a traer un programa que hice, para poder activar todos los índices de una base de datos Firebird (versión 2.1 en adelante).


El problema surge cuando hacemos un backup y restore con la herramienta
gbak (incluida con la instalación de Firebird) con la opción:

-i[nactive]: All indexes will be restored as INACTIVE

Esto hace que la base se restaure pero con todos sus índices desactivados (esta opción se usa cuando al restaurar da error por errores en los índices), y para activar cada uno de los índices hay que ejecutar:

ALTER INDEX nombre_indice ACTIVE;

Imagínense esto para cada uno de los índices. En la base donde surgió el problema había más de 2000. Además para activarlos hay que hacerlo en orden, ya que los que son FOREIGN KEY no pueden activarse hasta no activar su PRIMARY KEY.

Por eso hice este programa ActivarDesactivarIndices.exe (que pueden descargar al final).

Al ejecutarlo (no requiere instalación) se muestra la ventana mostrada arriba. Hay que elegir una base Firebird o Interbase (extensiones *.fdb o *.gdb), conectarla y ahí ya se puede ver los índices desactivados, activarlos o desactivarlos.

VerDesactivados

En este ejemplo se observa que hay 2273 índices desactivados, apretamos el botón de activar y empieza, índice por índice, en orden, primero índices que no tengan parent y luego los índices que apuntan a otros. La consulta que los trae (esto quizás les sirva para comprobar ustedes el funcionamiento):

select a.rdb$index_name nombre,
  a.rdb$foreign_key padre,
  a.rdb$relation_name tabla,
  a.rdb$index_id indice
from rdb$indices a
where a.rdb$index_inactive = 1
and a.rdb$system_flag = 0
order by a.rdb$index_id,
coalesce(a.rdb$foreign_key, ''),
a.rdb$index_name
 

Elegí usar Coalesce para el orden en vez de nulls first por si el motor del firebird usado es inferior al 2.0, el resultado es el mismo.

A medida que va activando cada indice muestra el resultado en el editor y abajo muestra el progreso.

Activando

Los filtros que dan error se pueden consultar despues, buscando el texto (con Ctrl+F) “Error ejecutando:”, por ejemplo:

Error_Activando_Indices

El error de la imágen dice:

"Error ejecutando:"
ALTER INDEX RDB$PRIMARY123 ACTIVE
"Indice de la tabla: MOV_FONDOS"
"  attempt to store duplicate value (visible to active transactions) in unique index "RDB$PRIMARY123""

El error anterior existe porque hay un error en la base, con registros duplicados y por eso no puede activar el índice PK de la tabla.

Habrá que arreglar los problemas particulares de cada tipo de error para poder levantar los índices. Una vez arreglados debería decir:

"No hay índices desactivados."

Para desactivar índices da muchos más errores, ya que existe la integridad referencial y normalmente no deja desactivar una gran mayoría, igualmente si uno necesita desactivarlos conviene hacer un backup y restaurarlo sin indices con el gbak. Pero eso es material para otra entrada.


Descargar programa y fuentes (opcionales) para activar o desactivar índices de una base Firebird:

Ambos archivos a descargar estan comprimidos con 7Zip. Si quieren compilar el código ustedes mismos necesitarán dos componentes (tambien pueden usar el código fuente para tomar ejemplos de como está realizado):

1 - SQLDirect (no es libre): Para conexión a la base, ejecución de consultas y grabación.
2 -
Synedit (uso libre): Para mostrar log con sintáxis de SQL resaltada y poder buscar y copiar texto.

Cualquier cosa no duden en mandar su consulta.

4 comentarios:

  1. Mmmm base de datos se que algun dia me lo voy a topar pero por ahora no entiendo ni j, no importa ahora si se puede comentar.
    Saludos y suerte.

    ResponderEliminar
  2. hola arsenio...
    Link caido jmendezc1971@gmail.com

    ResponderEliminar
  3. @jmendezc
    Lo puedes hacer con código desde Firebird. http://www.firebirdfaq.org/faq274/

    ResponderEliminar