Migrar base de datos de MSSQL desde Windows a Ubuntu y/o Docker
Hay dos maneras:
- Usando como fuente un archivo .bak
- 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
sqlcmden 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;