非常に大きなデータベース(約6 TB)があり、そのトランザクションログファイルは(SQL Serverのシャットダウン中に)削除されました。
...しかし、これまで何も機能していません。
現在実行中です:
ALTER DATABASE <dbname> REBUILD
LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')
...しかし、データベースのサイズを考えると、これはおそらく完了するまでに数日かかります。
上記のコマンドと次のコマンドに違いはありますか?
DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
REPAIR_ALLOW_DATA_LOSS
代わりに?
データは他のソースから派生しているため、データベースを再構築できることは注目に値しますが、すべてのデータを再度挿入するよりもデータベースを修復する方がはるかに速いと考えられます。
更新
スコアを維持している場合:ALTER DATABASE/REBUILD LOG
コマンドは約36時間後に完了し、報告されました:
警告:データベース 'dbname'のログが再構築されました。トランザクションの一貫性が失われました。 RESTOREチェーンが壊れており、サーバーには以前のログファイルのコンテキストがないため、それらが何であったかを知る必要があります。
物理的な整合性を検証するには、DBCC CHECKDBを実行する必要があります。データベースはdbo専用モードになっています。データベースを使用できるようにする準備ができたら、データベースオプションをリセットし、余分なログファイルを削除する必要があります。
次に、DBCC CHECKDB
(約13時間かかりました)成功しました。データベースバックアップの重要性(およびプロジェクトマネージャーにサーバーへのアクセス権を付与する...)の重要性をすべて学習したとしましょう。
疑わしいデータベースは切り離さないでください。とにかく、デタッチした後、どのようにデータベースをアタッチしましたか? _CREATE DATABASE
_オプションで_FOR ATTACH_REBUILD_LOG
_を使用しましたか?
これらのコマンドはトリックを行うべきでした:
_ALTER DATABASE recovery_test_2 SET EMERGENCY;
ALTER DATABASE recovery_test_2 SET SINGLE_USER;
DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS)
WITH NO_INFOMSGS, ALL_ERRORMSGS;
_
私はこの状況についての投稿を書きました:
SQL 2005/2008データベース回復手順–ログファイルが削除されました(パート3)
次の違いについて質問しました。
DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
およびALTER DATABASE <dbname> REBUILD LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')
問題は、両方を実行してログファイルを再構築できることですが、CHECKDB
を使用すると、ログを再構築し、データベースの整合性エラーもチェックします。
また、ログファイルが失われたときにアクティブなトランザクション(ディスクに書き込まれていない)があった場合、2番目の(代替データベース)は機能しません。 SQL Serverは、起動時または接続時に、そこにないログファイルからの回復(ロールバックとロールフォワード)を実行します。これは、ディスクがクラッシュするか、サーバーが予期せずシャットダウンし、データベースが正常にシャットダウンされない場合に発生します。私はそれがあなたのケースではなかったと思います、そしてあなたのためにすべてがうまくソートされました。
DBCC CHECKDB (DBNAME, REPAIR_ALLOW_DATA_LOSS)
緊急状態のデータベースで実行すると、データベースに不整合エラーがないかチェックされ、まずログファイルを使用して不整合から回復しようとします。これがない場合、トランザクションログが再構築されます。
_ALTER DATABASE REBUILD LOG ON...
_は文書化されていない手順であり、エラーを修正するには後続の_DBCC CHECKDB
_が必要です。
はい、これらは2つの異なるステートメントであり、それぞれが非常に異なることを行います。
ファイルが削除されたときのデータベースの状態に応じて、mayデータベースを接続し、次のコマンドを使用してログを再構築することで、起動して実行できます:
EXEC sp_attach_single_file_db 'dbname here', 'file path and name here'
製品ドキュメントの sp_attach_single_file_db(Transact-SQL) を参照してください。
Paul S. Randal によるこのブログ投稿も参照してください。