Я работаю над автоматизацией процесса и изучаю 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)
}