web-dev-qa-db-ja.com

SQL Server 2005でMDFからデータベースを回復する方法は?

MDFファイルがあり、MS SQL Server 2005で作成されたデータベースのLDFファイルがありません。MDFファイルを別のSQL Serverにアタッチしようとすると、次のエラーメッセージが表示されます。

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

次のオプションのいずれかを実行したいと思います。

  1. データを失うことなくデータベースを接続します(可能性は低いですが、時間を節約できます)。
  2. データを損失してデータベースを接続します(開いていたトランザクションはすべて失われます)。
  3. MDFファイルからスキーマのみ(データなし)を回復します。

データベースを再度稼働させるには、どのSQLコマンドを使用できますか?

15
Martin

Experts Exchange で次のドキュメントを見つけました。

patrikt:データが失われますが、それは可能です。

 1。データベースを切り離し、mdfを保存場所に移動します。
 2。同じ名前、同じファイル、同じファイルの場所、同じファイルサイズの新しいデータベースを作成します。
 3。 SQLサーバーを停止します。
 4。作成したDBのmdfファイルを保存したmdfファイルに置き換えます。
 5。 SQLを起動します。 DBが疑わしい。
 6。 ALTER DATABASE yourdb SET EMERGENCY 
 7。 ALTER DATABASE yourdb SET SINGLE_USER 
 8。 DBCC CHECKDB(yourdb、REPAIR_ALLOW_DATA_LOSS)
 9。 ALTER DATABASE yourdb SET MULTI_USER 
 10。 ALTER DATABASE yourdb SET ONLINE 
21
Martin

MDFファイルが破損している場合に発生する可能性があるログの再作成が機能しない場合の2)と3)の詳細について説明します。

MDFファイルを読み取るには、バイナリデータとして書き込まれた内容をデコードできるサードパーティ製のツールを使用する必要がありますが、そのようなツールを使用しても、完全にジョブを実行できるとは限りません。

そのような場合、 ApexSQL Recover を試すことができます。私が知っていることから、これはこの種の仕事を行うことができる唯一のツールですが、非常に高価です。

はるかに良いアイデアは、もしあれば古いバックアップからこれらを回復しようとすることです。

11
George Ober

SQL Serverフォーラムの投稿から Attaching MDF without LDF

MDF LDFなしで添付する場合は、以下の手順を実行できます。テストされており、正常に動作しています

  1. 同じ名前と同じMDFおよびLDFファイルで新しいデータベースを作成します

  2. SQLサーバーを停止し、既存のMDFを新しい名前に変更し、元のMDFをこの場所にコピーして、LDFファイルを削除します。

  3. SQL Serverを起動する

  4. これで、データベースが問題ありとマークされます。5. sysdatabasesを更新して、緊急モードに更新します。これは起動時にLOGファイルを使用しません

Sp_configure "allow updates", 1
go
Reconfigure with override
GO
Update sysdatabases set status = 32768 where name = "BadDbName"
go
Sp_configure "allow updates", 0
go
Reconfigure with override
GO
  1. SQLサーバーを再起動します。これでデータベースは緊急モードになります

  2. ドキュメントに記載されていないDBCCを実行して、ログファイルを作成します。

DBCC REBUILD_LOG(dbname、 'c:\ dbname.ldf')-新しいログファイルを作成するための文書化されていない手順。

(ur要件に基づいてdbnameとログファイル名を置き換えます)

  1. Sp_resetstatusを実行する

  2. SQLサーバーを再起動し、データベースがオンラインであることを確認します。

UPDATE:DBCC REBUILD_LOGには、SQL2005以降は存在しません。これはうまくいくはずです:

USE [master]
GO
CREATE DATABASE [Test] ON 
    (FILENAME = N'C:\MSSQL\Data\Test.mdf')
    FOR ATTACH_REBUILD_LOG
GO
9
Jose Basilio

ldfを無視してmdfを添付しようとしましたか?

sp_attach_single_file_db [@dbname =] 'dbname'、[@physname =] 'physical_name'

私はあなたの開いているトランザクションに何が起こるか(おそらく失われただけ)を正確に知りませんが、それはあなたのデータをオンラインに戻すかもしれません。

-ドン

5
Don Dickinson

ここを参照してください: マスターを再構築し、完全なディスク障害からシステムデータベースを復元します これは非常に素晴らしい説明です

2
SQLMenace

私自身もこの問題を抱えていましたが、上記の答えはどれもうまくいきませんでした。

しかし、代わりに、これがおもしろいことを発見したので、私は他の皆のためにこれを共有したいと思いました:

http://www.kodyaz.com/articles/sql-server-attach-database-mdf-file.aspx

1
Brett Rigby

完全に機能する別の方法を見つけました:

  1. デフォルトのデータベースの場所に同じ名前で新しいデータベースを作成します。
  2. SQLサーバーを停止します。
  3. 古いmdfファイルをコピーして、新しく作成されたmdfファイルを上書きし、新しいldfファイルを削除します
  4. SQL Serverを起動すると、データベースは緊急モードになります
  5. 緊急モードデータベースを切り離します
  6. 元のldfファイルをデフォルトのデータベースの場所(上記の手順3で作成および削除された新しいLDFファイル)にコピーします。
  7. データベースを添付MDFファイル。

私のために失敗した上記のすべてを試した後、私は稼働中のデータベースを得ました。

1
folbaj

簡単にできるといいのですが、

  1. Open SQL Server
  2. 新しいクエリをクリック
  3. 次のクエリを実行

    sp_attach_single_file_db @ dbname = 'dbname'、@ physname = 'C:\ Database\dbname.MDF'

dbnameは、オブジェクトエクスプローラーに表示する場所です。ここで、@physnameは、mdfファイルのローカルファイルパスの場所です。

私が上記で行った誰かが構造とデータの両方を手に入れられることを願っています。

Sql Server 2000および2008でテスト済み。SqlServer 2000では機能していませんが、2008年には完全に機能します。

0
Abdul Rahman