Guía Para Restaurar Bases de Datos en SQL Server 2019 Usando Línea de Comandos
Bienvenidos a nuestra guía paso a paso sobre cómo restaurar bases de datos en SQL Server 2019 mediante el uso eficiente de la línea de comandos. Este método es una herramienta poderosa para los administradores de bases de datos que buscan garantizar la integridad y continuidad de sus datos.
Preparativos Iniciales
Antes de comenzar la restauración de la base de datos, es esencial contar con acceso al contenedor sqlserver-1
y poseer una copia de seguridad de la base de datos que deseas restaurar. Estos pasos preliminares son cruciales para un proceso de restauración exitoso.
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
docker logs -n 50 sqlserver-1
- Asegúrate de que el contenedor esté UP y que el puerto 1433 esté mapeado si te conectarás desde el host.
- Revisa logs para confirmar que SQL Server terminó de inicializar (SQL Server is now ready for client connections).
Lo ideal es montar un volumen persistente. Alternativas:
# Opción 1: copiar al contenedor (temporal)
/bin/bash -lc 'docker cp ./backup.bak sqlserver-1:/var/opt/mssql/backup/backup.bak'
# Opción 2: usar volumen/bind mount al crear el contenedor
docker run -d --name sqlserver-1 \
-e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Strong!Passw0rd' \
-p 1433:1433 \
-v $(pwd)/backups:/var/opt/mssql/backup \
mcr.microsoft.com/mssql/server:2019-latest
/var/opt/mssql/data
. Asegúrate de que el archivo .bak
tenga permisos de lectura para el usuario del servicio SQL (mssql
).
Conectarse al Contenedor SQL Server
El primer paso es acceder a tu contenedor de SQL Server. Para esto, abre tu terminal o línea de comandos y ejecuta el siguiente comando:
docker exec -it sqlserver-1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<TuContraseña>'
Recuerda reemplazar <TuContraseña>
con la contraseña específica de tu usuario SA para establecer una conexión segura.
Variantes útiles
- Usar variable de entorno para no escribir la contraseña en el historial:
docker exec -it -e SQLCMDPASSWORD='<TuContraseña>' sqlserver-1 \ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA
- Conectarte desde el host si tienes
sqlcmd
instalado:sqlcmd -S 127.0.0.1,1433 -U SA -P '<TuContraseña>'
- Usar archivo .env y Docker secrets (en Swarm/K8s) para gestionar credenciales de forma segura.
Restauración de la Base de Datos
Una vez estés dentro del contenedor y conectado a la instancia de SQL Server, el siguiente paso es llevar a cabo el comando de restauración. Para ello, asegura tener el archivo de copia de seguridad de la base de datos en un directorio accesible por el contenedor.
RESTORE DATABASE [NombreDeTuBaseDeDatos]
FROM DISK = '/path/to/your/backup.bak'
WITH MOVE 'NombreDeTuBaseDeDatos' TO '/var/opt/mssql/data/NombreDeTuBaseDeDatos.mdf',
MOVE 'NombreDeTuBaseDeDatos_Log' TO '/var/opt/mssql/data/NombreDeTuBaseDeDatos_log.ldf',
STATS = 10;
Este comando facilita la restauración de tu base de datos desde el archivo de copia de seguridad especificado, adaptando las rutas y nombres de archivos según tus necesidades.
-- 1) Ver el encabezado del backup
RESTORE HEADERONLY FROM DISK = '/path/to/your/backup.bak';
-- 2) Ver la lista de archivos lógicos para usar en MOVE
RESTORE FILELISTONLY FROM DISK = '/path/to/your/backup.bak';
-- 3) Verificar integridad del backup sin restaurar
RESTORE VERIFYONLY FROM DISK = '/path/to/your/backup.bak' WITH CHECKSUM;
- Con FILELISTONLY obtienes los nombres lógicos exactos de data y log.
- Con VERIFYONLY detectas problemas de corrupción antes de gastar tiempo en un restore completo.
-- Forzar acceso exclusivo, descartar conexiones activas y reemplazar
ALTER DATABASE [NombreDeTuBaseDeDatos] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [NombreDeTuBaseDeDatos]
FROM DISK = '/path/to/your/backup.bak'
WITH REPLACE, STATS = 10,
MOVE 'NombreDeTuBaseDeDatos' TO '/var/opt/mssql/data/NombreDeTuBaseDeDatos.mdf',
MOVE 'NombreDeTuBaseDeDatos_Log' TO '/var/opt/mssql/data/NombreDeTuBaseDeDatos_log.ldf';
ALTER DATABASE [NombreDeTuBaseDeDatos] SET MULTI_USER;
Aceleradores de rendimiento
RESTORE DATABASE [NombreDeTuBaseDeDatos]
FROM DISK = '/path/to/your/backup.bak'
WITH STATS = 10,
MAXTRANSFERSIZE = 4194304, -- 4 MB
BUFFERCOUNT = 64; -- Ajusta según CPU/IO
Ajusta MAXTRANSFERSIZE
y BUFFERCOUNT
de acuerdo a tu hardware/IO. Usar backups comprimidos reduce tiempo y espacio.
Verificación de la Restauración
Es imperativo verificar que la restauración se ha completado con éxito. Para ello, puedes revisar las bases de datos disponibles en tu instancia de SQL Server usando el comando:
SELECT name FROM sys.databases;
Confirma la presencia y disponibilidad de tu base de datos restaurada en la lista resultante para asegurar que el proceso ha sido exitoso.
-- Estado de la base
SELECT name, state_desc, recovery_model_desc FROM sys.databases
WHERE name = 'NombreDeTuBaseDeDatos';
-- Historial de restauración (msdb)
SELECT r.destination_database_name, r.user_name, r.restore_date, b.backup_finish_date
FROM msdb.dbo.restorehistory r
JOIN msdb.dbo.backupset b ON r.backup_set_id = b.backup_set_id
WHERE r.destination_database_name = 'NombreDeTuBaseDeDatos'
ORDER BY r.restore_date DESC;
-- Chequeo de consistencia
DBCC CHECKDB ('NombreDeTuBaseDeDatos') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Asegura que la base está en ONLINE, revisa el historial y ejecuta CHECKDB
para detectar corrupción lógica.
- Sincroniza logins huérfanos:
-- Ejemplo: reparar usuario mapeando SID del login ALTER USER [usuario_app] WITH LOGIN = [login_app];
- Activa el modo adecuado:
ALTER DATABASE [NombreDeTuBaseDeDatos] SET RECOVERY FULL; -- si requiere backups de log
- Revisa collation, compatibilidad y jobs dependientes (SQL Agent).
Casos Avanzados de Restauración
-- 1) Full backup con NORECOVERY
RESTORE DATABASE [DB] FROM DISK='/backups/db_full.bak' WITH NORECOVERY;
-- 2) Differential con NORECOVERY
RESTORE DATABASE [DB] FROM DISK='/backups/db_diff.bak' WITH NORECOVERY;
-- 3) Uno o varios logs (en orden)
RESTORE LOG [DB] FROM DISK='/backups/db_log1.trn' WITH NORECOVERY;
RESTORE LOG [DB] FROM DISK='/backups/db_log2.trn' WITH NORECOVERY;
-- 4) Traer la base en línea
RESTORE DATABASE [DB] WITH RECOVERY;
Usa NORECOVERY para aplicar múltiples backups secuenciales y RECOVERY al final.
-- Restablecer hasta una marca temporal específica
RESTORE DATABASE [DB] FROM DISK='/backups/db_full.bak' WITH NORECOVERY;
RESTORE LOG [DB] FROM DISK='/backups/db_log.trn' WITH STOPAT = '2025-08-10T10:15:00', RECOVERY;
-- Ejemplo: base con varios datafiles
RESTORE DATABASE [DB]
FROM DISK = '/backups/db_full.bak'
WITH MOVE 'DB' TO '/var/opt/mssql/data/DB.mdf',
MOVE 'DB_Idx' TO '/var/opt/mssql/data/DB_Idx.ndf',
MOVE 'DB_Log' TO '/var/opt/mssql/data/DB_Log.ldf',
STATS=10;
Cuando hay varios datafiles (ndf), cada uno debe mapearse con MOVE a su ruta destino.
Mejores Prácticas y Seguridad
- Prueba restauraciones periódicamente en entornos aislados para validar RTO/RPO.
- Aplica la regla 3-2-1 de backups (3 copias, 2 medios, 1 offsite).
- Usa CHECKSUM al respaldar y VERIFYONLY para validar.
- Monitorea espacio en disco del host/volumen (df -h) antes de restaurar.
- Documenta un runbook de recuperación y automatiza scripts con CI/CD si es posible.
- Protege contraseñas: variables de entorno, secretos, o autenticación integrada donde aplique.
- Cifra backups o usa TDE; gestiona certificados/KEKs de forma segura.
- Restringe exposición de puerto 1433; usa redes privadas de Docker y grupos de seguridad.
- Revisa permisos de archivos
.bak
y del directorio de datos (mssql
). - Audita quién restaura y cuándo mediante msdb y herramientas SIEM.
Troubleshooting
- Msg 3201 / OS error 5 (Access is denied): permisos insuficientes sobre el
.bak
. Ajusta propietario/permisos o copia al directorio con permisos del usuariomssql
. - Msg 3154: intentando restaurar sobre una base existente con diferente backup. Usa WITH REPLACE tras confirmar.
- Msg 1834/3101: base en uso. Pasa a SINGLE_USER con ROLLBACK IMMEDIATE.
- Msg 3465: versión de backup más nueva que el motor. No se puede restaurar de 2022 a 2019; actualiza destino o re-crea backup en versión compatible.
- Corrupción detectada: VERIFYONLY o CHECKDB fallan. Restaura de otro backup sano o aplica estrategias de reparación (último recurso).
-- Ver errores recientes
EXEC xp_readerrorlog 0, 1, NULL, NULL, GETDATE()-1, GETDATE(), N'desc';
-- Espacio de disco en Linux desde el contenedor
! df -h
-- Revisar versión del backup
RESTORE HEADERONLY FROM DISK = '/path/to/your/backup.bak';
Combina logs del contenedor (docker logs) con el errorlog del motor para hallar la causa raíz.
Compatibilidad y Requisitos del Sistema
- Versiones: SQL Server 2019 puede restaurar backups de versiones anteriores (p. ej., 2017, 2016), pero no al revés.
- Sistema operativo en contenedor: Linux (Ubuntu/RHEL) con rutas bajo
/var/opt/mssql
; en Windows Containers, rutas NTFS (C:\var\opt\mssql
). - Recursos mínimos: RAM ≥ 2 GB (recomendado ≥ 4 GB para operaciones de restore), CPU ≥ 2 vCPU, IOPS adecuadas.
- Almacenamiento: espacio libre suficiente para data, log y crecimiento temporal durante la restauración.
- Collation y compatibilidad: tras restaurar, verifica
compatibility_level
y collation para evitar regresiones.
-- Compatibilidad de la base restaurada
SELECT name, compatibility_level, collation_name
FROM sys.databases
WHERE name = 'NombreDeTuBaseDeDatos';
Alternativas y Comparativas
- Docker: Daemon central; amplio ecosistema y documentación.
- Podman: Rootless por defecto; compatible con gran parte de CLI de Docker.
# Docker
docker exec -it sqlserver-1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA
# Podman (comandos análogos)
podman exec -it sqlserver-1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA
- Azure Data Studio / SSMS: Ejecuta los mismos T-SQL desde una GUI.
- PowerShell (SqlServer module):
Restore-SqlDatabase -ServerInstance "localhost,1433" -Database "DB" ` -BackupFile "/var/opt/mssql/backup/backup.bak" -ReplaceDatabase
- go-sqlcmd (nuevo): Cliente moderno multiplataforma para SQL Server.
-- Listar backups disponibles en el contenedor
! ls -lh /var/opt/mssql/backup
-- Ver bases y tamaños aproximados
SELECT d.name, SUM(mf.size)*8/1024 AS SizeMB
FROM sys.databases d JOIN sys.master_files mf ON d.database_id = mf.database_id
GROUP BY d.name ORDER BY SizeMB DESC;
-- Cambiar propietario a 'sa' (evita issues con owner)
ALTER AUTHORIZATION ON DATABASE::[NombreDeTuBaseDeDatos] TO sa;
Estos comandos ayudan a inspeccionar archivos, tamaños y propietarios tras una restauración.
Conclusión
Disponer de la habilidad para restaurar bases de datos utilizando la línea de comandos te proporciona un control preciso y eficiente sobre la gestión de tus datos en SQL Server 2019. Siguiendo los pasos descritos en esta guía, puedes manejar con confianza la restauración de bases de datos, preservando así su integridad y disponibilidad.
Para más información sobre SQL Server, Docker, y la gestión de bases de datos en entornos de contenedores, explora nuestros otros artículos y guías. Estamos aquí para ayudarte a dominar tus desafíos de administración de bases de datos.
Crear contenedor de Sql Server 2019 para utilizar Hopex