Проблема с параметром Restore-DBADatabase и -FileMapping
Я пытаюсь восстановить базу данных на том же экземпляре под другим именем, и мне нужно заменить физические имена файлов данных и файлов журналов. Для этого я хочу использовать параметр -FileMapping, но продолжаю получать
Файл xxx.MDF уже существует в yyyy и принадлежит другой базе данных, не может быть восстановлен
Вот часть сценария
$FileStructure = @{
'Database_data' = "$DestinationDataDir\dm\$X_DBName.mdf"
'Database_Log' = "$DestinationLogDir\dm\$X_DBName.ldf"
}
Write-Output $FileStructure
#Restore-DbaDatabase -SQLServer $Instance -Path $BackupPath -
DestinationDataDirectory $DestinationDataDir -DestinationLogDirectory
$DestinationLogDir -DatabaseName $X_DBName -ReplaceDbNameInFile -
WithReplace -OutputScriptOnly
Restore-DbaDatabase -SQLServer $Instance -Path $BackupPath -FileMapping
$FileStructure -DatabaseName $X_DBName -WithReplace -OutputScriptOnly
Запись-вывод $FileStructure, $BackupPath
Имя Значение
---- -----
Database_data E: \ Data2016 \ dmu \ dm \ X_ENTWICKLUNG_DM.mdf
Database_Log F: \ Log2016 \ dmu \ dm \ X_ENTWICKLUNG_DM.ldf
Я посмотрел на документы (см. Пример 15) `но я должен делать что-то еще неправильно.
Отредактировано: в SSMS это выглядит так Таким образом, файлы в "Восстановить как" требуют другого имени. Вот чего я хочу достичь.
Кто-нибудь знает, как исправить PowerShell, чтобы сделать это? Я, должно быть, упускаю что-то глупое, наверное. Спасибо
1 ответ
Я хотел бы возобновить предыдущий ответ. Для меня это работает!
Restore-DbaDatabase -SqlInstance localhost -DatabaseName NewDatabase -Path 'C:\MyPath\MyDatabase.bak' -WithReplace -ReplaceDbNameInFile
Это оно.
Спасибо @ Мётц
Предполагая, что у вас есть файл резервной копии из базы данных "X_ENTWICKLUNG_DM" с того же сервера, и вы хотите восстановить его обратно в другую базу данных. Если значение из $X_DBName
совпадает с исходной базой данных, это будет причиной исключения, с которым вы сталкиваетесь.
Это восстановит базу данных в пути по умолчанию для DATA и LOG, без необходимости знать о них заранее:
Restore-DbaDatabase -SqlInstance $Instance -Path $BackupPath -DatabaseName $NEWDBNAME -ReplaceDbNameInFile -WithReplace
$NEWDBNAME
переменная должна быть чем-то иным, чем исходная база данных, из которой вы взяли резервную копию и теперь пытаетесь восстановить обратно.
Если вы хотите, чтобы логические имена файлов были такими же, как имя новой базы данных, в которую вы восстановили, вы должны сделать что-то вроде этого:
Rename-DbaDatabase -SqlInstance . -Database $NEWDBNAME -LogicalName "<DBN>_<FT>"
Обновить
Я только что создал новую базу данных на своем лабораторном сервере. Я назвал это ТЕСТ. База данных пуста, но она служит для тестирования моего кода.
Я сделал полную резервную копию базы данных с этой командой:
Backup-DbaDatabase -SqlInstance localhost -Database Test -BackupDirectory C:\Temp\ -CopyOnly -Type full -CompressBackup
После создания файла резервной копии я проверил содержимое резервной копии и определил список файлов, чтобы увидеть, какие имена по умолчанию будет предлагать резервная копия при желании восстановить файл резервной копии:
Get-DbaBackupInformation -SqlInstance localhost -Path C:\Temp\Test_201812072244.bak | Format-list filelist
FileList : {
@{Type=D; LogicalName=Test; PhysicalName=D:\MSSQL\DATA\Test.mdf},
@{Type=L; LogicalName=Test_log; PhysicalName=D:\MSSQL\LOG\Test_log.ldf}
}
После подтверждения списка файлов по умолчанию из файла резервной копии я запустил приведенный ниже код, чтобы сгенерировать необработанный сценарий T-SQL, который будет выполнять модуль:
Restore-DbaDatabase -SqlInstance localhost -DatabaseName Test_Restored -Path C:\Temp\Test_201812072244.bak -WithReplace -ReplaceDbNameInFile -OutputScriptOnly
RESTORE DATABASE [Test_Restored] FROM DISK = N'C:\Temp\Test_201812072244.bak' WITH FILE = 1, MOVE N'Test' TO N'D:\MSSQL\DATA\Test_Restored.mdf', MOVE N'Test_log' TO 'D:\MSSQL\LOG\Test_Restored_log.ldf', NOUNLOAD, REPLACE, STATS = 10
Параметр -OutputScriptOnly в командлете Restore-DbaDatabase не выполнит сценарий, а только сгенерирует его и выведет на консоль.
Обратите внимание, что имена файлов, которые он собирается восстановить, на самом деле переименовываются в имена новой базы данных, в которую я пытаюсь восстановить.
Я бы порекомендовал вам создать пустую базу данных и поэкспериментировать с этим, пока ваши команды не будут работать и вести себя как положено. Я бы порекомендовал вам запустить обновление, на всякий случай.
Update-Module dbatools -Force
Во время устранения неполадок попробуйте выполнить командлет Get-DbaBackupInformation, чтобы помочь вам разобраться с проблемой, с которой вы столкнулись.