Todas las versiones de Firebird e InterBase de On-Disk-Structure (ODS)
By Dmitry Kuzmenko, 24-May-2016
Qué es el número ODS (On-Disk Structure)
En palabras simples, ODS (On-Disk Structure) es un número de formato de archivo de base de datos para la versión particular de Firebird o InterBase RDBMS.
Casi todas las versiones usan la llamada “Y-valve” para soportar el ODS actual y algunos ODS antiguos. Esto permite que el servidor trabaje con archivos de base de datos de versiones anteriores y simplifica la transición del servidor antiguo a uno nuevo. Pero hay algunas limitaciones, que se describirán más adelante.
Puede averiguar el ODS de su base de datos ejecutando el siguiente comando
gstat -h database_file_name
Aquí no se necesitan usuario y contraseña, porque gstat con la opción -h solo lee la parte física de la base de datos (página de cabecera, número 0).
Si gstat no entiende la información leída, mostrará el mensaje correspondiente: qué esperaba y qué encontró.
Por ejemplo, si ejecutamos gstat de InterBase 4 en una base de datos de Firebird 2, mostrará
Wrong ODS version, expected 8, encountered 32779?
Aquí, ve el número ODS 32779: esto es 11 codificado, con el bit alto agregado desde Firebird 2.0 (en hexadecimal será 800B, donde B = 11), para evitar confusión entre bases de datos de InterBase y Firebird, porque desde cierto punto tenían el mismo número ODS, pero un formato de base de datos muy diferente. La excepción para obtener un mensaje comprensible es cuando gstat no puede encontrar firebird.msg o interbase.msg. Mostrará algo como
can't format message 21:3 -- message file ...msg not found
Entonces, esto significa que tiene una instalación incorrecta de Firebird o InterBase, y necesita corregirla.
Algunos ejemplos:
Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x intenta abrir una base de datos de Firebird 2.x
Wrong ODS version, expected 8, encountered 13? - InterBase 4.x intenta abrir una base de datos de InterBase 2009
Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 intenta abrir una base de datos de Firebird 2.x
Wrong ODS version, expected 11, encountered 11 - Firebird 2.x intenta abrir una base de datos de InterBase 7.x
Wrong ODS version, expected 11, encountered 15 - Firebird 2.x intenta abrir una base de datos de InterBase XE/XE3
A veces puede recibir otro tipo de mensaje, del servidor (no de gstat) pero con el mismo significado.
Por ejemplo, cuando el servidor Firebird 1.5 intenta abrir una base de datos de Firebird 2.x:
unsupported on-disk structure for file ...; found 32779, support 10
Aquí puede ver la tabla de versiones ODS, desde InterBase 4.0 (1994).
| Versión del servidor | Número ODS principal | Puede trabajar con ODS | Nota |
|---|---|---|---|
| InterBase 4.0/4.1 | 8.0 | ||
| InterBase 4.2 | 8.2 | 8.2 | InterBase 4.2 actualiza forzosamente ODS 8.0 a 8.2 |
| InterBase 5.0/5.1 | 9.0 | 8.2 | InterBase 5.x actualiza forzosamente ODS 8.0 a 8.2 |
| InterBase 5.5/5.6 | 9.1 | 8.2 | |
| InterBase 6.0 Firebird 1.0 Yaffil 1.0 |
10.0 | 9.0/9.1 | Es peligroso trabajar con ODS 9.x, porque los nuevos InterBase y Firebird usan un nuevo formato de metadatos, que no es reconocido por InterBase 5.x |
| Firebird 1.5 | 10.1 | 9.0/9.1/10.0 | El ODS 10.1 de Firebird 1.5 de 64 bits es incompatible con el ODS 10.1 de 32 bits. Esta es la única incompatibilidad conocida de formato de base de datos entre versiones de 32/64 bits. |
| InterBase 7.0 | 11.0 | 10.0 | Incompatible con ODS 11 de Firebird 2.x |
| InterBase 7.1 | 11.1 | 10.0 | InterBase 7.5 actualizará InterBase ODS 11.0/11.1 a 11.2, que es incompatible para versiones anteriores (7.0/7.1) |
| InterBase 7.5 | 11.2 | 10.0 | |
| Firebird 2.0 | 11.0 | 10.x | El ODS 11 de Firebird 2.0 es incompatible con InterBase 7.x |
| Firebird 2.1 | 11.1 | 10.x/11.0 | El ODS 11 de Firebird 2.0 es incompatible con InterBase 7.x |
| Firebird 2.5 | 11.2 | 10.x/11.x | El ODS 11.2 es incompatible con Firebird 2.0/2.1. |
| Firebird 3.0 | 12.0 | No soporta ODS anteriores, solo 12.0 | |
| Firebird 4.0 | 13.0 | 13.0 | |
| Firebird 5.0 | 13.1 | 13.0, 13.1 | La base de datos se puede actualizar de 13.0 a 13.1 con gfix -upgrade desde 13.0, o con backup/restore |
| InterBase 2007 | 12.0 | 11.x | |
| InterBase 2009 | 13.1 | 12.0 | |
| InterBase XE, XE3 | 15.0 | 13.1 | ¿Dónde está el ODS 14? |
| InterBase XE7 | 16.0 | 15, 13 | El ODS “actual” se puede configurar en IBCONFIG. De esta manera, XE7 creará bases de datos (incluyendo restauración) con el ODS especificado (13, 15, 16) como predeterminado. |
Actualización de ODS
Cada versión de servidor siempre usa (excepto InterBase XE7) su número ODS principal para la base de datos creada o restaurada. Si el ODS de la base de datos es menor que el ODS principal del servidor, el servidor puede trabajar con esa base de datos si soporta su ODS.
A veces el servidor puede actualizar un ODS antiguo a uno más nuevo, sin notificación. Esto puede llevar a la imposibilidad de volver a la versión anterior. Por ejemplo, si abre una base de datos con ODS 8.0 con InterBase 4.2, actualizará el ODS a 8.2, que no es comprensible para InterBase 4.0/4.1. Entonces, la actualización menor de ODS hace incompatibles las bases de datos dentro de la misma versión mayor del servidor. Esto también es cierto para Firebird 2.5 e InterBase 7.5.
Para evitar problemas al volver a la versión anterior, recomendamos hacer copias de seguridad en la versión actual del servidor incluso antes de la actualización menor de su versión de servidor.
La diferencia entre ODS (mayor o menor) puede ser enorme o pequeña. Si es lo suficientemente curioso, puede abrir jrd\ods.h (Firebird open source) y encontrar diferencias entre ODS. Por ejemplo, el ODS 9.0 comparado con 8.x tiene integridad referencial declarativa, roles SQL, recolección de basura en índices. Pero el ODS 9.1 difiere del 9.0 solo por un índice, agregado a alguna tabla del sistema.
Tenga en cuenta que la versión mayor de ODS no se puede actualizar sobre la marcha. Solo puede actualizarla mediante backup/restore.
Migración entre InterBase y Firebird
Las últimas versiones de Firebird (3.0) e InterBase (XE7) son muy diferentes, por características y ODS. Como se dijo antes, el último común fue ODS 10, y desde entonces (Firebird 2.0 e InterBase 7.0) las bases de datos son incompatibles en su formato.
Entonces, la migración será más fácil si no ha utilizado características desde InterBase 7.x o Firebird 1.5. Si es así, la complejidad de la migración dependerá de cuántas características haya utilizado en la base de datos o en el proceso de administración.
Actualmente, después de muchos años de desarrollo de Firebird e InterBase, la migración entre las últimas versiones de estos servidores es difícil.
De todos modos, si intenta hacer esto, necesita extraer el script de metadatos de la base de datos y luego intentar crear la nueva base de datos a partir de ese script, usando el mismo servidor.
isql -x db.gdb …
isql -i script.ddl …
Esto debe hacerse para verificar si hay metadatos antiguos incorrectos en su base de datos o errores de extracción de script en el servidor que usa. InterBase y Firebird almacenan procedimientos, disparadores y vistas (y algunos otros objetos) en forma compilada (BLR - Binary Language Representation), y durante el backup/restore los metadatos no se recompilan (de SQL a BLR).
En este caso, si una base de datos se creó hace mucho tiempo y se modificó constantemente, puede haber BLR incorrecto (antiguo) para algunos objetos. Estos objetos pueden seguir funcionando, pero intentar recrearlos (ALTER) puede generar un error de sintaxis (u otro).
Luego puede intentar crear una base de datos a partir del script corregido en el nuevo servidor. Después de corregir todas las incompatibilidades en este script, puede transferir datos de la base de datos antigua a la nueva.
Incluso si intentó hacer backup en el servidor antiguo y restaurar en el nuevo, y funcionó, nunca confíe en esto. Si su base de datos contiene muchos objetos, no puede verificar todos a la vez en el nuevo servidor, por lo que el error aparecerá algún tiempo después.
Cómo volver a la versión anterior de Firebird o InterBase
A veces, puede necesitar realizar una degradación y volver del nuevo servidor. Las razones pueden variar: un error repentino en el servidor, problemas de rendimiento, etc.
Si hizo el backup antes de la actualización del servidor, no habrá problemas para volver. Pero si no, enfrentará el problema de volver del nuevo ODS al ODS antiguo.
Para hacerlo, necesitará 2 computadoras con el nuevo servidor y el antiguo. Si no ha utilizado ninguna característica nueva del servidor X (versión de InterBase o Firebird), puede volver a X-1 siguiendo estos pasos:
- Tome la utilidad gbak del servidor X-1 y haga un backup usándola en el servidor X
- Transfiera el backup al servidor X-1 y restáurelo
Si hay algunos problemas en el paso 1, puede intentar
- Hacer un backup en el servidor X, usando su gbak
- Copiar la utilidad gbak de X a X-1
- Restaurar el backup en X-1 usando gbak de X
Tenga en cuenta que el protocolo local entre los servidores X y X-1 puede ser incompatible, por lo que es mejor especificar el nombre del servidor:
gbak -b localhost:c:\dir\data.gdb
El resultado será exitoso solo con la condición de que no haya cambiado ninguno de los objetos de la base de datos en el servidor X desde que actualizó desde X-1.
Aquí hay ejemplos:
- De 5.x a 4.2: no se deben usar roles ni nueva integridad referencial declarativa
- De 6.x a 5.x: sin cambios de metadatos, porque 6.x usa un nuevo formato BLR
- De InterBase 7.x a Firebird: sin columnas booleanas ni nombres de objetos de más de 31 caracteres.
- De Firebird 1.5 a InterBase: sin columnas BIGINT ni nuevas extensiones SQL en disparadores y procedimientos
- De Firebird 2.0 a Firebird 1.5: ninguna de las nuevas funcionalidades de Firebird 2.0.
- Y así sucesivamente
Si aún hay errores que no se pueden corregir, la única forma es crear la base de datos en el servidor X-1 a partir del script SQL y transferir datos.
Servicio de migración de Firebird
A menudo, la migración es una tarea compleja, especialmente para bases de datos Firebird heredadas, que fueron abandonadas por los desarrolladores originales. Nuestra empresa ofrece el servicio integral de migración para bases de datos Firebird complejas. La tarifa regular es de USD$2900.
Por ejemplo, hemos migrado una base de datos cuyo script SQL era de 55 Megabytes, con más de 5000 procedimientos almacenados, 1000 tablas y varios miles de consultas SQL ad hoc, en menos de 3 meses.
Si tiene alguna pregunta, contáctenos en [email protected]