Ошибка при восстановлении базы данных SQL Server на удаленном сервере с помощью Powershell - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над автоматизацией процесса и изучаю PowerShell.Одна из частей этой задачи - взять резервную копию базы данных SQL Server с сервера prod и восстановить ее на сервере DR.Я уже заставил это работать, когда есть один или два файла данных + файл журнала, но я хочу, чтобы это работало независимо от количества файлов данных, поэтому я начал переписывать.

Я начал с этого на своем локальномМашина, резервное копирование и восстановление локальных.Все работает.

$dbfiles = Invoke-Sqlcmd -ServerInstance "XXX\SQLEXPRESS" 
                 -Query "RESTORE FILELISTONLY FROM DISK='$BackupFile'"

#Loop through filelist files, replace old paths with new paths

foreach($dbfile in $dbfiles) {
  $DbFileName = $dbfile.PhysicalName | Split-Path -Leaf

  if($dbfile.Type -eq 'L') {
    $newfile = Join-Path -Path $NewLogPath -ChildPath $DbFileName
  } else {
    $newfile = Join-Path -Path $NewDataPath -ChildPath $DbFileName
  }

  $relocate += New-Object Microsoft.SqlServer.Management.Smo.RelocateFile 
($dbfile.LogicalName,$newfile)
}

Далее мне понадобилось это для работы описанным выше способом с использованием двух серверов.Я знал, что мне понадобится добавленный код, чтобы быть уверенным, что я не получу ошибок, связанных с различными версиями SMO, но я не могу заставить его работать так же, как в моей предыдущей версии скрипта, в которой было известно количество файлов данных.

Я все еще получаю следующую ошибку:

Restore-SqlDatabase: Невозможно связать параметр 'RelocateFile'.Не удалось преобразовать значение «Microsoft.SqlServer.Management.Smo.RelocateFile» типа «Microsoft.SqlServer.Management.Smo.RelocateFile» в тип «Microsoft.SqlServer.Management.Smo.RelocateFile".

Моя интуиция говорит мне, что указание версии не передается в массив.

Есть мысли о том, как я могу это исправить?TIA!

$sqlServerSnapinVersion = (Get-Command Restore- 
SqlDatabase).ImplementingType.Assembly.GetName().Version.ToString()
$assemblySqlServerSmoExtendedFullName = "Microsoft.SqlServer.SmoExtended, 
Version=$sqlServerSnapinVersion, Culture=neutral, 
PublicKeyToken=89845dcd8080cc91"

  $Relocate = @(New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, 
$assemblySqlServerSmoExtendedFullName"($dbfile.LogicalName, $newfile))


$DBfileList = Invoke-Sqlcmd -ServerInstance $DRServer -Query "RESTORE 
FILELISTONLY FROM DISK='$BUFile'"







 foreach($dbfile in $dbfileList){

  $DbFileName = $dbfile.PhysicalName | Split-Path -Leaf

  if($dbfile.Type -eq 'L') {
    $newfile = $LogPath  + $DbFileName
  } else {
    $newfile =  $DataFilePath + $DbFileName
  }

  $relocate += New-Object Microsoft.SqlServer.Management.Smo.RelocateFile 
($dbfile.LogicalName,$newfile)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...