0

我正在尝试以不同的名称在同一实例上还原数据库,我需要替换数据和日志文件的物理文件名。为此,我想使用 -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 中看起来像这样SSMS_图片 因此“还原为”下的文件需要不同的名称。这就是我想要达到的目标。

有人知道如何修复 PowerShell 来做到这一点吗?我想我一定错过了一些愚蠢的东西。谢谢

4

2 回答 2

2

我想恢复之前的回复。对我来说,它有效!:

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

而已。

谢谢@Mötz

于 2019-05-21T16:22:59.177 回答
1

假设您有来自同一服务器的“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>"

更新

我刚刚在我的实验室服务器上创建了一个新数据库。我将其命名为TEST。数据库是空的,但它用于测试我的代码。

我使用以下命令对数据库进行了完整备份:

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

Restore-DbaDatabase cmdlet的-OutputScriptOnly参数不会执行脚本,只会生成它并将其输出到您的控制台。

请注意,它要恢复的文件名实际上被重命名为我要恢复到的新数据库的名称。

我建议您创建一个空数据库并使用它,直到您的命令执行并按预期运行。我建议您运行更新,以防万一。

Update-Module dbatools -Force

在您进行故障排除时,请尝试执行Get-DbaBackupInformation cmdlet 以帮助您调查您面临的问题。

于 2018-12-06T21:27:57.740 回答