web-dev-qa-db-ja.com

削除されたテーブルデータをロールバックする方法は?

誤って1つのテーブルを削除してしまいました。どうすればロールバックできますか。提案してください。

6
Simhadri

バックアップから入手してください!

12
thursdaysgeek

Joe Stefanelliが言ったように、ApexSQLツールが役立ちます。実際には、テーブル全体が削除された場合、ApexSQL Recoverという2つのツールがあります。テーブルレコードのみが削除された場合、ApexSQLログとApexSQL Recoverの両方が役立ちます。

試用中の両方のツールの制限は、10トランザクションのうち1トランザクションしか回復しないことです。良い知らせは、ApexSQLログにはグリッド内のすべてのレコードが試用期間でも表示されるため、回復可能なレコードを確認できることです。制限は、ツールのライセンスを取得するまで、それらすべての元に戻すスクリプトを作成できないことです。

ツールは、データ(MDF)ファイル(ApexSQL Recover)とトランザクションログ(LDFおよびtrn-オンライン、デタッチ、バックアップ-ApexSQLログ)を読み取るため、データベースの完全バックアップまたは差分バックアップがない場合でもデータを復元できます。

DROPテーブル操作により失われたテーブルを回復するための4つのテクニック

免責事項:私はApexSQLでサポートエンジニアとして働いています

9
Milena Petrovic

適切なバックアップがない場合は、 ApexSQL Log のようなサードパーティのツールを試してみてください。無料の試用版の制限は何なのかわかりませんが、一見の価値があるかもしれません。

4
Joe Stefanelli

バックアップがある場合は、 SQL Serverのデータベースバックアップまたはトランザクションログバックアップから特定のテーブルまたは行を取得する方法 で説明されている手順に従います。

  • 現在のトランザクションログをバックアップします
    NO_TRUNCATEオプションを使用して現在のトランザクションログをバックアップします。

  • データベースの部分的または完全なバックアップを復元します
    SQL Server 2000またはSQL Server 2005バックアップ戦略にファイルグループバックアップが含まれている場合、データベースの部分的な復元を別の場所に実行し、取得するテーブルを含むデータベースの一部のみを復元できます。データベースを別の名前と場所に復元する方法の詳細については、次のリファレンスを参照してください。 ファイルを新しい場所に復元する方法(Transact-SQL)

  • STOPATオプションを使用してトランザクションログのバックアップを復元します
    トランザクションログのバックアップをデータベースの部分的または完全な復元に復元し、テーブルまたは行が削除された時点より前に停止します。 RESTORE LOGコマンドのSTOPATオプションを使用して、トランザクションログの復元を停止し、テーブルが削除される前にデータベースを回復します。 特定の時点に復元する方法を参照してください

  • データを取得
    データベースを復元した後、INSERT、Bcp(一括コピーユーティリティ)、またはSELECT INTOを使用して、テーブルまたは行を元のデータベースにコピーして戻すことができます。 ...

  • DBCC CHECKTABLE
    新しいテーブルでDBCC CHECKTABLE Transact-SQL参照を実行して、データの整合性を確認します。

詳細は省略しました。KB記事へのリンクをたどって、トピックの完全な記事をご覧ください。

4
Remus Rusanu

サードパーティのツールについて言及している人もいます。個人的にトランザクションログの再生に運があったのはToad by Questだけです。それはそれほど安くはありませんが、それが重要であればそれは命の恩人です。 SQLインジェクションに攻撃され、一部の古いDBを台無しにした、不作法なWebアプリがいくつかありました。攻撃は実際には問題ではありませんでしたが、それらが実行しているコードを確認したかったため、T-LOGを読み返すことができたのは驚くほど便利でした。

1
Tim

SQL Serverで削除されたテーブルデータを回復するもう1つの便利な方法は、fn_dblog()関数を使用することです。

use mydatabase
go
SELECT 
 [Current LSN],    
 [Transaction ID],
     Operation,
     Context,
     AllocUnitName

FROM 
    fn_dblog(NULL, NULL) 
WHERE 
    Operation = 'LOP_DELETE_ROWS'

ただし、fn_dblog()関数を使用してデータを回復する方法は長すぎますが、テーブルの削除されたレコードを表示するのに役立ちます。

0
Jason Clark

バックアップはありますが、すでにそれで完了しています。データベースログを操作して、最近の削除をロールバックできますか。 – Simhadri

transaction-log replaying strategy を探る必要があるかもしれません。

0
Dan J