Gu铆a Completa: Backup y Restauraci贸n de SQL Server con PowerShell y dbatools

Automatizaci贸n de procesos de backup y restauraci贸n entre diferentes versiones de SQL Server usando PowerShell y el m贸dulo dbatools

Introducci贸n

Esta gu铆a te ayudar谩 a entender y utilizar scripts PowerShell para realizar backups y restauraciones de bases de datos entre diferentes instancias de SQL Server. El enfoque utiliza el m贸dulo dbatools, una herramienta poderosa y confiable para administrar SQL Server desde PowerShell.

Nota: Este enfoque es ideal para migraciones entre versiones de SQL Server, como desde SQL Server 2008 R2 hacia SQL Server 2022, utilizando el m茅todo de backup y restauraci贸n.

Recursos 煤tiles:

Sitio oficial de dbatools Documentaci贸n de dbatools dbatools en GitHub Documentaci贸n de PowerShell

Requisitos Previos

1

PowerShell 5.1 o superior

Aseg煤rate de tener PowerShell 5.1 o una versi贸n m谩s reciente instalada en el sistema desde donde ejecutar谩s el script.

Puedes verificar tu versi贸n de PowerShell ejecutando:

$PSVersionTable.PSVersion
2

M贸dulo dbatools

El m贸dulo dbatools es esencial para que el script funcione. Puedes instalarlo con el siguiente comando:

Install-Module -Name dbatools -Scope CurrentUser

Si ya lo tienes instalado, actual铆zalo a la 煤ltima versi贸n:

Update-Module -Name dbatools

En entornos restringidos, puedes instalar dbatools sin la galer铆a de PowerShell:

iex (irm dbatools.io/in)
3

Permisos de red y SQL Server

Necesitas:

  • Credenciales con permisos de administrador en ambas instancias de SQL Server
  • Acceso a la ruta de red compartida para almacenar los backups
  • Permisos para crear y restaurar bases de datos en el servidor destino
4

Conectividad entre servidores

Verifica que exista conectividad de red entre:

  • Tu estaci贸n de trabajo y ambos servidores SQL
  • Ambos servidores SQL entre s铆
  • Ambos servidores y la ruta de backup compartida

An谩lisis del Script

Un script t铆pico de backup y restauraci贸n con dbatools realiza operaciones para m煤ltiples bases de datos. Veamos en detalle c贸mo funciona:

Copy-DbaDatabase ` -Source "SQLSRV-OLD" ` -Destination "SQLSRV-NEW" ` -Database "MiBaseDeDatos" ` -BackupRestore ` -SharedPath "\\servidor-backup\c$\Backups\SQLSRV-OLD\MiBaseDeDatos\FULL\" ` -WithReplace ` -AdvancedBackupParams @{ CompressBackup = $true }

Desglose del comando Copy-DbaDatabase:

-Source
Especifica el servidor SQL Server de origen (ej: SQL Server 2008 R2)
-Destination
Especifica el servidor SQL Server de destino (ej: SQL Server 2022)
-Database
Nombre de la base de datos a copiar
-BackupRestore
Indica que se utilizar谩 el m茅todo de backup y restauraci贸n
-SharedPath
Ruta de red compartida donde se almacenar谩n los archivos de backup
-WithReplace
Reemplaza la base de datos si ya existe en el destino
-AdvancedBackupParams
Par谩metros avanzados para el backup, en este caso compresi贸n activada

Nota sobre compatibilidad: Aunque est茅s migrando desde versiones antiguas de SQL Server (como 2008 R2, versi贸n 10.50) a versiones modernas (como SQL Server 2022, versi贸n 16.x), el proceso de backup y restauraci贸n es compatible hacia adelante. Las bases de datos se actualizar谩n autom谩ticamente al nivel de compatibilidad del servidor destino despu茅s de la restauraci贸n.

Ejemplo de bases de datos en un script t铆pico:

ERP_Principal
BI_DataWarehouse
APP_Usuarios
LOG_Operaciones
CRM_Clientes
DS_Integraciones
MOVIL_App
TEST_Desarrollo
WEB_Visitas

Flujo de Trabajo del Script

SQL Server Origen
(SQLSRV-OLD)
Ruta Compartida
(\\servidor-backup\Backups\)
SQL Server Destino
(SQLSRV-NEW)
1. Crear Backup
2. Almacenar Backup
3. Restaurar Backup

Diagrama del proceso de backup y restauraci贸n con dbatools

  1. Conectar al servidor origen y crear un backup comprimido de la base de datos
  2. Guardar el backup en la ruta compartida especificada
  3. Conectar al servidor destino y restaurar el backup
  4. Reemplazar la base de datos si ya existe (gracias al par谩metro -WithReplace)
  5. Repetir el proceso para cada base de datos en el script

Ejecuci贸n del Script

1

Preparaci贸n del entorno

Antes de ejecutar el script, aseg煤rate de:

  • Tener el m贸dulo dbatools instalado
  • Verificar la conectividad con ambos servidores SQL
  • Confirmar que la ruta de backup existe y es accesible
  • Tener suficientes permisos en ambos servidores
2

Ejecutar el script

Puedes ejecutar el script completo guard谩ndolo como un archivo .ps1 y ejecut谩ndolo en PowerShell:

.\MiScriptBackupRestore.ps1

O ejecutar cada comando individualmente en la consola de PowerShell.

3

Monitorear la ejecuci贸n

El cmdlet Copy-DbaDatabase proporciona salida detallada sobre el progreso de cada operaci贸n. Presta atenci贸n a:

  • Tama帽o de los backups creados
  • Tiempo de backup y restauraci贸n
  • Posibles errores o advertencias

Importante: El par谩metro -WithReplace reemplazar谩 cualquier base de datos existente con el mismo nombre en el servidor destino. Aseg煤rate de que esto sea lo que deseas antes de ejecutar el script.

Mejoras y Consideraciones Adicionales

Par谩metros adicionales 煤tiles

Par谩metro Descripci贸n Ejemplo
-BackupFileName Especificar un nombre personalizado para el archivo de backup -BackupFileName "BD_$(Get-Date -Format 'yyyyMMdd_HHmm').bak"
-UseLastBackup Utilizar el backup m谩s reciente en lugar de crear uno nuevo -UseLastBackup
-NoRecovery Dejar la base de datos en estado "Restoring" para aplicar logs posteriores -NoRecovery
-MaxTransferSize Especificar el tama帽o m谩ximo de transferencia para la operaci贸n de backup -MaxTransferSize 4MB
-BlockSize Especificar el tama帽o de bloque para el backup -BlockSize 65536

Script mejorado con manejo de errores

Puedes mejorar tu script agregando manejo de errores y logging:

# Configurar logging $LogPath = "C:\Logs\BackupRestore-$(Get-Date -Format 'yyyyMMdd_HHmm').log" Start-Transcript -Path $LogPath try { # Lista de bases de datos $Databases = @( "ERP_Principal", "BI_DataWarehouse", "APP_Usuarios", "LOG_Operaciones", "CRM_Clientes", "DS_Integraciones", "MOVIL_App", "TEST_Desarrollo", "WEB_Visitas" ) # Configuraci贸n de servidores $SourceServer = "SQLSRV-OLD" $DestinationServer = "SQLSRV-NEW" $BackupRoot = "\\servidor-backup\c$\Backups\" foreach ($Database in $Databases) { Write-Host "Procesando base de datos: $Database" -ForegroundColor Green # Construir ruta de backup espec铆fica para cada base de datos $SharedPath = "$BackupRoot$SourceServer\$Database\FULL\" # Crear directorio si no existe if (-not (Test-Path $SharedPath)) { New-Item -ItemType Directory -Path $SharedPath -Force } # Ejecutar backup y restauraci贸n Copy-DbaDatabase ` -Source $SourceServer ` -Destination $DestinationServer ` -Database $Database ` -BackupRestore ` -SharedPath $SharedPath ` -WithReplace ` -AdvancedBackupParams @{ CompressBackup = $true } Write-Host "Base de datos $Database procesada exitosamente" -ForegroundColor Green } } catch { Write-Error "Error durante el proceso: $($_.Exception.Message)" Write-Error "Detalles completos del error: $($_.Exception.StackTrace)" } finally { Stop-Transcript }

Advertencia sobre versiones: Aunque la migraci贸n entre versiones de SQL Server es compatible, algunas caracter铆sticas obsoletas en versiones anteriores podr铆an no funcionar correctamente en la nueva versi贸n. Es recomendable probar exhaustivamente las aplicaciones que utilizan estas bases de datos despu茅s de la migraci贸n.

Recursos adicionales:

Documentaci贸n oficial de Copy-DbaDatabase Todos los comandos de dbatools Instalaci贸n de SQL Server Art铆culos sobre SQL Server en SQL Shack

Resoluci贸n de Problemas Comunes

Error de conectividad

S铆ntoma: El script falla con errores de conexi贸n.

Soluci贸n: Verifica la conectividad de red y que los nombres de servidor sean correctos. Puedes probar la conectividad con:

Test-DbaConnection -SqlInstance "SQLSRV-OLD" Test-DbaConnection -SqlInstance "SQLSRV-NEW"

Permisos insuficientes

S铆ntoma: El script falla con errores de permisos.

Soluci贸n: Aseg煤rate de que la cuenta que ejecuta el script tenga los permisos necesarios en ambos servidores SQL y en la ruta de backup.

Espacio insuficiente

S铆ntoma: El script falla por falta de espacio en disco.

Soluci贸n: Verifica que haya suficiente espacio en la ruta de backup y en el servidor destino para restaurar las bases de datos.

Base de datos en uso

S铆ntoma: Error al restaurar porque la base de datos est谩 en uso.

Soluci贸n: El par谩metro -WithReplace normalmente maneja esto, pero si persiste el problema, puedes intentar desconectar usuarios antes de la restauraci贸n:

Invoke-DbaQuery ` -SqlInstance "SQLSRV-NEW" ` -Query "ALTER DATABASE [ERP_Principal] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"

Recursos para troubleshooting:

Gu铆a de troubleshooting de dbatools C贸mo ver logs de error de SQL Server Troubleshooting de backup y restauraci贸n