Powershell恢复数据库(SQL Server)

时间:2017-06-05 07:00:53

标签: sql-server powershell

我计划使用Powershell自动执行SQL Server的还原过程。执行以下powershell脚本时,我没有收到任何错误。任何帮助将不胜感激。我无法成功执行以下powershell脚本。

[string]  $SourceServer= ".\LOCAL"
[string]  $DestinationServer= ".\LOCAL2"
[string]  $SourceDatabase = "msdb"
[string]  $DestinationDatabase = "master"
[string]  $RestoreDatabase="test1"
[string]  $DataFolder='C:\Program Files\Microsoft SQL Server\MSSQL11.LOCAL2\MSSQL\DATA'
[string]  $LogFolder='C:\Program Files\Microsoft SQL Server\MSSQL11.LOCAL2\MSSQL\DATA'

[string]  $FullBackupSourceQuery= $("SELECT REPLACE (c.physical_device_name,'C:\SQL Server\Backup\','\\servername\Backup\')
FROM msdb.dbo.backupset a
INNER JOIN (SELECT database_name , backupdate = MAX(backup_finish_date)
FROM msdb.dbo.backupset 
WHERE type = 'D' AND 
backup_finish_date >= DATEADD(MONTH , -1 , GETDATE())
AND  database_name =$RestoreDatabase
GROUP BY database_name)b
ON a.database_name=b.database_name
AND a.backup_finish_date=b.backupdate
INNER JOIN msdb.dbo.backupmediafamily c 
ON c.media_set_id = a.media_set_id")

[string]  $DiffBackupSourceQuery= $("SELECT REPLACE (c.physical_device_name,'C:\SQL Server\Backup\','\\servername\Backup\')
FROM msdb.dbo.backupset a
INNER JOIN (SELECT database_name , backupdate = MAX(backup_finish_date)
FROM msdb.dbo.backupset 
WHERE type = 'I' AND 
backup_finish_date >= DATEADD(MONTH , -1 , GETDATE())
AND  database_name =$RestoreDatabase
GROUP BY database_name)b
ON a.database_name=b.database_name
AND a.backup_finish_date=b.backupdate
INNER JOIN msdb.dbo.backupmediafamily c 
ON c.media_set_id = a.media_set_id")

[string] $DestinationQuery=$("
EXEC master..RestoreDatabase
       @BackupFile = '$value',
       @NewDatabaseName = '$RestoreDatabase',
       @AdditionalOptions='STATS=5, REPLACE, NORECOVERY',
       @DataFolder = '$DataFolder',
       @LogFolder = '$LogFolder',
       @ExecuteRestoreImmediately = 'Y'

EXEC master..RestoreDatabase
       @BackupFile = '$value1',
       @NewDatabaseName = '$RestoreDatabase',
       @AdditionalOptions='STATS=5, REPLACE, RECOVERY',
       @DataFolder = '$DataFolder',
       @LogFolder = '$LogFolder',
       @ExecuteRestoreImmediately = 'Y'
")

function GenericSqlQuery ($SourceServer, $SourceDatabase, $SourceQuery, $DestinationServer, $DestinationDatabase, $DestnationQuery) 
{
  {
    $SourceConnection = New-Object System.Data.SQLClient.SQLConnection
    $SourceConnection.ConnectionString = "server='$SourceServer';database='$SourceDatabase';trusted_connection=true;"
    $SourceConnection.Open()
    $SourceCommand = New-Object System.Data.SQLClient.SQLCommand
    $SourceCommand.Connection = $Connection
    $SourceCommand.CommandText = $FullBackupSourceQuery
    $SourceReader = $Command.ExecuteReader()
    while ($SourceReader.Read())  {
         $value=$SourceReader.GetValue($1)
                                  }
    $SourceCommand.CommandText = $DiffBackupSourceQuery

    $SourceReader = $Command.ExecuteReader()
    while ($SourceReader.Read()) {
         $value1=$SourceReader.GetValue($1)
                                 }
   }
      $SourceConnection.Close()
  {
    $DestinationConnection = New-Object System.Data.SQLClient.SQLConnection
    $DestinationConnection.ConnectionString = "server='$DestinationServer';database='$DestinationDatabase';trusted_connection=true;"
    $DestinationConnection.Open()
    $DestinationCommand = New-Object System.Data.SQLClient.SQLCommand
    $DestinationCommand.Connection = $Connection
    $DestinationCommand.CommandText = $DestinationQuery
    $DestinationReader = $Command.ExecuteReader()
  }
    $DestinationConnection.Close()
}

1 个答案:

答案 0 :(得分:1)

关闭你的函数GenericSqlQuery包含一个名为$1的变量,我看不到任何设置。在Perl中,这是一个特殊的变量,但是在PowerShell中它没有任何意义,直到你把它设置为某个东西。

如前所述,虽然更有效的方法(包括日志记录和验证)是利用dbatools模块进行恢复。 [披露我是此项目的贡献者。]

#if not installed
Install-Module dbatools

# import it
Import-Module dbatools

# Restore it
$sourceServer = '.\LOCAL'
$DestServer = '.\LOCAL2'
$RestoreDb = 'test1'
$DataFolder='C:\Program Files\Microsoft SQL Server\MSSQL11.LOCAL2\MSSQL\DATA'
$LogFolder='C:\Program Files\Microsoft SQL Server\MSSQL11.LOCAL2\MSSQL\DATA'

# IF you need to get backup history
Get-DbaRestoreHistory -SqlServer $sourceServer -Databases $RestoreDb | 
    Restore-DbaDatabase -SqlServer $DestServer -DestinationDataDirectory $DataFolder -DestinationLogDirectory $LogFolder

# IF you just want to base it on backup folder, will SCAN complete folder
$dbBackupPath = "\\servername\Backup\$RestoreDb"
Restore-DbaDatabase -SqlServer $DestServer -Path $dbBackupPath -DestinationDataDirectory $DataFolder -DestinationLogDirectory $LogFolder