SQL 2019 CTP 2.5 en Docker

En este articulo vamos a ver como probar SQL Server 2019 CTP 2.5 sobre Docker dektop para Windows 10

Instalando Docker

Lo primero que debemos hacer es instalar docker desktop, para ello simplemente debemos bajarlo del siguiente link y luego ejecutar el instalador.

Para comprobar el funcionamiento abrimos una consola de PowerShell o CMD en modo administrador y ejecutamos el siguiente comando.

PS C:\> DOCKER VERSION 

Configurar un disco compartido (shared disk)

Si bien este paso no es un requisito si es recomendable. Lo que haremos aquí es compartir un disco externo al contenedor para así poder tener persistencia de los datos fuera del contenedor, para leer sobre discos compartidos en docker podes acceder al siguiente link .

Para habilitar el shared disk desde docker desktop es bastante simple, como primer paso abrimos el docker desktop y vamos a discos compartidos, en mi caso compartí el disco E de mi SO.

Bajando la imagen de SQL 2019 CTP 2.5

Nuestro siguiente paso es bajar la imagen de SQL Server 2019 CTP 2.5, la misma tiene como base un Linux Ubuntu.

Para esta operación desde la consola de PS o CMD como administrador ejecutaremos el siguiente comando.

PS c:\> docker pull mcr.microsoft.com/mssql/server:2019-CTP2.5-ubuntu

Creando el container

En este paso vamos a crear un contenedor con la imagen que hemos descargado anteriormente, para ello ejecutaremos desde la consola el siguiente comando.

PS c:\> docker run -d -p 15790:1433 --env ACCEPT_EULA=Y 
        --env SA_PASSWORD=123@Passw0rd 
        -v e:\Docker\SQL:/sql --name sql2019ctp 
        mcr.microsoft.com/mssql/server:2019-CTP2.5-ubuntu

El comando creara un contenedor con la imagen de SQL 2019CTP2.5 donde se mapea el puerto 15790 del SO anfitrión contra el 1433 del contenedor. No es requisito cambiar el puerto pero en mi caso ya tengo instalado un SQL Server en mi windows 10 en el puerto 1433.

Con el parametro -V montamos la ruta e:\docker\sql para que nuestro container pueda tener acceso.

Nuestro siguiente paso es iniciar el contenedor, para ellos ejecutaremos el siguiente comando desde la consola.

PS c:\> docker start sql2019ctp

Conectándonos a la instancia de SQL Server

Ahora lo que vamos a hacer es usar una herramienta cliente (en mi caso el Management Studio V18) para podernos conectar a la instancia de SQL Server 2019 CTP 2.5 que esta en el contenedor en el puerto 15790

Como podemos observar en la imagen anterior vemos que la versión es la 15 correspondiente a SQL Server 2019. También probaremos el siguiente comando TSQL para tener mas información de la instancia MSSQL.

select @@version 

Restaurar una base de datos de ejemplo

Nuestro siguiente paso es hacer un restore de la base de datos de ejemplo WideWordl

Para ello lo que vamos a hacer es bajar el archivo .bak
WideWorldImporters-Full.bak y copiarlo en nuestro disco compartido del SO, en mi caso lo copiare en el disco E:\Docker\sql\bkp

Luego desde el SSMS conectado a la instancia haremos un simple restore de ese archivo, podemos hacer que los MDF , LDF y NDF se persistan dentro del container o bien hacerlo afuera, esto ultimo nos daría la ventaja de no perder luego esos archivos al borrar el container.

Aquí para acceder a nuestro recurso compartido simplemente ponemos /SQL el cual fue mapeado con la unidad cuando creamos el container y en donde tendremos nuestro archivo .bak a restaurar.

El siguiente código TSQL hace el restore de nuestra base

USE [master]
RESTORE DATABASE [WideWorldImporters] 
FROM  DISK = N'/sql/Bkp/WideWorldImporters-Full.bak' WITH  FILE = 1,  
MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',  
MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',  
MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',  
MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',  
NOUNLOAD,  STATS = 5
GO

Ahora lo que haremos con la base restaurada en nuestro container con SQL 2019 es cambiarle el modo de compatibilidad a 150.

Conclusiones

En este post no solo hemos visto como podemos probar la versión beta de SQL Server 2019 sino que también como montarla en un container de docker

SSMS v18 GA

Se ha liberado la versión 18 de SQL Server Management Studio la cual contiene muchas novedades comparada con su versión anterior.

Entre las distintas novedades podemos destacar:

  • Soporte para SQL Server 2019 (Compatibilidad 150)
  • Integración con Azure data Studio
  • Database Upgrade compatibility level
  • Soporte de SQL Managed Instance
  • Varias mejoras en el editor
  • Arreglos de varios Fix
  • Menor tamaño de instalador
  • Instalación en una custom path
  • No hay más componentes ligados al Engine
  • Un solo instalador múltiple idioma

Desde el siguiente link puede descargar la versión final de SSMS V18

Herramienta gratuita y open source para monitoreo de MSSQL

Como tarea habitual de un DBA esta la de poder monitorear las instancias de MSSQL para asi conocer su estado de salud y determinar cambios de comportamiento a lo largo del tiempo.

Para hacer esta tarea se pueden utilizar herramientas que ya viene con Windows o el propio motor SQL como por ejemplo (Performance monitor, query store, profiler, events, etc) o bien comprar alguna tool del mercado la cual nos ayude en dicha tarea.

En este post voy a mencionar una herramienta totalmente gratis y open source la cual recolecciona diferentes datos de performance para luego guardarlos en una base de datos y explotarlos con PowerBI Dekstop, no te pierdas el curso online de abril sobre monitoreo donde no solo mostraremos esta tool sino que algunas para ayudar en esta ardua tarea.

SQLWATCH.IO es una herramienta open source muy simple de instalar la cual recolecta datos de tu instancia y los aloja en una base de datos propia para luego poderlos explotar con herramientas como powerbi (de hecho ya viene con un archivo de pbix con reportes armados)

La misma la pueden descargar del siguiente link o bien acceder al proyecto publicado en Github

Como clonar una base de datos para resolver problemas de performance

Es una tarea habitual en las distintas organizaciones tener un ambiente productivo donde sucedan problemas de performance y se necesite pasar a un ambiente de testing para determinar sus causas.

Para poder hacer esta tarea lo habitual es hacer una copia de la base de datos en cuestión al otro ambiente para luego trabajar sobre ella y poder hacer el diagnostico correspondiente.

Ahora bien, ¿ que sucede si la base de datos es muy grande? , es probable que actualizar estos ambientes pueda no solo demorar un buen tiempo sino que además consumir recursos.

Las técnicas habituales para pasar estas bases de datos a los ambientes de testing para este tipo de tareas suele ser hacer un Backup y Restore en donde se copia no solo la estructura (schema) sino que ademas todos los datos.

En este post veremos como usar el comando DBCC CLONEDATABASE introducido en el SP2 de SQL 2014.

DBCC CloneDatabase

Este nuevo comando tiene la ventaja que hace un clone de la base de datos pero solo de su estructura, permitiendo así disminuir los tiempos y ademas no consumir los mismos recursos de disco que si hacemos un Backup / Restore.

Ahora bien, ¿como entonces podemos hacer analisis de performance si no tenemos datos?, la respuesta es porque el clonedatabase copia estructuras y estadísticas de la base pero además la deja en un estado de readOnly

Ejemplo

Vamos a ponernos a trabajar y ver un ejemplo en el donde necesitamos analizar unos planes de ejecución para diagnosticar un problema de performance que tenemos en producción.

Tenemos las dos siguientes consultas que generan dos planes de ejecución distintos ante el cambio de un dato

USE ADVENTUREWORKS2014 
GO

SELECT SALESORDERDETAILID, ORDERQTY
FROM SALES.SALESORDERDETAIL
WHERE PRODUCTID = 897;

SELECT SALESORDERDETAILID, ORDERQTY
FROM SALES.SALESORDERDETAIL
WHERE PRODUCTID = 870;

Para replicar este caso en un ambiente de testing vamos a clonar la base de datos (sólo estructuras y estadísticas)

DBCC CLONEDATABASE (ADVENTUREWORKS2014, ADVENTUREWORKS2014_CLONE);    
GO 

Al terminar este comando sobre la instancia vamos a observar el siguiente mensaje

Database cloning for ‘AdventureWorks2014’ has started with target as ‘ADVENTUREWORKS2014CLONE’.
Database cloning for ‘AdventureWorks2014’ has finished. Cloned database is ‘ADVENTUREWORKS2014CLONE’.
Database ‘ADVENTUREWORKS2014CLONE’ is a cloned database. This database should be used for diagnostic purposes only and is not supported for use in a production environment.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Si observamos en nuestro SSMS veremos la nueva base de datos en modo ReadOnly y sin datos.

Ahora nos conectaremos a nuestra base de datos clonada para poder replicar la query que corrimos en producción y observaremos que el plan de ejecución es el mismo

USE ADVENTUREWORKS2014CLONE
GO
SELECT SALESORDERDETAILID, ORDERQTY
FROM SALES.SALESORDERDETAIL
WHERE PRODUCTID = 897;
 
SELECT SALESORDERDETAILID, ORDERQTY
FROM SALES.SALESORDERDETAIL
WHERE PRODUCTID = 870;

Conclusiones

El uso de DBCC CloneDatabase puede ayudarnos mucho en este tipo de tareas de análisis de tuning o bien cuando queremos clonar toda una base de datos sin sus datos.

La operación se debe hacer sobre la misma instancia, por lo cual es muy frecuente hacer el clone sobre producción y luego hacer un backup y restore de esa base en tu ambiente de testing.

Esta instrucción además permite clonar datos del Query Store y también backups.