使用Restore-SqlDatabase cmdlet时无法绑定RelocateFile

时间:2014-10-16 09:23:51

标签: sql-server powershell smo

我的计算机上安装了SQL Server 2012 Developer。我也安装了SQL Server 2014管理对象,这可能是问题的根源。

我正在编写一个模块,通过Powershell自动执行一些常见的开发任务。其中之一是简单地将现有数据库复制到新数据库。

我知道有三种不同的备份和还原方法:执行SQL语句,SMO对象和SQLPS cmdlet。我对SQLPS路线感兴趣。这是我的职责:

push-location
import-module sqlps -disablenamechecking
pop-location

function Copy-Database {
    param (
        [string] $database,
        [string] $newDatabase
    )

    $backupFile = "$database-{0:yyyyMMddhhmmss}.bak" -f (get-date)
    backup-sqldatabase -serverinstance $defaultServerInstance -database $database -backupfile $backupFile -copyonly

    $solutionName = $newDatabase

    $mdf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDb_Data", "$defaultDatabaseRootPath\$solutionName\$newDatabase.mdf")
    $ldf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDb_Log", "$defaultDatabaseRootPath\$solutionName\$newDatabase.ldf")

    restore-sqldatabase -serverinstance $defaultServerInstance -database $newDatabase -backupfile $backupFile -RelocateFile @($mdf,$ldf)
}

它备份数据库,但是当它尝试恢复时,我收到以下错误:

  

Restore-SqlDatabase:无法绑定参数' RelocateFile'。不能   转换" Microsoft.SqlServer.Management.Smo.RelocateFile"的价值   type" Microsoft.SqlServer.Management.Smo.RelocateFile"输入   " Microsoft.SqlServer.Management.Smo.RelocateFile"

此问题也在此处描述:Problems with RelocateFile property in the Restore-SqlDatabase cmdlet

我接受这个问题可能是集会中的冲突。接受的答案提供了两个建议:

  
      
  1. 确保版本匹配。
  2.   
  3. 使用Microsoft.SqlServer.Management.Smo.Restore.SqlRestore方法而不是Restore-SqlDatabase cmdlet。
  4.   

然而,他们只解释如何做#2。我想知道如何使用Restore-SqlDatabase cmdlet使其工作。

3 个答案:

答案 0 :(得分:9)

我知道这已经过时了,但我遇到了同样的问题。

PS C:\> [AppDomain]::CurrentDomain.GetAssemblies().GetTypes() | ? FullName -eq Microsoft.SqlServer.Management.Smo.RelocateFile | select Assembly

汇编

  
      
  • Microsoft.SqlServer.SmoExtended,Version = 13.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91

  •   
  • Microsoft.SqlServer.SmoExtended,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91

  •   
New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" (*LogicalName*, *PhysicalName*)

这样做,使用完全限定的类型名称,解决了这个问题。

希望这可以帮助找到这个问题的其他人。

答案 1 :(得分:3)

您可以采用与版本无关的方式执行此操作:

$sqlServerSnapinVersion = (Get-Command Restore-SqlDatabase).ImplementingType.Assembly.GetName().Version.ToString()
$assemblySqlServerSmoExtendedFullName = "Microsoft.SqlServer.SmoExtended, Version=$sqlServerSnapinVersion, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

$mdf = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDb_Data', "$defaultDatabaseRootPath\$solutionName\$newDatabase.mdf")
$ldf = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDb_Log', "$defaultDatabaseRootPath\$solutionName\$newDatabase.ldf")

restore-sqldatabase -serverinstance $defaultServerInstance -database $newDatabase -backupfile $backupFile -RelocateFile @($mdf,$ldf)

答案 2 :(得分:0)

我无法找到解决这个问题的好方法。我最终卸载了SQL Server安装并只安装了SQL Server 2014。