2017-06-05 8 views
0

Ich plane, den Wiederherstellungsprozess für SQL Server mit Powershell zu automatisieren. Ich bekomme keinen Fehler, wenn ich das folgende Powershell-Skript ausführe. Jede Hilfe wird geschätzt. Ich kann das folgende Powershell-Skript nicht erfolgreich ausführen.Powershell zum Wiederherstellen der Datenbank (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

Überprüfen Sie die folgenden dbatools Comands: https://dbatools.io/functions/restore-dbadatabase/, https://dbatools.io/ Funktionen/restore-sqlbackupfromverzeichnis /. Eine vollständige Liste der dbatools-Befehle finden Sie hier: https://datatools.io/functions/ –

Antwort

1

Rechts von Ihrer Funktion GenericSqlQuery enthält eine Variable namens $1, die ich sehe nicht auf etwas festgelegt. In Perl war das eine spezielle Variable, aber in PowerShell hat es keine Bedeutung, bis Sie es auf etwas setzen.

Wie bereits erwähnt, ist eine effizientere Methode, die Protokollierung und Validierungen beinhaltet, dbatools Modul für die Wiederherstellungen zu verwenden. [Disclosure: Ich bin ein Beitrag zu diesem Projekt.]

#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 
Verwandte Themen