En algunas situaciones debido al gran impacto de un cambio, especialmente en producción, es necesario realizar un backup de base de datos, pero ¿cómo se haría si esa base de datos se encuentra en un contenedor de Docker? bueno aquí te explico cómo.
Precondiciones y asunciones
Este post ha sido construido con las siguientes precondiciones y asunciones:
- El lector cuenta con una base de datos de SQL Server 2019 en un contenedor de Docker.
- Si no cuentas con una, ¡no te preocupes! puedes aprender hacerlo en este post, creado por mí, obvio.
- El contenedor de Docker se encuentra alojado en una máquina con Windows 10 o superior.
- Se tiene conocimiento de contraseña del usuario SA.
Preparando el terreno
Vamos a crear una pequeña base de datos en nuestra instancia de SQL Server 2019 dentro de Docker, si ya cuentas con una puedes saltarte este paso.
Conéctate a tu instancia de SQL Server 2019 y ejecuta el siguiente script:
CREATE DATABASE [GameLibrary];
GO
USE [GameLibrary];
GO
CREATE TABLE Titles (
id int primary key identity,
title nvarchar(60) not null,
description nvarchar(500),
available bit not null default 1
);
GO
INSERT INTO Titles (title, description, available) values
(N'League of Legends', N'MOBA game', 1)
,(N'Halo: Master Chief Collection', N'Halo <3', 1)
,(N'Life is Strange', N'Save the bay or the bae', 1)
,(N'My personal game', N'A game made by me xd', 0);

Ya con esto, estamos listos para empezar 🙂
Empezamos
Vamos a crear una carpeta en la ruta D:\backups de nuestra máquina para guardar el backup, para ello abrimos PowerShell y ejecutamos el siguiente comando:
New-Item D:\backups -ItemType Directory -Force
Si deseas guardar el backup en otra ruta, cambia la parte resaltada por la ruta deseada.

Ahora vamos a definir unas cuantas variables para que la ejecución del comando final sea más concreta.
Primero vamos a definir una variable llamada $CONTAINER_NAME para indicar el nombre del contenedor donde se encuentra la instancia de SQL Server 2019, en mi caso se llama infallible_colden, esto lo hacemos con el siguiente comando:
$CONTAINER_NAME = 'infallible_colden'
Cambia la parte resaltada por el nombre de tu contenedor.
Ahora, vamos a definir una variable llamada $DATABASE_NAME para indicar el nombre de la base de datos a la cual queremos sacar el backup, en mi caso, es GameLibrary:
$DATABASE_NAME = 'GameLibrary'
Cambia la parte resaltada por el nombre de tu base de datos.
Luego, definiremos otra variable llamada $FILE_NAME para indicar cómo se debe llamar el archivo con extensión .bak donde quedará el backup, en mi caso, pondré GameLibrary.bak:
$FILE_NAME = 'GameLibrary.bak'
Cambia la parte resaltada por el nombre de archivo deseado. ¡No olvides la extensión .bak!
Esta última variable llamada $HOST_BACKUP_PATH es para indicar la ruta completa donde vamos a dejar nuestro backup en nuestra máquina local, es un poco especial la construcción, pero básicamente es la combinación de nuestra carpeta de backup que creamos más arriba contra la variable $FILE_NAME que ya hemos definido. El comando es el siguiente:
$HOST_BACKUP_PATH = "D:\backups\${FILE_NAME}"
Cambia la parte resaltada por la ruta a la carpeta de backup que creaste.
Realizar el backup
Listo, ya que tenemos todas esas variables definidas, necesitamos ejecutar el siguiente comando para realizar el backup:
docker exec -it "$CONTAINER_NAME" /opt/mssql-tools/bin/sqlcmd -b -V16 -S localhost -U SA -Q "BACKUP DATABASE [${DATABASE_NAME}] TO DISK = N'/var/opt/mssql/backups/${FILE_NAME}' with NOFORMAT, NOINIT, NAME = '${DATABASE_NAME}-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
El comando te va a solicitar la contraseña para el usuario SA, por favor escríbela y dale Enter para continuar:

Finalmente, sólo necesitamos sacar el backup que está dentro del contenedor a nuestra máquina local, para ello ejecutamos el siguiente comando:
docker cp "${CONTAINER_NAME}:/var/opt/mssql/backups/${FILE_NAME}" "${HOST_BACKUP_PATH}"
¡y listo!, puedes ir a tu carpeta de backup a comprobar el archivo .bak creado 😉

La ejecución completa de todos los comandos debería de ver más o menos así:

Eso es todo por el momento, luego volveré creando un post complementario para poder restaurar un backup de SQL Server 2019 en una instancia que se encuentra dentro de un contenedor de Docker, así que quedamos pendientes.
Enlaces de interés
Te invito a visitar los siguientes enlaces, gran parte de la información mostrada en este post ha sido recopilada de estas.
Gracias 🙂