web-dev-qa-db-ja.com

SQL Server 2008を使用して誤って削除されたデータベースを回復する方法

SQL Server 2008を使用して誤って削除されたデータベースを回復するにはどうすればよいですか?

6
laxman

このリンクは、これに関連するいくつかの一般的な質問に回答します。

SQL SERVER –バックアップの有無にかかわらずデータベースを復元–復元とバックアップに関するすべて

キャッチフレーズは:

変更をロールバックするには、完全なバックアップが必要です。完全なバックアップがない場合、元に戻すことはできません。ごめんなさい。

5

これは、他の回答よりも少しだけ主体を具体化することを期待して、少し長くなります。

データベースを削除すると、その下にあるファイルはごみ箱に移動されず、実際に削除されます。 「削除された」とは、NTFSファイルシステムが場所と長さを説明するために使用するディレクトリエントリが削除され、OSに関する限り、これらのファイルが使用されるディスク上のスペースが任意の目的で自由に使用できるようになることを意味します。他のファイルがそこに書き込まれる可能性があり、それによって「取り戻したい」データが上書きされます。

サードパーティの削除取り消しユーティリティを使用して、データとログファイルを「回復」できる場合があります。これに関する問題は、ファイルが以前に配置されていたディスク上の領域にデータが既に書き込まれている可能性があるため、これらのユーティリティがファイルを100%元に戻さないことが多いことです。これは、データベースが削除されたときにファイルが削除された後、システムがしばらく実行され続けた場合に特に当てはまります。 (データベースを削除した直後にシステムをシャットダウンするのが最善ではありますが、すばらしいことではありません。おそらくそれは起こらなかったと思います。)

元に戻すユーティリティによってファイルが100%正しく復元されない場合、データやデータベースファイルの内部構造が破損します。 SQL Serverは、(attachコマンドを使用して)ファイルがオンラインに戻ったときにこれに気づき、データベースに問題があるとしてフラグを立てます。稼働中のデータベースがなくても、元の場所に戻ることができます。

SQL Serverがデータベースを正常にオンラインにしても、これはデータが破損していないことを保証するものではありません。アタッチされている可能性のあるデータベースを接続コマンドでオンラインにした後、最初に行うべきことは、DBCC CHECKDB()を実行することです。そのコマンドが問題を見つけることなく実行される場合、おそらく大丈夫です(そしてすぐにバックアップを作成する必要があります)。修正できない破損が見つかる可能性が高くなります。

絶対にデータを取り戻す必要がある場合は、インターネット上に、破損したデータベースから破損していないデータをできるだけ多く抽出しようとするさまざまな英雄についての記事があります。あなたはそれらを試してみることができます、あるいはあなたは専門家またはマイクロソフト(おそらく彼らのパートナーにあなたを単に向けるでしょう)にさえ電話する方が良いかもしれません。

「英雄的」は技術的な観点から読むと興味深いものですが、最善の方法は、データを取得するために通常とは異なる手段をとる必要がある状況を避けることです。 (これは、データベースをフルタイムで管理していない人にも当てはまります(実際には、三重に)。)最も簡​​単なことは、必要な方法で定期的にデータをバックアップし、復元プロセスをテストすることです。サードパーティのスペシャリストを介してデータを取り戻すのにどれほどの費用がかかるかを理解するまで、ディスク容量は高額に思えます。

4
darin strait

バックアップはありますか?その場合は、これから復元してください。

そうでない場合、それ以上のオプションはありません。 MDFおよびLDFファイルが削除されます( DROP DATABASE を参照))

2
gbn

可能な解決策の1つ(これは、すぐに実行した場合にのみ機能します):

  • いくつかのデータ復旧ソフトウェア(DataRecovery、PandoraRecovery、DataRecoveryなど)を入手します。
  • ソフトウェアを実行して、ハードドライブのスキャンで削除されたファイルを見つけることができるかどうかを確認します。
  • 削除されたファイルが表示される場合は、それらを別のドライブ(USBまたは外部ドライブ)に復元します。

それが機能しない場合は、専門のデータ復旧会社に連絡するのが唯一の選択肢です。

1
Kamran

誤って削除したトランザクションがBeginトランザクション内で実行され、コミットされなかった場合、fn_dblog()関数を使用して回復できます。以下のコマンドを適用して、誤って削除したデータを表示できます。

SELECT
    [Current LSN],
    [Transaction ID],
    [Operation],
    [Context],
    [AllocUnitName]
FROM fn_dbLog(NULL, NULL)
WHERE [Operation] = 'LOP_DELETE_ROWS'

ただし、このプロセスは長すぎて時間がかかります。これは 無料のSQL ldfビューア を使用して簡単に行うことができます。これにより、より適切な結果が得られるだけでなく、数回のクリックで削除されたデータベースレコードを回復できます。

0
Jason Clark