web-dev-qa-db-ja.com

SQL Server:MDFファイルからトランザクションログの場所を取得する

SQL Server 2012 Expressサーバーがクラッシュし、一部のデータが失われました。メインMDFをなんとか救出できましたが、LDFが見つかりません。データベースからこの情報を取得する方法はありますかMDF=ファイルまたはmsdb、または見つかった一時的なmdfs?)

6
Rick

これは、MDFのいくつかの場所に保存されます。

  1. ベーステーブルsysprufiles-ローカルにインストールされているいくつかのデータベースを確認しましたが、確認したデータベースの155ページと153ページでそれを見つけました。これは常にファイルのかなり初期になると思いますが、場所が固定されているようには見えません。
  2. sysfiles1-これまでに確認したすべてのデータベースについて、32ページに確実に掲載されています。

この回答の最初のバージョンでは、16進エディターを使用してMDFから回答を読み取りました。

Dan Guzman は、文書化されていない、非常にシンプルなDBCCコマンドがあることを指摘しています。

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

次のような結果を返します

+--------+---------+-------+---------+--------+---------+------+-------------------------+----------------------------------------------------------------------------------------------+
| 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  |
+--------+---------+-------+---------+--------+---------+------+-------------------------+----------------------------------------------------------------------------------------------+

私はそのアプローチがどのように機能するかについて興味があったので、プロセスモニターのアクティビティを調べました。

enter image description here

これにより、ファイルのヘッダー(ページ0)、データベースブートページ(ページ9)、およびファイルのページ32が読み取られます。

上記のいずれのページにも32ページが記載されていなかったので、ページは情報から検索されるのではなく、情報が含まれるようにハードコードされていると思います。

11
Martin Smith