Esta página fue traducida automáticamente. Lee el original en inglés. English

Biblioteca de IBSurgeon

Todas las versiones de estructura en disco (ODS) de Firebird e InterBase

Por Dmitry Kuzmenko, 24 de mayo de 2016

Qué es el número de estructura en disco (ODS)

En palabras simples, ODS (On-Disk Structure) es un número de formato de archivo de base de datos para la versión particular del RDBMS Firebird o InterBase.

Casi todas las versiones usan la llamada “Y-valve” para soportar el ODS actual y algún ODS antiguo. Esto permite que el servidor trabaje con archivos de base de datos de versiones anteriores y simplifica la transición del servidor antiguo al 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

Code
gstat -h database_file_name

El usuario y la contraseña aquí no son necesarios, porque gstat con la opción -h solo lee la parte física de la base de datos (página de encabezado, 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á

Code
Wrong ODS version, expected 8, encountered 32779?

Aquí, usted ve el número ODS 32779: esto es 11 codificado, con el bit alto añadido desde Firebird 2.0 (en hexadecimal será 800B, donde B = 11), para evitar confusión entre bases de datos 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 de obtener un mensaje comprensible es cuando gstat no puede encontrar firebird.msg o interbase.msg. Mostrará algo como

Code
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.

Varios ejemplos:

Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x intenta abrir una base de datos Firebird 2.x

Wrong ODS version, expected 8, encountered 13? - InterBase 4.x intenta abrir una base de datos IntrBase 2009

Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 intenta abrir una base de datos Firebird 2.x

Wrong ODS version, expected 11, encountered 11 - Firebird 2.x intenta abrir una base de datos InterBase 7.x

Wrong ODS version, expected 11, encountered 15- Firebird 2.x intenta abrir una base de datos InterBase XE/XE3

A veces puede obtener 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 Firebird 2.x:

Code
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 el nuevo 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 del 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á el ODS 11.0/11.1 de InterBase a 11.2, que es incompatible con 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 puede actualizarse 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” puede configurarse en IBCONFIG. De esta manera XE7 creará bases de datos (incluida la restauración) con el ODS especificado (13, 15, 16) como predeterminado.

Actualización de ODS

Cada versión del 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 el 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 por InterBase 4.0/4.1. Así, la actualización menor de ODS hace que las bases de datos sean incompatibles 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 de 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 la versión de su servidor.

La diferencia entre ODS (mayor o menor) puede ser enorme, o pequeña. Si tiene suficiente curiosidad, puede abrir jrd\ods.h (Firebird de código abierto) y encontrar las 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 de 9.0 solo por un índice, añadido a alguna tabla del sistema.

Tenga en cuenta que la versión mayor de ODS no puede actualizarse al vuelo. 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, en características y ODS. Como se dijo antes, la última común fue ODS 10, y desde entonces (Firebird 2.0 e InterBase 7.0) las bases de datos son incompatibles con su formato.

Así, la migración será más fácil si no ha usado 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 usó 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.

Code
isql -x db.gdb …
isql -i script.ddl …

Esto debe hacerse para comprobar 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, triggers 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 fue creada hace mucho tiempo y modificada 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 los datos de la base de datos antigua a la nueva base de datos.

Incluso si intentó hacer backup en el servidor antiguo y restore 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, así que el error surgirá algún tiempo después.

Cómo volver a la versión anterior de Firebird o InterBase

A veces, puede necesitar realizar un downgrade y volver desde el nuevo servidor. Las razones pueden variar: un error repentino en el servidor, problemas de rendimiento, etc.

Si hizo la copia de seguridad antes de la actualización del servidor, no habrá problemas para volver. Pero si no, se enfrentará al problema de volver del nuevo ODS al ODS antiguo.

Para hacer eso necesitará 2 computadoras con el nuevo servidor y el antiguo. Si no ha usado ninguna característica nueva del servidor X (versión de InterBase o Firebird), entonces puede volver a X-1 siguiendo estos pasos:

  1. Tome la utilidad gbak del servidor X-1, y haga una copia de seguridad usándola en el servidor X
  2. Transfiera la copia de seguridad al servidor X-1, y restáurela

Si hay algunos problemas en el paso 1, puede intentar

  1. Hacer una copia de seguridad en el servidor X, usando su gbak
  2. Copiar la utilidad gbak de X a X-1
  3. Restaurar la copia de seguridad en X-1 usando gbak de X

Tenga en cuenta que el protocolo local entre los servidores X y X-1 puede ser incompatible, así que es mejor especificar el nombre del servidor:

Code
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 deben usarse roles ni la nueva integridad referencial declarativa
  • De 6.x a 5.x - ningún cambio de metadatos, porque 6.x usa el nuevo formato BLR
  • De InterBase 7.x a Firebird - no hay columnas boolean ni nombres de objetos de más de 31 caracteres.
  • De Firebird 1.5 a InterBase - no hay columnas BIGINT ni nuevas extensiones SQL en triggers y procedimientos
  • De Firebird 2.0 a Firebird 1.5 - ninguna de las nuevas funcionalidades de Firebird 2.0.
  • Y así sucesivamente

Si todavía hay errores que no pueden corregirse, la única manera es crear la base de datos en el servidor X-1 a partir del script SQL y transferir los 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 de migración integral para las bases de datos Firebird complejas. La tarifa regular es de USD$2900.

Por ejemplo, hemos migrado la 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, por favor contáctenos [email protected]