En general el Firebird es muy bueno en este aspecto, es casi imposible que una Base de Datos se corrompa por culpa de un corte de la energía eléctrica, sin embargo podría ocurrir si el corte se produjo justo en el momento en que se estaban insertando datos. Para solucionarlo:
- Verificar las tablas MON$ATTACHMENTS y MON$STATEMENTS
- Detener el servicio del Firebird
- Forzar un ROLLBACK con el programa GFIX.EXE
- Reiniciar el servicio del Firebird
- Verificar nuevamente las tablas MON$ATTACHMENTS y MON$STATEMENTS
Si tu Base de Datos está muy corrupta, no podrás ejecutar el paso 1. y deberás empezar con el paso 2.
1. Para verificar las tablas MON$ATTACHMENTS y MON$STATEMENTS
SELECT * FROM MON$ATTACHMENTS WHERE MON$STATE = 1
En la tabla MON$ATTACHMENTS se guardan los datos de las conexiones. La columna MON$STATE te dirá si la conexión está libre (cuando su valor es 0) o si la conexión está activa (cuando su valor es 1). Solamente deberías fijarte en las conexiones activas, o sea las que tienen un valor de 1 en la columna MON$STATE
SELECT * FROM MON$STATEMENTS WHERE MON$STATE = 1
La columna MON$TRANSACTION_ID muestra los números de todas las transacciones activas. Anota en un papel los números de las transacciones que deseas deshacer con el programa GFIX pues podrías necesitarlos cuando uses ese programa.
2. Para detener el servicio del Firebird
Inicio | Panel de Control | Firebird Server Manager | Stop
3. Para forzar un ROLLBACK con el programa GFIX.EXE
Inicio | Todos los programas | Accesorios | Símbolo del sistema
CD “C:\Archivos de Programa\Firebird\Firebird_2_5\bin”
Alternativa 1:
GFIX -user SYSDBA -password masterkey -rollback MiNúmeroTransacción MiBaseDatos.fdb
Alternativa 2:
GFIX -user SYSDBA -password masterkey -rollback all MiBaseDatos.fdb
Como ves, aquí tienes dos alternativas posibles. Utilizarías la alternativa 1. cuando quieres especificar cual transacción se deshacerá, deberás reemplazar MiNúmeroTransacción por un número de transacción que obtuviste en el paso 1. y que anotaste en un papel. Y utilizarías la alternativa 2. para deshacer todas las transacciones, sin excepción. Lo normal es que utilices la alternativa 2. pero habrá casos en que prefieras la alternativa 1.
4. Para reiniciar el servicio del Firebird
Inicio | Panel de Control | Firebird Server Manager | Start
Conclusión
Aunque es muy raro que ocurra corrupción en una Base de Datos Firebird no es imposible (¿conoces la Ley de Murphy?) y los pasos de arriba te ayudarán a solucionarla. No siempre podrás conectarte a una Base de Datos corrupta y por lo tanto es posible que necesites empezar desde el paso 2. en cuyo caso deberás deshacer a todas las transacciones (la alternativa 2. de más arriba). Cuando una transacción se deshace (ROLLBACK) todo lo que se había hecho dentro de esa transacción se pierde o sea que cualquier INSERT/DELETE/UPDATE realizado dentro de esa transacción desaparecerá como si nunca se lo hubiera realizado.
Como una Base de Datos corrupta solamente causa trastornos lo conveniente es evitar que tal cosa ocurra. Una medida elemental de precaución es tener una buena UPS (unidad de energía ininterrumpida) conectada a la computadora donde se encuentra la Base de Datos. Otra medida elemental es jamás compartir la carpeta donde se encuentra la Base de Datos.
.
Mar 19, 2013 @ 09:31:52
Podrias indicar la sintaxis del comando gfix.exe para hacer el rollback.
Gracias.
El índice del blog Firebird21 | Firebird SQL
Jun 17, 2013 @ 04:46:43
Ene 03, 2014 @ 01:10:11
Saludos tengo un problema con una database hice todo lo que recomiendas pero aun asi me perciste el error
gfix -validate -full -ignore BD.fbk
Number of record level errors : 5
Number of data page errors : 6
Number of index page errors : 45
Number of database page errors : 32
gfix -sweep DB.fbk
database file appears corrupt ()
-bad checksum
-checksum error on database page 34833
Este Otro
gbak -backup -verbose -ignore -garbage DB.fbk
gbak: ERROR: wrong page type
gbak: ERROR: page 34834 is of wrong type (expected 5, found 78)
gbak: ERROR:gds_$receive failed
gbak:Exiting before completion due to errors
Como podria Solucionar no me deja crear el Backup y llega en gbak:ERROR:gds_$receive failed, espero que me puedas ayudar saludos
Ene 03, 2014 @ 01:36:42
Puedes verificarla con el programa FBFirstAID de IBSurgeon.
Y si no tienes problema conque yo la vea, puedes enviármela, la colocas en algún sitio para compartir archivos y me dices el enlace. Hice varios programitas para mi uso particular que verifican bases de datos, quizás con ellos pueda descubrir donde está el problema.
Saludos.
Walter.
Ene 03, 2014 @ 02:39:31
Saludos ok aqui te mando el enlace de todas maneras bajare el que me recomendaste http://www.mediafire.com/download/2fo52itk2ox6xuf/DB.fbk.zip
Ene 03, 2014 @ 15:05:32
Aun sigo con el error tiene 28 Paginas dañadas y no puedo exportar la Data a otra BD el ultimo respaldo que hizo también lo Guardo con errores 😦
Ene 03, 2014 @ 15:15:49
Por eso los backups hay que hacerlos todos los días e inclusive varias veces por día, tengo un programa de uso personal que realiza todas las tareas administrativas, ésa incluida, me falta mejorarle un poco la estética antes de compartirlo con los lectores de este blog.
Por otro lado, jamás debes permitir que la diferencia entre la OAT y la OIT sea grande porque eso solamente acumulará basura y no te otorgará beneficios. Si durante algún momento del día nadie usa la Base de Datos entonces es un buen momento para hacerle el sweep.
Saludos.
Walter.
Sep 05, 2015 @ 12:09:53
Que herramienta interesante Walter. A la espera.
Sep 04, 2015 @ 21:38:39
Es muy interesante el acceder a las tablas de sistema de firebid para obtener informacion ¿Recomiendas algun libro o alguna fuente para aprender mas sobre los “metadatos” de las BD firebird?
como siempre muy util, gracias
Sep 04, 2015 @ 22:09:34
En este blog hay una categoría “Consultas a los metadatos”, podrías empezar por ahí, y ante cualquier duda puedes escribirla en el foro.
Saludos.
Walter.