【问题标题】:How to bring SQL Server database out of "restoring" mode using SMO如何使用 SMO 使 SQL Server 数据库退出“恢复”模式
【发布时间】:2016-06-09 23:33:35
【问题描述】:

我正在将数据库从日志传送中移除,并尝试使用 SMO 来完成。我正在尝试使用 SMO 模仿以下 T-SQL:

restore database <database name> with recovery

这是我的代码:

# select secondary_database from msdb.dbo.log_shipping_secondary_databases
$dsSecLSDB = $secInst.Databases["MSDB"].ExecuteWithResults("select secondary_database from log_shipping_secondary_databases")
$secLSDB = $dsSecLSDB.Tables.Rows

foreach($db in $secLSDB.secondary_database) {
        write-host "Restoring database (bringing online)..."
        $secRestrObj = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Restore -Property @{
            Action = 'Database';
            Database = $db;
            NoRecovery = $FALSE;
        }

        $secRestrObj.SqlRestore($secInst);
        write-host "Done with restore."
}

错误:

Microsoft.SqlServer.Management.Smo.PropertyNotSetException:要完成此操作,请设置属性 Devices

DeviceType(来自https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.devicetype(v=sql.105).aspx)的可用选项有:

  • 逻辑设备
  • 胶带
  • 文件
  • 管道
  • 虚拟设备

问题是,我不知道要创建哪个DeviceType。我的猜测是LogicalDevice,但我不知道它的价值。以前有人做过吗?

【问题讨论】:

  • 考虑简单地使用ExecuteNonQuery 发出RESTORE $db WITH RECOVERY。另一种方法是使用 SMO 费力地找出当前正在使用的备份集,以便您可以正确设置 Devices 属性,但为什么仅仅因为 SMO 要求您这样做(当 T-SQL 中不存在此类限制时)就跳过箍?
  • 谢谢。看来我需要走那条路,希望以前有人已经这样做了。
  • 可能有人有,但是看到 SMO 最终除了执行 SQL 之外什么都不做,你基本上是为了使用 SMO 而使用 SMO,这在这种情况下只是一个减速带.在某些情况下,SMO 比普通 SQL 方便得多(例如,当您需要关联许多无法使用查询轻松检索的复杂属性时,或者以编程方式生成语句会非常麻烦);这不是其中之一。

标签: sql-server database restore using smo


【解决方案1】:

我也面临同样的麻烦。 我猜想 sqlRestore 方法仅限于从备份文件/设备进行强大的数据库恢复。 仅使状态为“正在恢复”的数据库“联机”(即从日志传送或损坏的 AG 中支持数据库)似乎只能使用 invoke-sqlcmd 小程序执行“恢复数据库并恢复”。

或者如果有人有其他解决方案...

【讨论】:

  • 您的回复看起来像是对问题的评论,而不是答案。如果您打算发表评论,您需要在任何帖子上拥有足够的reputationcomment。还要检查这个what can I do instead
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多