2017-06-05 26 views
0

Powershellを使用してSQL Serverの復元プロセスを自動化する予定です。私は以下のPowerShellスクリプトを実行するとエラーは発生しません。どんな助けもありがとう。私は以下のpowershellスクリプトをうまく実行できません。右あなたの機能をオフPowerShellを使用してデータベースを復元する(SQL Server)

[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() 
} 
+0

チェック:https://dbatools.io/functions/restore-dbadatabase/、https://dbatools.io/関数/ restore-sqlbackupfromdirectory /です。 dbatoolsコマンドの完全なリストは、https://dbatools.io/functions/から入手できます。 –

答えて

1

GenericSqlQueryは、私が何に設定され表示されていない$1という変数が含まれています。特別な変数であるperlでは、PowerShellでは何かに設定するまで意味がありません。

前述のように、ロギングと検証を含むより効率的な方法が、リストアのためにdbatoolsモジュールを利用することです。 [開示私はこのプロジェクトに貢献しています。] dbatoolsのcomands以下

#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 
関連する問題