Introducción Insert Bulk Bestia
Introducción
Existen infinidad de métodos de copia de datos desde una base de datos a otra, sin embargo, aquí se presenta una herramienta que realiza dicha operación de una forma muy flexible y eficiente. Dicha aplicación también se encarga de gestionar muchas de las operaciones que normalmente se realizan de forma manual durante las copias de datos. Así, entre otras, la aplicación se adapta perfectamente a las siguientes necesidades:
- Proyectos sobre bases de datos que están en continua evolución. Ello implica que las bases de datos de preproducción (staging) o de desarrollo (development) requieran de parte de los datos existentes en producción.
- Copia entera de los datos de la base de datos sin recurrir a la restauración de un backup. Los motivos de esta acción pueden ser diversos. Insert Bulk Bestia será, sin duda, la mejor opción.
- La actual ley de protección de datos, obliga a realizar una ocultación de determinados datos. Junto a las posibilidades que SQL Server ofrece, Insert Bulk Bestia va a permitir realizar una ocultación personalizada.
- Realizar copias de datos desde una base de datos de producción ONLINE. Se puede configurar Insert Bulk Bestia para que afecte mínimamente al rendimiento del servidor de producción, a la vez que mantiene la consistencia de los datos una vez finalizada la copia de los mismos.
SqlBulkCopy
Insert Bulk Bestia se basa en la utilización de instrucciones SqlBulkCopy de .NET en paralelo con el fin de minimizar el tiempo empleado en la copia de datos. La estrategia utilizada en esta paralelización consiste en comenzar por las tablas más pesadas, y en paralelo realizar la copia de las tablas más ligeras. Esto, permite, en muchos casos, que el tiempo que dura la copia se reduce al tiempo empleado en la copia de la tabla que ocupa más espacio en disco.
Además de la documentación proporcionada por Microsoft, se recomienda una lectura en profundidad del artículo: Whitepaper: performance of SqlBulkCopy. Dicho artículo le permitirá obtener los conocimientos necesarios para decidir la configuración apropiada de la aplicación de forma que obtenga el máximo rendimiento a partir del hardware de que disponga.
Índices
Durante las diferentes pruebas realizadas con la aplicación en varios proyectos, se observó que la mejor estrategia a utilizar consistía en: eliminar los índices de las tablas de destino, realizar la copia de datos y volver a construir los índices en el destino.
Sin embargo, en determinadas ocasiones, esta estrategia no funcionaba correctamente. Se comprobó que cuando el índice cluster de una determinada tabla es muy grande (ocupa mucho espacio en disco) la mejor estrategia era la de no eliminación de dicho índice. Por ello, en Insert Bulk Bestia se introdujo un parámetro para indicar a partir de qué tamaño de índice, los índices cluster no se eliminan. Dicho parámetro debe ser establecido de forma experimental en función de las características del hardware y software disponible.
Restricciones y Foreing Keys
Con el fin de aumentar el rendimiento de la copia de datos, Insert Bulk Bestia elimina las restricciones existentes en las tablas de destino y deshabilita los triggers. La estrategia implementada en Insert Bulk Bestia supone que los datos ya cumplen las condiciones necesarias para ser insertados en las tablas, ya que se está realizando una copia de datos desde una base de datos origen a otra de destino de "prácticamente" idénticas características.
La eliminación de las restricciones y triggers, en especial las Foreing Keys, permite abstraerse de la lógica de negocio, y, por ejemplo, olvidarse de las dependencias circulares entre tablas. Como consecuencia, es posible realizar copias de bases de datos que se encuentran ONLINE, ya que una vez copiados los datos, Insert Bulk Bestia se encarga de eliminar aquellos registros que impiden levantar una determinada Foreing Key. Puede ocurrir que durante la copia, la base de datos original haya sido modificada y determinados registros no hayan sido copiados.
Parametrización de la Copia de Datos
Insert Bulk Bestia realiza una parametrización "por defecto" de los datos a copiar para que estos sean copiados tal cual desde una base de datos a otra. Sin embargo, el operador de la aplicación puede realizar una parametrización manual de la carga para modificar dicho comportamiento. Así, se permite:
- Clasificación de tablas: Las tablas pueden clasificarse por grupos para posteriormente indicar a Insert Bulk Bestia qué grupos de tablas se desean cargar.
- Segmentación de tablas: A las tablas se le puede indicar una cláusula "WHERE" de forma que segmente la tabla y se permita así una carga en paralelo de la tabla total, o bien, realizar una copia, de, por ejemplo, el último segmento correspondiente a los datos más recientes de la tabla.
- Transformación de datos: A las tablas se le puede indicar una cláusula "SELECT" de forma que se puedan realizar transformaciones a los datos, ya sea para la ocultación de los mismos o realizar operaciones complejas sobre los mismos.
- Filtrado de datos: Además de la segmentación indicada anteriormente, la cláusula "WHERE" puede utilizarse para un filtrado de datos, de forma que no se copien la totalidad de los datos desde el origen al destino.
Acciones Personalizadas
Insert Bulk Bestia permite al operador de la aplicación la programación de acciones que se ejecutan en determinados momentos de la copia de datos:
- Acciones en el origen: Estas acciones se ejecutan tras el análisis de las tablas de la base de datos origen. Deberían contener acciones que modifiquen de forma automática la selección de datos del origen, o la realización de una clasificación automática de tablas. Por ejemplo, estás acciones deberían modificar de forma automática las SELECT o WHERE indicados en el apartado anterior.
-
Acciones en el destino:
- Acciones iniciales: Son acciones que se ejecutan inmediatamente antes de que se inicie la copia de datos. Pueden ser acciones orientadas a la realización de chequeos de la estructura de la base de datos de destino, o pueden estar orientadas a modificar los campos de destino donde se guardarán los datos.
- Acciones finales: Son acciones que se ejecutarán tras la finalización de la carga. Pueden usarse para realizar transformaciones finales a los datos, como eliminar correos electrónicos o enmascaramiento personalizado de datos.
Librerías SQLCLR
Insert Bulk Bestia crea, en SQL Server, la tabla "ibb.Log_Errores", en la cual se vuelca toda la información asociada a la copia de datos, junto con los errores que se pudiesen producir. Dicha tabla, y los procedimientos almacenados asociados, pueden ser de gran utilidad en sus propios desarrollos.
Además, se insertan en SQL Server una serie de librerías .NET con las que se optimiza el funcionamiento de la aplicación, y que también pueden ser de utilidad en sus propios desarrollos:
- Transacciones autónomas (SQLServerAutonomousCalls): Esta librería de .NET permite insertar registros en la tabla "ibb.Log_Errores" simulando las transacciones autónomas de Oracle. En otras palabras, el registro insertado en la tabla permanecerá en ella aunque se ejecute una sentencia ROLLBACK.
- Tratamiento de cadenas de caracteres (SQLServerSafeFunctions): Esta librería procesa, de la forma mas eficiente posible, cadenas de caracteres para convertirlas en tablas. Una de ellas, crea una tabla de un sólo campo a partir de una cadena de caracteres y un separador. La otra, crea una tabla de dos campos (parejas clave - valor) a partir de una cadena de caracteres, un separador de campos y un separador de registros.
- Ejecución en paralelo de procesos T-SQL (SQLServerAsyncExecProcedures): Esta librería contiene una serie de procedimientos almacenados que permiten la ejecución en paralelo de sentencias y/o procedimientos almacenados escritos en T-SQL. Es de gran utilidad en aquellos procesos en que no es necesario la ejecución secuencial de querys, como por ejemplo, la reconstrucción de índices en paralelo o el trasvase de datos en paralelo a través de un "linked server" mejorando las pobres prestaciones que este método ofrece.
Interfaz de Usuario - Línea de comandos
Insert Bulk Bestia contiene una interfaz de usuario con el cual el operador de la aplicación puede definir el comportamiento de la copia de datos de un origen a un destino de una forma muy "amigable". Cada una de esas copias de datos, se denomina "configuración", y se almacena en un fichero ".ini". Desde dicho interfaz de usuario se podrá administrar todas las configuraciones definidas.
Sin embargo, con el fin de poder automatizar las cagas de datos, Insert Bulk Bestia también puede operar desde línea de comandos, de tal forma que pueda ser llamado desde gestores de procesos tipo Control-M. Desde línea de comandos se podrá indicar que "configuraciones" se desean ejecutar. La aplicación devolverá un 0 si las configuraciones se han ejecutado correctamente o un valor distinto de 0 si alguna ha fallado.
Ventajas
Indudablemente, la gran ventaja de Insert Bulk Bestia es la personalización de "qué datos" se desean copiar de una base de datos a otra, y "qué transformaciones" se desean realizar a dichos datos. No es una estrategia de backups, sino una copia de "parte" de los datos desde una base de datos origen a una de destino.
Se libera al operador de la herramienta de tener que definir una estrategia de copia de datos según la lógica de negocio definida, ya que la aplicación va a "desmontar" la estructura de la base de datos de destino, copiará los datos y volverá a montar dicha estructura. Ello hará que la base de datos de destino se encuentre en unas condiciones casi "óptimas" para ser usada, ya que contará con índices totalmente nuevos, estadísticas nuevas, y, dependiendo de la parametrización, podría contar con una mínima fragmentación interna de datos e índices.
Todo ello se realiza con un uso eficiente de los recursos hardware y software disponibles, que unido a la posibilidad de programar la repetición de este tipo de tareas periódicamente, puede dar lugar a ser una aplicación imprescindible en los proyectos cuya evolución es constante.
Las librerías que Insert Bulk Bestia inserta en SQL Server son lo suficientemente genéricas, eficientes y útiles que hace que sus propios desarrollos pueden beneficiarse ampliamente de su uso.
Por último, señalar que existen infinidad de herramientas y aplicaciones que permiten realizar este proceso, pero ninguna de ellas contempla todos los aspectos que Insert Bulk Bestia incluye.
Inconvenientes
Al contrario que los backups, este proceso, sin lugar a dudas, es mucho más costoso en consumo de recursos y tiempo. Y sin lugar a dudas, es más costoso de configurar y poner "a punto" para un correcto funcionamiento. Es el coste asociado a no distribuir los backups de producción al resto de entornos, donde puede peligrar la seguridad de los datos.