Conversión rápida de bases de datos Firebird 2.5 a Firebird 3.0
Basil Sidorov, 02-ABR-2019, (c) IBSurgeon
Cada versión de Firebird tiene su propio formato de base de datos - O(n)D(isk)S(tructure). Hasta la versión 2.5, el motor de base de datos puede trabajar con el ODS de la versión anterior, pero el motor de Firebird 3 solo funciona con su propio ODS (versión 12.0).
Para actualizar una base de datos de Firebird 2.5 a 3.0 es necesario hacer una copia de seguridad del archivo de base de datos con la herramienta gbak en 2.5 y luego restaurarla en 3.0.
Por supuesto, una base de datos necesita ser preparada para la conversión: los metadatos y las consultas deben ser verificados para compatibilidad con Firebird 3.0, y después de la restauración en Firebird 3, todos los objetos con BLR (triggers, procedimientos almacenados, etc.) deben ser recompilados.
Si usamos el enfoque estándar, necesitamos hacer una copia de seguridad de la base de datos en 2.5, y luego instalar Firebird 3 y restaurar el archivo de copia de seguridad.
Esto está bien si tienes suficiente tiempo. Pero cuando tu base de datos es grande, o tienes docenas de bases de datos para migrar, y estás limitado en tiempo, puedes usar la conversión por flujo, que es 25-30% más rápida.
La idea es usar el transportador:
gbak -b … db25 stdout | gbak -c … stdin db30
Gbak -b desde 2.5 escribe la copia de seguridad secuencialmente y la dirige al flujo de salida estándar (stdout), que es inmediatamente leído desde la entrada estándar (stdin) por gbak de 3.0 y crea una nueva base de datos.
Este transportador necesita usar acceso local a la base de datos (embebido) porque las transferencias de datos por red (aunque sea localhost) ralentizarán significativamente el proceso.
A continuación consideramos cómo realizar la copia de seguridad por flujo en Windows y en Linux.
Windows
Es mejor hacer un conjunto especial de archivos de Firebird para Windows. Necesitamos tomar el archivo embebido de Firebird 2.5, renombrar fbembed.dll a fbclient.dll, y agregar gbak.exe y opcionalmente isql.exe.
Para Firebird 3.0 usaremos el archivo estándar.
El conjunto mínimo (que no requiere runtime de VS2008/VS2010) contiene estos archivos:
25/gbak.exe
25/fbclient.dll
25/firebird.conf
25/firebird.log
25/firebird.msg
25/ib_util.dll
25/icudt30.dll
25/icuin30.dll
25/icuuc30.dll
25/Microsoft.VC80.CRT.manifest
25/msvcp80.dll
25/msvcr80.dll
30/fbclient.dll
30/firebird.conf
30/firebird.msg
30/gbak.exe
30/ib_util.dll
30/icudt52.dll
30/icudt52l.dat
30/icuin52.dll
30/icuuc52.dll
30/msvcp100.dll
30/msvcr100.dll
30/intl/fbintl.conf
30/intl/fbintl.dll
30/plugins/engine12.dll
Un administrador/desarrollador experimentado puede notar que los archivos 25/intl/fbintl.dll y 25/intl/fbintl.conf no están incluidos. Esto es cierto, porque gbak no usa el conjunto de caracteres para la conexión, y no convierte datos entre conjuntos de caracteres. Pero, en el lado receptor, Firebird 3.0, los archivos icu* son necesarios, porque los conjuntos de caracteres se usan durante la creación de índices (el paso final de la copia de seguridad/restauración).
Se recomienda agregar al firebird.conf de Firebird 3 dos líneas:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1
Además, es bueno establecer nombres diferentes para el parámetro IpcName para Firebird 2.5 y Firebird 3.0.
Otros parámetros, si lo deseas, pueden cambiarse considerando que durante la conversión de la base de datos Firebird 2.5 lee datos, y Firebird 3 escribe datos y crea índices.
Para acelerar la creación de índices recomendamos aumentar el parámetro TempCacheLimit a ~40% de la RAM disponible (si es una computadora o servidor dedicado).
Por ejemplo, si tienes 16 GB de RAM, puedes establecer
TempCacheLimit=6G
Por supuesto, este valor solo puede establecerse si usas Firebird 3 de 64 bits, porque cualquier proceso de 32 bits no puede asignar más de 2 gigabytes de RAM.
No necesitas cambiar este parámetro para 2.5, porque no afecta la velocidad de la copia de seguridad, y Firebird 2.5 en sí mismo no puede usar más de 2 gigabytes de RAM para este parámetro, incluso en la versión de 64 bits.
Además, antes de comenzar, verifica que el valor de “page buffers” sea 0 en la página de cabecera de la base de datos (gstat -h nombredatabase).
Si el parámetro “page buffers” está establecido en la cabecera de la base de datos, anula la configuración de firebird.conf, y en caso de un valor grande puede resultar en un consumo enorme de memoria y degradación del rendimiento del proceso de conversión.
Luego, copia el conjunto preparado de archivos al sistema de destino.
Ten en cuenta que necesitas detener el servicio regular de Firebird 2.5 antes de la conversión.
Luego, inicia el símbolo del sistema con elevación de derechos (Ejecutar como Administrador):
set ISC_USER=<especifica_el_propietario_de_tu_base_de_datos_o_sysdba>
set ISC_PASSWORD=contraseña
"25/gbak" -z -b -g -v -st t -y 25.log db25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin db30
Aquí la línea de comando completa está rodeada por comillas dobles, el símbolo | se usa para la concatenación, y el símbolo ^se usa para escapar el salto de línea (es útil en caso de líneas de comando largas).
La opción -st(atus) fue introducida en Firebird 2.5.8 y permite escribir más información sobre el proceso de copia de seguridad en el archivo de registro.
Linux
Firebird 3 depende de la biblioteca tommath en Linux. En CentOS (RHEL) esta biblioteca se encuentra en el repositorio epel, en Ubuntu (Debian) en el repositorio del sistema.
En CentOS, primero necesitas habilitar el repositorio EPEL y solo entonces ejecutar « yum install libtommath».
En Ubuntu, no necesitas agregar repositorios adicionales, pero Ubuntu 16 y Ubuntu 18 tienen diferentes versiones del paquete - libtommath0 y libtommath1, respectivamente.
Firebird 3 busca tommath.so.0, y para Ubuntu 18 necesitas hacer un enlace simbólico de tommath.so.0 a tommath.so.1. Para hacer esto, primero necesitas encontrar tommath.so.1. La ruta habitual en Ubuntu - /usr/lib/x86.64- linux -gnu/, pero puede ser diferente en otras distribuciones basadas en Debian.
Otro problema es que hasta Firebird 3.0.1, inclusive, no había una forma sencilla de instalar 2 versiones diferentes del servidor. La opción “compilar desde las fuentes con un prefijo” no se considera aquí.
Firebird 3.0.2 tiene la corrección CORE‑5204: compilación con -enable-binreloc, (http://tracker.firebirdsql.org/browse/CORE-5204), y la opción separada del instalador -path.
Entonces, si la biblioteca tommath, y, si es necesario, el enlace simbólico tommath.so.0 fue instalado, puedes instalar la distribución más reciente de Firebird 3.0.4 en /opt/fb3 con el siguiente comando: ./install.sh -path /opt/fb3
Después de eso, puedes detener el Firebird 2.5 existente y ejecutar la conversión por flujo.
Si usas Firebird 2.5 Classic, recuerda que Classic generalmente se ejecuta mediante xinetd - por lo tanto, necesitas deshabilitar el servicio firebird para xinetd o detener completamente xinetd.
No necesitas establecer los parámetros MaxUnflushed* en firebird.conf de Firebird 3 (porque solo funcionan en Windows), ni cambiar nada en Firebird 2.5.
El acceso embebido en Firebird 2.5 en Linux no es como en Windows - Firebird 2.5 funcionará dentro del proceso gbak (sin la parte de red), pero los derechos de acceso se verificarán con la base de datos de usuarios, por lo tanto, es necesario especificar no solo el nombre de usuario del propietario de la base de datos sino también la contraseña:
export ISC_USER=nombredeusuario ISC_PASSWORD=contraseña
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30
Después de la conversión exitosa, necesitas eliminar la “instancia temporal” de Firebird 3, luego desinstalar el 2.5 original, y solo después de eso, puedes realizar la instalación limpia de Firebird 3.
Es mejor instalar Firebird 3 desde tar.gz, no desde los repositorios, porque tar.gz instala todo en la ubicación conveniente /opt/ firebird , y también la versión de Firebird en los repositorios suele ser más antigua que en tar.gz.
Después de que la conversión esté completa y Firebird 3 esté instalado, necesitas verificar que el usuario “firebird” sea el propietario del archivo de base de datos.
Si no es así, necesitas corregirlo:
chown firebird.firebird nombredatabase
Resumen
La conversión por flujo es más rápida que el enfoque estándar (gbak -b, luego gbak -c), porque omite las operaciones de “escritura de la copia de seguridad” en el medio - como resultado, el tiempo de conversión por flujo es aproximadamente “tiempo de copia de seguridad más 10-15%” más “tiempo para crear índices”.
En nuestra práctica, la conversión por flujo es al menos 25-30% más rápida que la copia de seguridad y restauración tradicional “secuencial”.
Además de ahorrar tiempo y reducir la demanda de espacio libre en disco, la conversión por flujo tiene una ventaja más - no requiere eliminar el Firebird 2.5 existente, lo que te permite revertir rápidamente a 2.5 en caso de error durante la conversión.
Contactos
Por favor, envía comentarios y consultas al equipo de soporte de IBSurgeon.