SQL Server:从 MDF 文件中获取事务日志的位置

Ric*_*ick 6 sql-server restore sql-server-2012

我们的 SQL Server 2012 Express 服务器崩溃并丢失了一些数据。我们设法抢救了主 MDF,但找不到 LDF。有没有办法从找到的数据库 MDF 文件或 msdb 或临时 mdfs 中获取此信息?

Mar*_*ith 11

这存储在 MDF 中的几个或多个位置。

  1. 基表sysprufiles- 我检查了一些本地安装的数据库,并在我检查过的数据库的第 155 页和第 153 页上找到了它。我想这在文件中总是相当早,但它似乎没有固定的位置。
  2. sysfiles1 - 到目前为止,对于我检查过的每个数据库,这在第 32 页上都是可靠的。

此答案的初始版本使用十六进制编辑器从 MDF 中读取它。

Dan Guzman指出有一个未公开的 DBCC 命令,它非常简单。

DBCC CHECKPRIMARYFILE ( N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AdventureWorks2012_Data.mdf',1);
Run Code Online (Sandbox Code Playgroud)

返回类似的结果

+--------+---------+-------+---------+--------+---------+------+-------------------------+----------------------------------------------------------------------------------------------+
| fileid | groupid | size  | maxsize | growth | status  | perf |          name           |                                           filename                                           |
+--------+---------+-------+---------+--------+---------+------+-------------------------+----------------------------------------------------------------------------------------------+
|      1 |       1 | 26240 |      -1 |   2048 |       2 |    0 | AdventureWorks2012_Data | C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AdventureWorks2012_Data.mdf |
|      2 |       0 |   128 |      -1 |     10 | 1048642 |    0 | AdventureWorks2012_Log  | C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AdventureWorks2012_log.ldf  |
+--------+---------+-------+---------+--------+---------+------+-------------------------+----------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我很好奇这种方法是如何工作的,所以查看了进程监视器中的活动。

在此处输入图片说明

这最终会读取文件头(第 0 页)、数据库引导页(第 9 页)和文件的第 32 页。

我在前面的任何一页都没有看到第 32 页,所以我认为该页面是硬编码的以包含信息,而不是从它们中查找。

  • 另一个选项是未记录的 DBCC 命令,例如`DBCC CHECKPRIMARYFILE (N'D:\SqlFiles\YourDatabase.mdf',1);` (2认同)