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.
次のオプションのいずれかを実行したいと思います。
データベースを再度稼働させるには、どのSQLコマンドを使用できますか?
Experts Exchange で次のドキュメントを見つけました。
patrikt:データが失われますが、それは可能です。
1。データベースを切り離し、mdfを保存場所に移動します。 2。同じ名前、同じファイル、同じファイルの場所、同じファイルサイズの新しいデータベースを作成します。 3。 SQLサーバーを停止します。 4。作成したDBのmdfファイルを保存したmdfファイルに置き換えます。 5。 SQLを起動します。 DBが疑わしい。 6。 ALTER DATABASEyourdb
SET EMERGENCY 7。 ALTER DATABASEyourdb
SET SINGLE_USER 8。 DBCC CHECKDB(yourdb
、REPAIR_ALLOW_DATA_LOSS) 9。 ALTER DATABASEyourdb
SET MULTI_USER 10。 ALTER DATABASEyourdb
SET ONLINE
MDFファイルが破損している場合に発生する可能性があるログの再作成が機能しない場合の2)と3)の詳細について説明します。
MDFファイルを読み取るには、バイナリデータとして書き込まれた内容をデコードできるサードパーティ製のツールを使用する必要がありますが、そのようなツールを使用しても、完全にジョブを実行できるとは限りません。
そのような場合、 ApexSQL Recover を試すことができます。私が知っていることから、これはこの種の仕事を行うことができる唯一のツールですが、非常に高価です。
はるかに良いアイデアは、もしあれば古いバックアップからこれらを回復しようとすることです。
SQL Serverフォーラムの投稿から Attaching MDF without LDF :
MDF LDFなしで添付する場合は、以下の手順を実行できます。テストされており、正常に動作しています
同じ名前と同じMDFおよびLDFファイルで新しいデータベースを作成します
SQLサーバーを停止し、既存のMDFを新しい名前に変更し、元のMDFをこの場所にコピーして、LDFファイルを削除します。
SQL Serverを起動する
これで、データベースが問題ありとマークされます。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
SQLサーバーを再起動します。これでデータベースは緊急モードになります
ドキュメントに記載されていないDBCCを実行して、ログファイルを作成します。
DBCC REBUILD_LOG(dbname、 'c:\ dbname.ldf')-新しいログファイルを作成するための文書化されていない手順。
(ur要件に基づいてdbnameとログファイル名を置き換えます)
Sp_resetstatusを実行する
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
ldfを無視してmdfを添付しようとしましたか?
sp_attach_single_file_db [@dbname =] 'dbname'、[@physname =] 'physical_name'
私はあなたの開いているトランザクションに何が起こるか(おそらく失われただけ)を正確に知りませんが、それはあなたのデータをオンラインに戻すかもしれません。
-ドン
ここを参照してください: マスターを再構築し、完全なディスク障害からシステムデータベースを復元します これは非常に素晴らしい説明です
私自身もこの問題を抱えていましたが、上記の答えはどれもうまくいきませんでした。
しかし、代わりに、これがおもしろいことを発見したので、私は他の皆のためにこれを共有したいと思いました:
http://www.kodyaz.com/articles/sql-server-attach-database-mdf-file.aspx
完全に機能する別の方法を見つけました:
私のために失敗した上記のすべてを試した後、私は稼働中のデータベースを得ました。
簡単にできるといいのですが、
次のクエリを実行
sp_attach_single_file_db @ dbname = 'dbname'、@ physname = 'C:\ Database\dbname.MDF'
dbname
は、オブジェクトエクスプローラーに表示する場所です。ここで、@physname
は、mdfファイルのローカルファイルパスの場所です。
私が上記で行った誰かが構造とデータの両方を手に入れられることを願っています。
Sql Server 2000および2008でテスト済み。SqlServer 2000では機能していませんが、2008年には完全に機能します。