WhatsApp

  

Crear contenedor de Sql Server 2019 para utilizar Hopex

SQL Server 2019

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.

SQL Server 2019 Docker / Podman sqlcmd Backup & Restore
Resumen rápido: Conectar al contenedor, validar el backup, ejecutar RESTORE con MOVE, verificar el estado y aplicar buenas prácticas de seguridad y rendimiento. Incluimos troubleshooting, casos avanzados y alternativas.

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.

1Verifica el contenedor y puertos
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).
2Coloca el backup en un volumen accesible

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
Consejo: evita almacenar backups solo dentro del sistema de archivos del contenedor; usa volúmenes para persistencia y copias externas.
Tip: en Linux, la ruta de datos por defecto es /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.
Seguridad: evita reutilizar la cuenta SA en producción. Crea un inicio de sesión con permisos mínimos para tareas operativas y restringe el origen de conexión por firewall/red.

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.

Comando básico de restauración
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.

Validaciones previas recomendadas
-- 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.
Si la base ya existe o está en uso
-- 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;
Cuidado: REPLACE sobrescribe la base de datos actual. Úsalo solo si estás seguro.
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.

Validaciones post-restore recomendadas
-- 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.

Reasignación de permisos y settings
  • 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).
Si la base usa TDE, deberás restaurar previamente el certificado/clave maestra en la instancia destino.
Casos Avanzados de Restauración
Restauración diferencial y de logs
-- 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.

Restauración a un punto en el tiempo
-- 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;
Asegúrate de conocer tu RPO/RTO y de tener la cadena de backups intacta (full + dif + logs) para que funcione el point-in-time.
Múltiples archivos de datos (filegroups)
-- 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
Buenas prácticas operativas
  • 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.
Seguridad y compliance
  • 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.
Optimización: pre-dimensiona archivos de datos/log para minimizar autogrowth; considera discos rápidos (NVMe) y separa data/log en distintos volúmenes para mayor desempeño.
Troubleshooting
Errores comunes y soluciones
  • Msg 3201 / OS error 5 (Access is denied): permisos insuficientes sobre el .bak. Ajusta propietario/permisos o copia al directorio con permisos del usuario mssql.
  • 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).
Diagnóstico rápido
-- 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 vs Podman
  • 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
En entornos con políticas de menor privilegio, Podman rootless puede simplificar el cumplimiento de seguridad.
Herramientas alternativas
  • 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.
Comandos adicionales útiles
-- 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.

Recomendación final: integra pruebas automáticas de restauración en tu pipeline (por ejemplo, nightly) para validar backups y medir RTO/RPO de forma continua.
 


Crear contenedor de Sql Server 2019 para utilizar Hopex
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 12 agosto, 2025
Compartir
Iniciar sesión dejar un comentario

  
Cómo Exportar Logs de Cambios en Hopex: Guía Práctica