web-dev-qa-db-ja.com

トランザクションログの再構築

非常に大きなデータベース(約6 TB)があり、そのトランザクションログファイルは(SQL Serverのシャットダウン中に)削除されました。

  1. データベースの切り離しと再接続。そして
  2. トランザクションログファイルの削除の取り消し

...しかし、これまで何も機能していません。

現在実行中です:

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時間かかりました)成功しました。データベースバックアップの重要性(およびプロジェクトマネージャーにサーバーへのアクセス権を付与する...)の重要性をすべて学習したとしましょう。

20

疑わしいデータベースは切り離さないでください。とにかく、デタッチした後、どのようにデータベースをアタッチしましたか? _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は、起動時または接続時に、そこにないログファイルからの回復(ロールバックとロールフォワード)を実行します。これは、ディスクがクラッシュするか、サーバーが予期せずシャットダウンし、データベースが正常にシャットダウンされない場合に発生します。私はそれがあなたのケースではなかったと思います、そしてあなたのためにすべてがうまくソートされました。

  1. DBCC CHECKDB (DBNAME, REPAIR_ALLOW_DATA_LOSS)緊急状態のデータベースで実行すると、データベースに不整合エラーがないかチェックされ、まずログファイルを使用して不整合から回復しようとします。これがない場合、トランザクションログが再構築されます。

  2. _ALTER DATABASE REBUILD LOG ON..._は文書化されていない手順であり、エラーを修正するには後続の_DBCC CHECKDB_が必要です。

20
yrushka

はい、これらは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 によるこのブログ投稿も参照してください。

緊急モードの修復:非常に最後の手段

12
SQLRockstar