← Volver al blog

Script de PowerShell para una restauración rápida de base de datos (SQL Server)

Publicado el
3 min de lectura
--- vistas

Este script será útil si necesitas restablecer tu base de datos con frecuencia. Por ejemplo, debido a un desarrollo activo que afecta los datos en las tablas. El script está publicado en mi repositorio de GitHub aquí - [link] El escenario es:

  1. EXEC sp_configure 'show advanced options', 1
  2. EXEC sp_configure 'xp_cmdshell', 1
  3. Montar una ruta UNC remota (para restaurar la base de datos desde un host remoto)
  4. Poner la base de datos que se va a restaurar en modo offline
  5. Restaurar la base de datos
  6. Volver a poner la base de datos online

Listado del módulo SQLCmd (puede estar desactualizado, la última versión existe en el repositorio del enlace):

Function Exec(
    [System.String]$command,
    [System.String]$serverInstance
) {
    Invoke-Sqlcmd -Query $command -ServerInstance $ServerInstance
}

Function Test(
    [System.String] $serverInstance
) {
    $command = EXEC master..xp_cmdshell 'set'
    Exec $command $serverInstance
}

Function Reconfigure(
    [System.String] $serverInstance
) {
    $command = RECONFIGURE
    Exec $command $serverInstance
}

Function Show-Advanced-Options(
    [System.String] $serverInstance
) {
    $command = EXEC sp_configure 'show advanced options', 1
    Exec $command $serverInstance
    Reconfigure $serverInstance
}

Function Xp-CmdShell(
    [System.String] $serverInstance
) {
    $command = EXEC sp_configure 'xp_cmdshell', 1
    Exec $command $serverInstance
    $command = RECONFIGURE
    Reconfigure $serverInstance
}

Function Net-Use-Delete(
    [System.String] $drive,
    [System.String] $serverInstance
) {
    $command = EXEC XP_CMDSHELL 'net use $drive /delete /y'
    Exec $command $serverInstance
}

Function Net-Use-Add(
    [System.String] $drive,
    [System.String] $hostPath,
    [System.String] $hostUser,
    [System.String] $hostPassword,
    [System.String] $serverInstance
) {
    $command = EXEC XP_CMDSHELL 'net use $drive $hostPath /user:$hostUser $hostPassword /persistent:yes'
    Exec $command $serverInstance
}

Function Set-Database-Offline(
    [System.String] $dbName,
    [System.String] $serverInstance
) {
    $command = ALTER DATABASE [$dbName] SET OFFLINE WITH ROLLBACK IMMEDIATE
    Exec $command $serverInstance
}

Function Set-Database-Online(
    [System.String] $dbName,
    [System.String] $serverInstance
) {
    $command = ALTER DATABASE [$dbName] SET ONLINE
    Exec $command $serverInstance
}

Function Restore-Database(
    [System.String] $dbName,
    [System.String] $dbFilePath,
    [System.String] $serverInstance
) {
    $command = RESTORE DATABASE [$dbName] FROM DISK = '$dbFilePath' WITH REPLACE
    Exec $command $serverInstance
}

Listado del escenario de restauración de base de datos (también puede estar desactualizado):

.\Load-Module.ps1 SQLCmd

$serverInstance = BOT-SP2016

$db = @{
    name = SharePoint_Content_80
    path = \db\ksup\content\2019.09.16.00.00.07.bak
}

$hostInfo = @{
    path = $env:hostPath
    user = $env:hostUser
    password = $env:hostPassword
}

Write-Host [x] database preconfig
Show-Advanced-Options $serverInstance
Xp-CmdShell $serverInstance

Write-Host [x] virtual path mappings
Net-Use-Delete H: $serverInstance
Net-Use-Add H: $hostInfo.path $hostInfo.user $hostInfo.password $serverInstance

Write-Host [x] taking database $($db.name) offline
Set-Database-Offline $db.name $serverInstance

Write-Host [x] restorting database $($db.name) from file $($db.path)
$path = Join-Path -Path $hostInfo.path -ChildPath $db.path
Restore-Database $db.name  $path $serverInstance

Write-Host [x] taking database $($db.name) online
Set-Database-Online $db.name $serverInstance
Write-Host [x] scenario completed -ForegroundColor Green

Atención: para que el script funcione correctamente, necesitas configurar algunas variables de entorno en tu sistema operativo:

Las variables son:

  • hostPath
  • hostUser
  • hostPassword

Y configura las variables en el script del escenario: - db.name, db.path

Disponible para colaboración por contrato

Estoy disponible para colaborar por contrato. Si tiene una idea de proyecto interesante, reserve una llamada por Calendly.

Agenda una llamada de 30 min