← 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

Artículos

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