Restore-DBADatabase和-FileMapping参数问题

时间:2018-12-06 15:43:41

标签: sql-server powershell dbatools

我正在尝试使用不同的名称还原同一实例上的数据库,并且需要替换数据和日志文件的物理文件名。为此,我想使用-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

我看了docs (see sample 15)`,但是我做错了其他事情。

编辑: 在SSMS中看起来像这样SSMS_Picture 因此,“还原为”下的文件需要一个不同的名称。这就是我要达到的目标。

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

2 个答案:

答案 0 :(得分:0)

假设您从同一服务器的“ 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,以帮助您调查所面临的问题。

答案 1 :(得分:0)

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

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

就是这样。

感谢@Mötz