web-dev-qa-db-ja.com

削除されたレコードを取り戻すにはどうすればよいですか?

リモートのSQL Server 2008テーブルから約2,000,000のレコードを誤って削除しました。サーバーがサーバー側のバックアップファイルへのアクセスを許可していません。

これらの記録を取り戻す方法はありますか?

49
user755

データベースは完全復旧モードですか?

  • はいの場合、トランザクションログのバックアップを行っていますか?

    • はいの場合、Quest LiteSpeed、Red Gate SQLバックアップ、またはIdera SQLSafeなどのバックアップユーティリティはありますか?
      • はいの場合、これらのユーティリティはオブジェクトをバックアップファイル(完全およびトランザクションログを含む)から削除を取り消すことができますが、それらの使用方法の説明は、ここでできることの範囲を超えています。手順については、ベンダーにお問い合わせください。
      • いいえの場合、完全バックアップとトランザクションログを別の名前のデータベースとして復元します。 (既存のデータベースを上書きしないでください。)削除が発生する前にオブジェクトの最新のコピーを取得できますが、restoreコマンドのstopat部分を使用して、コマンドの復元をいつ停止するか。削除が発生する前に停止する必要があります。
    • いいえの場合は、Quest LiteSpeedやApex SQL Logなどのログリーダーユーティリティのコピーを入手してください。これらのユーティリティは、データベースサーバーに接続し、ログファイルを調べて、トランザクションを元に戻すのに役立ちます。デモ版が機能するかどうかはわかりませんが、有料版は確実に機能します。
  • いいえ(完全復旧モードでない場合)、最後の完全バックアップを別の名前のデータベースとして復元します。 (すでに取得しているデータベースを上書きしないでください。)そこから、バックアップ時にオンラインであったすべてのレコードを復元できますが、それ以降の変更はすべて失われます。

118
Brent Ozar

SQL Serverは、削除された各レコードのログを保持します。これらのログは、fn_dblog SQL Server関数を介してクエリできます。

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

ただし、このログは16進形式なので、この16進形式を実際のデータに変換する必要があります。

以下の記事は、上記で定義した方法で削除されたレコードを回復するのに役立ちます。

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

30
user1059637

残念ながら、これ以上の情報がなければ、私たちはあなたを助けることはできません。しかし、あなたの質問から、データベースから200万件のレコードのように見えるものを削除したようです。ほとんどの場合、データベースに完全にログオンしていて、非常に具体的なツールを購入しない限り、この情報を回復することはできません。

自分がやったと思うこと、レコードを取り戻すことができないと思う理由、およびデータベースの編成を詳しく説明できる場合は、もう少しお手伝いできます。

いくつかの一般的なアドバイス:200万件のレコードを削除したと思われる場合は、おそらく今は少しおかしくなっています。したがって、5分間の休憩を取り、落ち着いて問題を再検討する必要があります。また、それが合理的であり(午前2時に起こして告知しないでください)、解決策に取り組んでいる場合は、すぐに上司に伝える必要があります。必死に回復を試み、問題を悪化させ、詳細を隠すよりも、何が起こったのかを認めた方が良いでしょう。上司が何らかの形で役立つことを知っていると、問題の修正に役立ちます。私が言ったように、いくつかの一般的なアドバイスです。

22
jcolebrand