【问题标题】:Cannot bind RelocateFile when using Restore-SqlDatabase cmdlet使用 Restore-SqlDatabase cmdlet 时无法绑定 RelocateFile
【发布时间】:2014-10-16 09:23:50
【问题描述】:

我的机器上安装了 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”值转换为 键入“Microsoft.SqlServer.Management.Smo.RelocateFile”以键入 "Microsoft.SqlServer.Management.Smo.RelocateFile"。

这里也描述了这个问题:Problems with RelocateFile property in the Restore-SqlDatabase cmdlet

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

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

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

【问题讨论】:

  • 您尝试过 32 位和 64 位 Powershell 会话吗?使用[Environment]::Is64BitProcess 确定您的身份。
  • @vonPryz 我没有,我会试一试

标签: sql-server powershell smo


【解决方案1】:

我知道这是旧的,但我遇到了同样的问题。

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

组装

  • Microsoft.SqlServer.SmoExtended,版本=13.0.0.0,文化=中性,PublicKeyToken=89845dcd8080cc91

  • Microsoft.SqlServer.SmoExtended,版本=12.0.0.0,文化=中性,PublicKeyToken=89845dcd8080cc91

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

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

希望这会帮助其他发现此问题的人。

【讨论】:

  • 太好了,这有帮助!谢谢!
【解决方案2】:

您可以以独立于版本的方式执行此操作:

$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)

【讨论】:

    【解决方案3】:

    我想不出按原样解决此问题的好方法。我最终卸载了两个 SQL Server 安装,只安装了 SQL Server 2014。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多