Migrando desde SQL Server hacia Cosmos DB (Migration Tool)

Existe una herramienta desarrollada por el equipo de Microsoft Azure para realizar migracion de datos hacia Azure Cosmos DB. Esta herramienta permite importar datos desde varias fuentes como: JSON files, CSV files, SQL, MongoDB, Azure Table storage, Amazon DynamoDB, e incluso Azure Cosmos DB SQL API.

Esta vez realizaremos la importación desde SQL Server y validaremos como establece las relaciones de las tablas o que opciones tenemos para controlar la forma en la que importamos los datos.

Primero vamos revisar nuestros objetos/tablas (esquema BD) en SQL Server, después ejecutaremos la herramienta y veremos como resuelve cada objeto, y como resuelve los campos con su tipo de dato.

Migration Tool

 

SQL Server (source)

Como fuente de datos vamos a usar la tabla DimProduct de la clasica BD de AdventureWorksDW. La tabla contiene:

DimProduct – AdeventureWorksDW

Como podemos ver en la imagen tenemos suficientes tipos de datos para probar. Tenemos incluso el tipo varbinary.

Nuestra llave primaria en esta caso esta sobre el campo ProductKey esto debemos tenerlo en cuenta al momento de la migración. La herramienta nos permite establecerlo.

Cosmos DB (target)

Para el destino debemos habilitar el servicio de Cosmos DB, lo podemos hacer hacia el emulador de Cosmos DB (lo puede descargar aqui) o podemos crear el servicio desde el portal de Azure.

Si tenemos el emulador se debería de abrir una pagina en localhost que se ve asi:

Azure Cosmos DB Emulator

Como se puede ver en la imagen no existe ninguna DB y ninguna colección. De esta parte solo debemos de validar que podamos ejecutar el emulador correctamente y recuperar los datos para la conexión.

En el caso del emulador los parámetros de conexión son:

Estos parámetros son los predefinidos por el emulador. Podemos cambiarlos ejecutando el emulador desde la consola.

Migration Tool

La herramienta de migración la podemos descargar de aquí.

Ejecutamos la herramienta en modo UI (dtui.exe) y se abrirá la siguiente ventana:

Migration Tool – Source

Y lo primero que debemos indicar es la fuente de datos. En la imagen podemos ver todas las fuentes de datos que podemos ocupar. En este caso vamos a ocupar SQL para conectarnos a la base de datos de AdventureWorksDW.

Al momento de seleccionar la fuente como SQL debemos de configurar la conexión hacia el servidor y base de datos con una cadena de conexión, y adicional debemos definir un query con el que obtiene los registros para migrar. Esto facilita bastante porque incluso podríamos hacer un join entre distintas tablas para formar una sola entidad/documento.

Migration Tool – Source SQL

Nos permite escribir directamente un query o seleccionar un archivo que lo contenga, este es mi query:

Cada una de las columnas que incluye la sentencia se creara como propiedad dentro de la entidad/documento dentro de Cosmos DB con el mismo nombre.

Le damos siguiente. Y ahora nos solicita configurar el destino, que en nuestro caso sera Cosmos DB. Debemos indicar los parámetros de conexión, y los datos de la base de datos y nombre de la colección. En caso de que no exista alguno lo creara.

Migration Tool – Target

Veamos cada uno de los parámetros que estamos estableciendo:

Export to: Aquí nos permite establecer la importación de forma secuencial definiendo el valor de partición.

Connection String: Definimos los parámetros de conexión hacia Cosmos DB, en nuestro caso estamos ocupando el emulador local. Y la cadena queda separada por “;”.

Aquí también estoy definiendo el nombre de la base de datos como: migrationdb

Collection: El nombre de la colección, si no existe la crea.

Partition Key: En este caso vamos manejar las particiones de forma ilimitada (unlimited auto-scaling partitioning) por lo tanto debemos definir nuestra llave de partición. Establecemos la llave de partición la linea del producto que se encuentra en la propiedad ProductLine. La sintaxis establece que se debe indicar con “/” esto es porque podríamos seleccionar una propiedad que se encuentra a mayor profundidad en nuestro objeto. Ej. “/prop1/deep1/deep2”

Collection Throughput: Para poder implementar el auto-particionado o tener nuestro indice en forma ilimitada lo mínimo que podemos establecer como RU (request unit) son 1,000 o mas.

Id Field: Aquí definimos la propiedad que funcionara como id único, en nuestro caso ocupamos la propiedad ProductKey.

Le damos siguiente. Podemos establecer un archivo de log.

Finalmente ejecutamos la importación.

Migration Tool – Results

Como podemos ver la imagen finalizo correctamente la importacion de los 606 registros. Ahora vamos a ver que hay en el explorador del emulador:

Azure Cosmos DB Emulator

Vemos que hizo la creación de la base de datos y colección. También podemos ver que hizo la inserción de los registros correctamente.

Ahora vamos a ver como resolvió el tipo varbinary:

Varbinary field

El campo LargePhoto es varbinary y vemos que lo resolvió como un arreglo de enteros (no es buena idea guardar binarios sobre un indice en Comos DB). Vemos que la codificación de caracteres también lo resolvió de forma correcta:

Encoding

Es de gran utilidad esta herramienta incluso cuando cambiamos la forma de particionar del indice y tenemos que migrar los datos.

Troubleshooting: Algunas veces manda un error la conexión hacia el emulador al momento de ejecutar el ultimo. Nada mas reinicia el emulador.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *