Haciendo backups con GBAK (2)

Deja un comentario

Sabemos que hay varios métodos que podemos usar para hacer copias de seguridad en Firebird, entonces: ¿por qué usar GBAK?

La ventaja de usar GBAK es que no solamente realiza la copia de seguridad (o backup) sino que también deja a la Base de Datos restaurada en perfecto estado de salud.

Esto es así porque:

  1. GBAK no copia la basura de la Base de Datos original en el archivo de backup. El archivo de backup está siempre sin basura, totalmente limpio de basura.
  2. GBAK copia los nombres de los índices y sus definiciones, pero no las páginas que contienen a esos índices. Cuando realiza la restauración allí sí crea cada índice. De esta manera se consigue que: a) el archivo de backup sea más pequeño porque no contiene las páginas de datos de los índices, b) que el archivo de backup se genere más rápido porque no tiene páginas de datos de los índices, c) que al restaurar, todos los índices se encuentren perfectamente balanceados y que las estadísticas de los índices sean exactas.
  3. GBAK cuando restaura el backup verifica que todas las filas contengan datos válidos. Si descubre un error (por ejemplo que una columna definida como NOT NULL tiene un valor NULL) enseguida lo notifica y finaliza la restauración.

Las páginas de la Base de Datos que contienen índices pueden ser miles y miles, entonces al no copiarlas en el archivo de backup se ahorra mucho espacio en el disco duro y se gana en velocidad. Cada página de la Base de Datos, como ya habíamos visto en otro artículo, tiene un tamaño fijo de bytes. Por ejemplo, cada página ocupa 4096 bytes en el disco duro.

¿Cómo funciona GBAK?:

GBAK puede realizar el backup mientras los usuarios están usando la Base de Datos. El archivo de backup contendrá lo que tenía la Base de Datos original en el momento en que se inició GBAK. Lo que después hagan los usuarios se guardará en un archivo auxiliar, llamado «delta». Cuando GBAK finalice su tarea, todo lo que se grabó en el archivo «delta» se copiará en la Base de Datos original.

Este funcionamiento de GBAK tiene una ventaja y una desventaja:

  • La ventaja es que mientras GBAK se está ejecutando los usuarios pueden continuar trabajando con la Base de Datos
  • La desventaja es que el rendimiento de la Base de Datos decae, porque los usuarios trabajan con dos archivos: el de la Base de Datos original, y el temporario «delta». Es por ese motivo que se recomienda que se ejecute a GBAK cuando nadie está usando la Base de Datos (y si eso no es posible, al menos cuando muy pocos usuarios la estén usando).

GBAK crea una transacción en la Base de Datos original para realizar su tarea. Para la Base de Datos, GBAK se comporta como si de un usuario humano se tratara, no hay diferencia.

Cuando empieza el backup, GBAK bloquea a toda la Base de Datos. A partir de ese momento y hasta que GBAK finalice, la Base de Datos podrá ser consultada (con el comando SELECT) pero no se le podrán insertar, ni actualizar, ni borrar filas (con los comandos INSERT, UPDATE, DELETE, respectivamente). La ejecución de estos comandos se guardará en un archivo auxiliar llamado «delta». Cuando GBAK finalice su tarea de hacer el backup, la transacción que él inició finalizará con un COMMIT y el contenido de ese archivo «delta» será agregado a la Base de Datos original y ésta será desbloqueada, para que se pueda continuar trabajando normalmente con ella.

El archivo de backup que generó GBAK (y que usualmente tiene la extensión .FBK, aunque no es obligatorio que tenga esa extensión) no puede ser utilizado hasta que sea restaurado.

Resumiendo:

Al realizar el backup:

  • Los usuarios pueden continuar usando la Base de Datos mientras GBAK está haciendo el backup
  • GBAK crea un archivo que contendrá gran parte de lo que tiene la Base de Datos. El nombre de ese archivo puede ser cualquiera que admita el Sistema Operativo, y la extensión usualmente es .FBK (aunque no es obligatorio)
  • GBAK bloquea totalmente a la Base de Datos, para que nada en ella pueda ser cambiado hasta que él finalice
  • GBAK inicia una transacción en la Base de Datos
  • GBAK crea un archivo temporario llamado «delta». A partir de ese momento, todos los INSERT, UPDATE, y DELETE, se guardarán en el archivo «delta», porque la Base de Datos está bloqueada
  • GBAK copia en el backup todas las filas confirmadas de cada tabla
  • GBAK no copia en el backup la basura
  • GBAK copia en el backup los nombres de los índices y las definiciones de los índices
  • GBAK no copia en el backup las páginas de índices
  • El rendimiento de la Base de Datos decae mientras se usa GBAK porque los usuarios trabajan con dos archivos: el de la Base de Datos original y el temporario «delta»
  • GBAK no verifica que las filas de las tablas que está copiando en el archivo de backup contengan datos válidos, las copia así como las encuentra, con todos los errores que pudieran tener
  • Al terminar de crear el archivo de backup, GBAK finaliza con un COMMIT la transacción que había iniciado en la Base de Datos
  • GBAK le agrega a la Base de Datos el contenido del archivo temporario «delta»
  • GBAK desbloquea a la Base de Datos

Al restaurar:

  • Se crea un archivo que contendrá una Base de Datos de Firebird válida
  • Se puede cambiar el tamaño de cada página
  • Primero se agregan los metadatos y luego los datos introducidos por los usuarios
  • Todo el contenido del archivo de backup es tratado como si hubiera sido puesto por una sola transacción. Por ese motivo todas las filas de todas las tablas tienen un TID igual a 1
  • Cuando se van agregando filas a las tablas se verifica que cumplan con las restricciones. Si se descubre algún error, se lo notifica inmediatamente
  • Se agregan las páginas de índices
  • Se calculan las estadísticas de los índices
  • Se actualiza el valor del indicador NT (next transaction)

Artículos relacionados:

Los métodos para hacer backups

Entendiendo las páginas de la Base de Datos

Eligiendo el tamaño adecuado de las páginas de la Base de Datos

Entendiendo los identificadores de las transacciones

La Next Transaction después de un ciclo backup/restore

Haciendo backups con GBAK (1)

El índice del blog Firebird21

El foro del blog Firebird21

Haciendo backups con GBAK (1)

2 comentarios

El Firebird nos permite realizar copias de seguridad (generalmente llamadas backups) de nuestras bases de datos de varias formas diferentes, tal como ya habíamos visto en:

https://firebird21.wordpress.com/2013/07/03/los-metodos-para-hacer-backup/

Cada uno de esos métodos tiene sus ventajas y sus desventajas, ninguno es perfecto (evidentemente, porque si uno fuera perfecto ¿para qué tendríamos los demás?).

En el presente artículo empezaremos a ver como hacer backups usando para ello el programa GBAK. Como el tema es muy largo, lo trataremos en varios artículos.

¿Qué es el ciclo backup/restore?

Todos sabemos que debemos realizar frecuentemente copias de seguridad de nuestra Base de Datos porque si ocurre un accidente (como el disco duro dañado), la única forma rápida y confiable de recuperar su contenido en todo o en gran parte es a través de una copia de seguridad actualizada. Este proceso tiene dos partes:

  1. Copiar todo el contenido de la Base de Datos en un archivo. A este paso se le llama realizar el backup.
  2. Usar el archivo de backup para obtener una Base de Datos operativa, a ese paso se le llama restaurar la Base de Datos.

Por lo tanto, el ciclo backup/restore significa: crear un archivo de backup y luego restaurarlo.

Hay que enfatizar que el proceso no está completo si solamente se realiza el backup. Hay que realizar ambos, sí o sí: el backup y el restore. O sea: la copia de seguridad y la restauración de esa copia.

¿Qué programa usaremos para realizar el ciclo backup/restore?

El programa se llama GBAK.EXE, y con él podremos:

  • Realizar el backup
  • Restaurar la Base de Datos

¿Qué tareas realiza GBAK.EXE?

Cuando hace el backup:

  • Lee todo el contenido de una Base de Datos y copia ese contenido en otro archivo. Pero no lo copia completo. Los índices por ejemplo no son copiados. Gracias a eso el tamaño de la copia es menor de lo que sería si los hubiera copiado.
  • No copia la basura en el backup (la Base de Datos original continúa con toda la basura que tenía)

Cuando restaura la Base de Datos:

  • Pone el TID de cada fila de cada tabla en 1. (El TID es un número que identifica a la transacción que creó la fila). Por lo tanto es como si todas las millones y millones de filas de las tablas hubieran sido insertadas por una sola transacción.
  • Verifica que cada fila tenga datos válidos
  • Crea los índices
  • Calcula las estadísticas de los índices

¿Dónde se encuentra el programa GBAK.EXE?

En la sub-carpeta \BIN de la carpeta donde está instalado el Firebird, por ejemplo en:

C:\Archivos de Programa\Firebird\Firebird_2_5\Bin\

¿Es necesario que el programa GBAK.EXE se encuentre ahí para hacer un backup?

No. Puedes tener una copia del programa GBAK.EXE en cualquier carpeta de tu disco duro. Por ejemplo si tienes un programa de contabilidad en la carpeta:

D:\MisSistemas\Contabilidad\

en esa misma carpeta podrías tener una copia de GBAK.EXE y entonces tu programa ejecutable (por ejemplo: CONTA.EXE) podría buscarlo a GBAK.EXE allí mismo. O sea que si lo deseas podrías tener a GBAK.EXE en la misma carpeta donde tienes a CONTA.EXE

¿Qué versión de GBAK.EXE debo utilizar?

La misma versión que el Servidor del Firebird. Si por ejemplo tu versión del Firebird es la 2.5.4, entonces deberías siempre usar el programa GBAK.EXE que viene incluido en esa versión.

¿Y si no coincide la versión del Servidor del Firebird con la versión de GBAK.EXE?

Hmmmmmmm, eso no es recomendable. Podría funcionar bien pero … también podrían ocurrir errores, no hay garantías.

Una buena posibilidad para que no ocurran errores es tener al programa GBAK.EXE en una carpeta compartida. Y asegurándote que corresponde a la versión del Firebird que se está usando. Para no confundirte, puedes renombrar a GBAK.EXE para que te indique su versión, algo como: GBAK_2_5_4.EXE para saber que es el correspondiente a la versión 2.5.4 del Firebird.

Ejemplo:

  • En la carpeta compartida D:\EJECUTABLES\ tienes una copia de GBAK.EXE
  • Esa copia de GBAK.EXE coincide con la versión del Firebird que utilizas
  • Como tu versión del Firebird es la 2.5.4 entonces lo renombras como GBAK_2_5_4.EXE
  • Tus programas ejecutables que se encuentran distribuidos en un montón de computadoras (en nuestro ejemplo: CONTA.EXE) cuando necesitan hacer un backup llaman al programa D:\EJECUTABLES\GBAK_2_5_4.EXE

¿Cuáles son las ventajas de usar GBAK.EXE para hacer los backups?

  • Se obtiene una copia completa de la Base de Datos
  • Los usuarios pueden continuar trabajando normalmente mientras se realiza el backup
  • Al restaurar el backup se reconstruyen los índices y sus estadísticas
  • Al restaurar el backup se puede cambiar el tamaño de la página
  • En la Base de Datos restaurada se ha recolectado la basura y se ha realizado el barrido (sweep)
  • Se puede ver que tarea está realizando el programa
  • En el disco duro la Base de Datos restaurada se encuentra (generalmente) menos fragmentada que la Base de Datos original, y por lo tanto todos los accesos son más rápidos

¿Cuáles son las desventajas de usar GBAK.EXE para hacer los backups?

  • El archivo generado no puede ser utilizado directamente, debe ser restaurado con la misma versión de GBAK o con una versión posterior, para poder ser utilizado
  • Si la Base de Datos es muy grande, tanto hacer el backup como la restauración demoran mucho tiempo
  • Si la Base de Datos es muy grande, el archivo de backup también lo será
  • Si la Base de Datos es muy grande, habrá un período de muchos minutos (desde que empezó la ejecución del programa GBAK.EXE hasta que terminó) en que no se contará con un backup actualizado. De todo lo que haya ocurrido dentro de la Base de Datos en ese período no se tendrá un backup.

¿Cuáles son las consecuencias de usar GBAK para hacer backups?

  • La Base de Datos restaurada (si no ocurrieron errores durante la restauración) se encuentra en perfecto estado de salud. Eso significa: índices perfectamente balanceados, estadísticas correctas, nada de basura.
  • En la Base de Datos restaurada todas las filas de todas las tablas que se encontraban en la Base de Datos original ahora tienen un TID (identificador de la transacción) igual a 1.
  • Los identificadores de las transacciones (OAT, OIT, OST, NT) ahora tienen valores muy pequeños. NT (next transaction) no es igual a 1 porque al restaurar se realizan algunas tareas dentro de la Base de Datos y esas tareas inician transacciones. Pero de todas maneras el valor de NT siempre es pequeño, típicamente menos que 100.

¿Por qué en la Base de Datos restaurada algunas consultas son más lentas que en la Base de Datos original?

Uno supondría que en la Base de Datos restaurada, como su salud es perfecta todos los SELECT serían más rápidos que en la Base de Datos original pero … no siempre sucede así.

¿Por qué?

Bien, uno de los métodos que utiliza el Firebird para que las consultas sean muy rápidas es guardar en el caché de la computadora donde se encuentra el Servidor las filas retornadas por los últimos SELECTs.

Si el Servidor se apaga, todo el contenido del caché desaparece (porque se encuentra en memoria RAM, la cual es volátil). Pero en las organizaciones que nunca apagan el Servidor el contenido del caché sirve para agilizar de gran manera a las consultas. Si las filas que solicita un usuario ya se encontraban en el caché entonces desde allí le son entregadas, y eso es muchísimo más rápido que leerlas desde el disco duro.

Sin embargo, al restaurar una Base de Datos el caché se vacía (porque los identificadores de las transacciones cambiaron, ahora ya son todos 1) y entonces hay que reiniciar el proceso de ir cargando el caché.

Como consecuencia, algunas consultas (no todas, solamente las que tenían filas en el caché) serán más lentas en la Base de Datos restaurada que en la Base de Datos original. Claro que esto será solamente durante un corto tiempo, luego será distinto.

¿GBAK siempre realiza el backup correctamente?

No. Y esto es algo súper importante para recordar. Al hacer el backup, GBAK no verifica si los datos que está copiando tienen errores o no. Eso solamente se puede descubrir en el momento de la restauración, nunca en el momento del backup.

Por lo tanto, el backup que realizó GBAK …. puede ser totalmente inservible.

¿Terrible?

Sí, así mismo, eso es. Terrible.

Por ejemplo, una columna definida como NOT NULL tiene valores NULL. Tal cosa no debería ocurrir pero a veces la Base de Datos se corrompe y sucede. GBAK copia esas filas sin ningún aviso, ninguna advertencia, ningún mensaje de error. Sin embargo, al querer restaurar ese backup allí sí se enojará … y finalizará la restauración. El archivo que estaba generando se muere ahí mismo, se vuelve completamente inservible.

Hay métodos para solventar ese problema (que veremos en otro artículo) pero lo importante a recordar es:

JAMÁS SE DEBE CONFIAR EN EL BACKUP. JAMÁS

¿Cómo se puede saber si un backup está correcto?

Ya vimos que al hacer el backup el programa GBAK no nos avisa si la Base de Datos tiene errores. Solamente nos avisa cuando está restaurando, así que por lo tanto….

La única manera de verificar que un backup está ok es restaurándolo.

No hay otra forma.

¿Cuál es la mejor manera de hacer y verificar un backup?

Escribiendo un comando que apenas termine el backup lo restaure, de esa manera enseguida sabremos si nuestro backup es confiable o si por el contrario es inútil (y por lo tanto debemos corregir los errores que tiene y realizar otro backup).

Ese comando es el siguiente:

GBAK -b -user SYSDBA -password masterkey MiBaseDatos.FDB stdout | GBAK -r -user SYSDBA -password masterkey stdin Restaurada.FDB

¿Qué hace este comando?

En lugar de crear un archivo de backup en el disco duro (que es lo normal), lo crea en la salida estándar (stdout). Luego realiza la restauración, tomando como archivo de entrada del segundo GBAK el archivo generado por el primer GBAK.

¿Consecuencia?

Que así hacemos un backup y también una restauración. Y si al restaurar ocurre algún error entonces lo sabremos al instante y podremos corregirlo.

Conclusión:

En el Firebird hay varios métodos para hacer backups, usar el programa GBAK.EXE es uno de esos métodos. Como todo, tiene algunas ventajas y algunas desventajas. Nunca jamás hay que confiar en que el backup está correcto y sin errores porque a veces sí tiene errores. Esos errores solamente pueden descubrirse cuando se está restaurando el backup, es el único momento en que se puede saber si el backup está correcto o no. Por lo tanto, una muy buena política administrativa es apenas terminado el backup intentar la restauración. Si el backup no se puede restaurar es inservible e inútil.

Artículos relacionados:

Los métodos para hacer backup

Backup y restauración al mismo tiempo

Backup y restore a una versión más nueva del Firebird

Entendiendo los identificadores de las transacciones

Entendiendo sweep y garbage collection

La Next Transaction después de un ciclo backup/restore

El ciclo backup/restore usando GBAK

El índice del blog Firebird21

El foro del blog Firebird21