如何从主数据库的 bak 文件中恢复主数据库?

Beu*_*per 7 sql-server restore master-system-database

在渗透测试期间,我发现了一个 MSSQL 数据库的多个 .bak 文件。我想全部恢复。在 Windows VM 中,我安装了 SQL Server 2017。为了恢复主数据库,我将服务器置于单用户模式并尝试如下恢复数据库(也通过 SSMS 尝试了相同的方法):

RESTORE DATABASE master
FROM DISK = 'C:\Foo\<path>\master.bak'
WITH MOVE 'master' TO 'C:\Foo\master.mdf',
MOVE 'master_log' TO 'C:\Foo\master_log.ldf',
REPLACE
GO
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,如:

.. 无法恢复,因为它是由与此服务器 (14...) 不同版本的服务器 (13.00.4435) 创建的。

然后,我通过订阅 my.visualstudio.com 上的“Visual Studio Dev Essentials”下载了带有 Service Pack 1 的 MSSQL 2016。现在我得到了错误:

.. 无法恢复,因为它是由与此服务器 (13.00.4001) 不同版本的服务器 (13.00.4435) 创建的。

所以现在我需要更新。我下载了 MSSQL 2016 服务包 2,它给了我错误:

.. 无法恢复,因为它是由与此服务器 (13.00.5026) 不同版本的服务器 (13.00.4435) 创建的。

所以我似乎真的需要确切的补丁。但是,我找不到对应服务器版本的补丁列表。有没有人知道如何找到合适的补丁?

如果我能将 .bak 文件提取到它的 .mdf- 和 .ldf 文件就足够了。我找到了一堆用于恢复 MSSQL .bak 文件的工具,但希望它们都想连接到数据库(进行简单的恢复)。如果我能获得正确的 SQL Server 版本或提取 .bak 文件,我会非常高兴。

Bre*_*zar 15

master 数据库比较特殊,不同于其他数据库。它是一个系统数据库,SQL Server 在其中存储内部对象。您通常唯一一次恢复它是在您从死机中恢复服务器时 - 您通常不希望将 master 从一个数据库恢复到另一个数据库。

在您的场景中,当您只是对数据库的内容感到好奇时,请使用不同的数据库名称还原 master,如下所示:

RESTORE DATABASE master_copy
FROM DISK = 'C:\Foo\<path>\master.bak'
WITH MOVE 'master' TO 'C:\Foo\master_copy.mdf',
MOVE 'master_log' TO 'C:\Foo\master_copy_log.ldf',
GO
Run Code Online (Sandbox Code Playgroud)

然后,还原完成后,您可以查询 master_copy 数据库中的对象。

  • 我同意布伦特的观点。如果您 * 仍然* 想让 master 作为 master 安装到不同的安装上,您可以尝试对其进行 hack-attach。停止那个 SQL Server 并换出 master.mdf 和 master.ldf。请注意,您的 SQL Server 现在可能无法启动,除非模型和 tempdb 是/可以在与“旧”安装相同的路径上创建的。 (2认同)