Functions/function-Restore-Database.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
function Restore-Database { <# .SYNOPSIS Restores a set of SQL backup files .DESCRIPTION Given a set of SQL Server backup files restores the files up to the specified point in time, or completely if not specified. Can also generate the restore scripts for the actions. .EXAMPLE Restore-Database -Backups $Backups -RestoreSQLServer $sqlvr .PARAMETER BackupsObject A list of SQL backups, as provided by Get-RestoreSet .PARAMETER RestoreSQLServer A SQL server SMO connection object .PARAMETER RestoreAs Restore the database under this name .PARAMETER Script A switch to indicate if T-SQL restore Scripts should be generated .PARAMETER ScriptOnly A switch to indicate if only T-SQL restore scripts should be generated (no restore is performed) .PARAMETER TargetTime Point in time to recover to. #> [CmdletBinding()] param ( [Parameter(Mandatory=$True)] [Alias('BackupObject')] [object]$BackupsObject, [Parameter(Mandatory=$True)] [Microsoft.SqlServer.Management.Smo.SqlSmoObject]$RestoreSQLServer, [String]$RestoreAs='', [Switch]$Script, [Switch]$ScriptOnly, $TargetTime ) Write-Verbose "Restore-Database - Entering " If ($RestoreAs -eq ''){ $DatabaseName = $BackupsObject[0].DatabaseName } else { $DatabaseName = $RestoreAs } $devicetype = [Microsoft.SqlServer.Management.Smo.DeviceType]::File foreach ($backup in ($BackupsObject | sort-object LastLSN, startdate)){ Write-Verbose "Remove-Database - Restoring file " $restore = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Restore $restoredevice = New-Object -TypeName Microsoft.SQLServer.Management.Smo.BackupDeviceItem($backup.filename,$devicetype) $null = $restore.devices.add($restoredevice) $restore.Database = $DatabaseName $restore.ToPointInTime = $TargetTime foreach ($f in $backup.RelocateFile){ $null = $restore.RelocateFiles.add($f) } if ($backup.LastLSN -eq $BackupsObject[-1].LastLSN){ Write-Verbose "Restore-Database - At endpoint, start recovery " $restore.NoRecovery = $False }else{ $restore.NoRecovery = $True Write-Verbose "Restore-Database - Not at endpoint" } if ($script -or $scriptOnly){ $restore.script($RestoreSQLServer) } if ($ScriptOnly -ne $TRUE){ $restore.sqlrestore($RestoreSQLServer) } $null = $restore.Devices.Remove($restoredevice) } Write-Verbose "Restore-Database - Leaving " } |