有没有一种方法可以确定用于创建MDF或BAK文件的SQL Server版本?


19

我有一个SQL Server DB的本地副本存储为MDF文件。有没有办法告诉您使用哪个版本的SQL Server创建该文件?

Answers:


8

您可以通过查看偏移量0x12064处的两个字节来确定数据库的主MDF文件的版本。请参阅如何确定MDF文件的数据库版本

.bak文件中,低字节为0xEAC,高字节为0xEAD。

您可以在此处找到MS SQL的大多数内部数据库版本号。


1
注意!在MS SQL的x64版本上,这似乎有所不同。在所有情况下,都有4个块-SFMB,SSET,VOLB,MSCI。版本在MSCI块中。问题是块大小不恒定。幸运的是,似乎块大小可以除以512(0x200)。因此,只需寻找每512个字节并寻找“ MSCI”。然后,将低字节跳至172个字节(0xAC),将高字节跳至下一个字节。
Nux

22

使用RESTORE HEADERONLY,例如

RESTORE HEADERONLY FROM DISK = 'D:\whatever.bak'

您会看到很多专栏,但是感兴趣的是SoftwareVersionMajor,SoftwareVersionMinor和SoftwareVersionBuild,它们应该为您提供SQL Server的版本号。例如,在我们的系统上,它们分别是10、0和4000,表示10.0.4000(2008 SP2)。

不知道如果尝试使用太旧而无法在服务器运行的版本上还原的备份来执行此操作,则可能会得到一个错误并且没有任何信息(尽管它本身至少会提供一些线索)它来自的版本)。


1
我本来想尝试一下,但是我没有设置任何备份设备:-(。不过,还是谢谢您的建议!
Ben McCormack

1
请注意,当您测试例如SQL 2008上的SQL 2012备份时,此查询将无法获得可用的结果
。– Nux

6

对于MDF文件,请尝试以下命令:

dbcc checkprimaryfile ('c:\MyApp\AppData\foo.mdf', 2)

它会输出3个属性与值:Database nameDatabase versionCollation

语法如下(该命令未记录,因此请参见此处的更多信息):

DBCC CHECKPRIMARYFILE({'FileName'} [,opt = {0 | 1 | 2 | 3}])

FileName只是SQL Server数据库主数据文件.mdf文件的实际路径。

Opt = 0-验证文件是否为SQL Server数据库主数据文件(.mdf)。

Opt = 1-返回与数据库关联的所有文件的数据库名称,大小,最大大小,增长,状态和路径。

Opt = 2-返回数据库名称,版本和排序规则信息。

Opt = 3-返回与数据库关联的所有文件的名称,状态和路径。


1
您可能需要在答案中添加解释,这样才更有意义。
Drew Khoury

0

好问题!我不这么认为,除了尝试和尝试过程之外(例如,尝试将SQL Server 2008 R2备份文件还原到SQL Server 2005)。显然,这是行不通的。我不记得使用了Management Studio并单击内容按钮进行还原是否会显示任何有趣的内容。

我还没有尝试过,但是像Red Gate的Virtual Restore这样的第三方工具可能会告诉您-它使您可以在备份文件“内部”查看数据库。 http://www.red-gate.com/products/dba/sql-virtual-restore/



0

我见过的最好的方法是从SQL Server MSDN论坛上的这篇文章中收集的。

基本上,它涉及进入文件并检查mdf文件的引导页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.