如何调用远程 T-SQL 过程将远程 .bak 数据库文件恢复到远程 SQL Server 实例?

Posted

技术标签:

【中文标题】如何调用远程 T-SQL 过程将远程 .bak 数据库文件恢复到远程 SQL Server 实例?【英文标题】:How do I call a remote T-SQL procedure to restore a remote .bak database file to a remote SQL Server instance? 【发布时间】:2020-12-01 01:55:21 【问题描述】:

我已将 SQL Server 数据库备份到名为 HACK_BACK.bak 的文件中。我已将该 .bak 文件复制到托管另一个 SQL Server 实例的远程服务器。

该远程服务器有一个名为RestoreDatabase 的过程,其中包含将.bak 文件恢复到该远程SQL Server 实例的代码。

在我的本地 SQL Server 数据库上,我有一个链接服务器,它连接到我调用 RestoreDatabase 过程的那个服务器。

当我使用链接服务器调用该远程过程时,我收到此错误:

无法打开备份设备“G:\DROPZONE\HACK_MACK.bak”。操作系统错误2(系统找不到指定的文件。)。

正在从我的本地 SQL Server 调用此远程过程,但执行上下文似乎是本地的,这就是我收到错误的原因。我希望该过程使用远程服务器的 G: 驱动器并将该 .bak 文件恢复到该远程 SQL Server 实例。

我该怎么做?

【问题讨论】:

【参考方案1】:

嗯,如果你在本地调用这样的远程过程,它应该可以工作

--linked server = REMOTE 
EXEC REMOTE.DB.RestoreDatabase 'G:\fileToRestore.bak'

那应该使用本地 G: 在 REMOTE SQL 实例上运行它,不是吗?

我不确定你现在运行的确切序列

另一种选择是使用 PowerShell(SQL 外部)连接到远程 SQL 实例以启动恢复过程。哎呀,看看 dbatools.io 甚至

【讨论】:

嗨,是的,这就是我正在做的事情,但我认为 MS SQL Server 正在做的是让上下文成为我的本地服务器而不是远程服务器,这就是为什么它找不到'G: '驱动文件夹,我的本地服务器上没有'G:'驱动文件夹,但远程服务器上有。这更有意义吗?您对使用 PowerShell 的建议是我正在考虑做的事情,但如果有一个纯 SQL 解决方案,我更愿意使用它。 我使用了 powershell 并且有效。我通过放入 master.sys.xp_cmdshell 命令来更新远程 SQL 实例上的存储过程,以调用包含 PowerShell 的“sqlps”Invoke-SqlCmd 命令中的 RESTORE 命令的 powershell 脚本。引擎盖里的一切都很好。 :) 很高兴听到 PowerShell 确实很强大 :) 我很惊讶远程调用执行会使用本地上下文......

以上是关于如何调用远程 T-SQL 过程将远程 .bak 数据库文件恢复到远程 SQL Server 实例?的主要内容,如果未能解决你的问题,请参考以下文章

开机VBS调用远程批处理(懂批处理的进)

远程过程调用和 MIDL:如何实现具有 [out] 属性的功能?

RabbitMQ学习 (远程过程调用(RPC))

RabbitMQ系列教程之六:远程过程调用(RPC)

远程RPC调用实现过程

Feign远程调用原理