Migrar base de datos de MSSQL desde Windows a Ubuntu y/o Docker

Migrar base de datos de MSSQL desde Windows a Ubuntu y/o Docker

Ruperto Coronado
Ruperto Coronado

Hay dos maneras:

  1. Usando como fuente un archivo .bak
  2. Moviendo los archivos .mdf y .ldf

1. Usando un archivo .bak

Creo yo que este es el método más correcto y fácil si tienes acceso al servidor origen.

La complejidad quizá radique en crear el volumen compartido entre el host y el contenedor de MSSQL, pero tranquilo:

Agrega esto a tu archivo docker-compose.yml:

volumes:
  - ./sqlvolume:/var/opt/mssql
  - ./backups:/backups

El primer volume te da acceso rápido a la carpeta de trabajo de MSSQL:

 ls -l sqlvolume/
total 16
drwxr-xr-x 2 root root 4096 Sep 4 06:45 data
drwxr-xr-x 2 root root 4096 Sep 4 06:49 log
drwxr-xr-x 2 root root 4096 Oct 9 2025 secrets

Dentro de la carpeta ./sqlvolume/data es donde viven los archivos mdf y ldf.

Y el volume backups te permite tener un acceso rápido a una carpeta donde guardar o copiar los backups, así tu comando de backup en sqlcmd se reduce a:

BACKUP DATABASE mi_base_de_datos TO DISK='/backups/mibackup.bak'

Y desde el host siempre tendrás acceso rápido a la carpeta backups porque es un volume.

Bien. Suponiendo que copiaste tu archivo .bak a la carpeta (volumen) backups, será necesario usar sqlcmd para restaurar el respaldo.

(Si aún no tienes instalado sqlcmd en tu terminal, puedes ver la guía sobre cómo instalar sqlcmd en Ubuntu 24.04 y agregarlo a bashrc y zshrc).

Para restaurar la base de datos dentro del contenedor ejecutamos:

sqlcmd -S localhost -U sa -P 'TuPassword' -Q "RESTORE DATABASE mi_base_de_datos FROM DISK = '/backups/mibackup.bak' WITH MOVE 'mi_base_de_datos' TO '/var/opt/mssql/data/mi_base_de_datos.mdf', MOVE 'mi_base_de_datos_log' TO '/var/opt/mssql/data/mi_base_de_datos_log.ldf', REPLACE"

2. Moviendo los archivos .mdf y .ldf

Si no cuentas con un respaldo .bak, puedes detener el servicio en el servidor de origen, copiar los archivos .mdf y .ldf directamente a la carpeta ./sqlvolume/data en tu host, y luego adjuntarlos (attach) ejecutando:

CREATE DATABASE mi_base_de_datos   
ON (FILENAME = '/var/opt/mssql/data/mi_base_de_datos.mdf'),   
   (FILENAME = '/var/opt/mssql/data/mi_base_de_datos_log.ldf')   
FOR ATTACH;