Проблема с параметром Restore-DBADatabase и -FileMapping - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь восстановить базу данных на том же экземпляре под другим именем, и мне нужно заменить физические имена файлов данных и файлов журналов.Для этого я хочу использовать параметр -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_dataE: \ Data2016 \ dmu \ dm \ X_ENTWICKLUNG_DM.mdf
Database_Log F: \ Log2016 \ dmu \ dm \ X_ENTWICKLUNG_DM.ldf

Я посмотрел документы (см. Пример15) `но я, должно быть, делаю что-то еще не так.

Отредактировано: в SSMS это выглядит так SSMS_Picture Так что файлам в« Восстановить как »нужно другое имя,Вот чего я хочу достичь.

Кто-нибудь знает, как исправить PowerShell, чтобы сделать это?Я, должно быть, упускаю что-то глупое, я думаю.Спасибо

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Я хотел бы возобновить предыдущий ответ.Для меня это работает!:

Restore-DbaDatabase -SqlInstance localhost -DatabaseName NewDatabase -Path 'C:\MyPath\MyDatabase.bak' -WithReplace -ReplaceDbNameInFile

Вот и все.

Спасибо @ Mötz

0 голосов
/ 07 декабря 2018

Предполагается, что у вас есть файл резервной копии из базы данных "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 , чтобы помочь вам исследовать проблему, с которой вы столкнулись.облицовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...