El otro día, uno de nuestros clientes nos hizo llegar una petición: necesitaba realizar respaldos de una base de datos, pero la edición de su instancia en SQL Server era Express y carecía de SQL Agent.
Aceptamos el reto y le propusimos realizar los respaldos a través de las Tareas Programadas del servidor que aloja la instancia, utilizando un script en PowerShell.
Para ello, creamos un script que cumplía con las siguientes necesidades:
- Conexión a la base de datos y configuración de parámetros.
- Creación, en caso de no existir, del directorio que almacenará el/los archivo .bak.
- Eliminación de los respaldos que excedan el periodo de retención, en este caso 24 h.
- Ejecución de Full Backup de la base de datos especificada.
# Configuración
$servidor = "localhost\SQLSICUEL" # Nombre del servidor SQL
$baseDeDatos = "sicuelbd" # Nombre de la base de datos
$directorioBackup = "E:\MSSQL15.SQLSICUEL\MSSQL\Backup" # Ruta donde se guardará el backup
$nombreBackup = "$($baseDeDatos)_$(Get-Date -Format yyyyMMdd_HHmmss).bak"
$rutaBackup = Join-Path -Path $directorioBackup -ChildPath $nombreBackup
# Crear el directorio si no existe
if (-not (Test-Path $directorioBackup)) {
New-Item -ItemType Directory -Path $directorioBackup | Out-Null
}
# Eliminar archivos .bak mayores a 24 horas
try {
Get-ChildItem -Path $directorioBackup -Filter "*.bak" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddHours(-24)
} | ForEach-Object {
Remove-Item -Path $_.FullName -Force
Write-Output "$(Get-Date): Eliminado archivo $_.FullName"
}
} catch {
Write-Output "$(Get-Date): Error al eliminar archivos antiguos. $($_.Exception.Message)"
}
# Realizar el backup
try {
Backup-SqlDatabase -ServerInstance $servidor -Database $baseDeDatos -BackupFile $rutaBackup
Write-Output "$(Get-Date): Backup completado: $rutaBackup"
} catch {
Write-Output "$(Get-Date): Error al realizar el backup: $($_.Exception.Message)"
}
Una vez creado el script, lo alojamos en una ruta local para ser ejecutado de manera programada.
Para generar la tarea:
- Accedimos a “Task Scheduler” (taskschd.msc) en el servidor que aloja la instancia y configuramos una nueva tarea.
- Creamos una nueva tarea.
- Configuramos la información y credenciales necesarias.
- Configuramos el Trigger con la programación requerida.
- Configuramos la acción:
- Programa/script: powershell.exe.
- Agregamos argumentos: -ExecutionPolicy Bypass -File «C:\ruta\del\script.ps1”
(Cambia «C:\ruta\del\script.ps1» por la ubicación completa de tu script de PowerShell) - Revisamos las condiciones y el resto configuraciones.
Una vez configurada la tarea, regresamos al Programador de Tareas para verificar que estuviera correctamente configurada. Después de esto, podemos ejecutar la tarea manualmente para asegurarnos de que funcionará como esperamos.
Y así de simple fue nuestra propuesta.
Esperamos que este sencillo trabajo sea útil y que podáis implementarlo en vuestros entornos si os enfrentáis a una necesidad similar. Este es solo un pequeño ejemplo de cómo podemos aplicar trabajos programados sobre SQL Server cuando nos encontramos con la limitación de no contar con SQL Agent.