9

一部の行を誤って削除しましたb、ログまたはSSMSを使用してそれらを復元できますか

4

2 に答える 2

12

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

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/

于 2012-12-09T09:01:51.637 に答える
10

データベースが単純リカバリモードの場合は、運が悪い可能性があります。最新のバックアップに復元できますが、かなり前の場合は、削除した行のコピーが含まれておらず、再挿入したい場合があります。その間に他のデータが挿入された可能性も非常に高いです。新しいデータベースに復元してから、SQL手術を実行して、消失したデータを元に戻すことができます。

データベースが完全復旧モードの場合、次のようになります。

  1. 最後の完全バックアップ、それ以降の増分、および最後の増分または完全以降のすべてのログバックアップファイルを検索し、それらを正しい時点まで復元します。許容できる場合はデータベースを上書きするか、新しいデータベースに復元してSQL操作を実行できます。

  2. 復元プロセスは次のようになります。

    BACKUP DATABASE YourDB TO DISK = 'D:\MSSQL\Data\YourDB\YourDB Pre-Repair.bak'
    -- It is CRUCIAL you take a new backup before doing ANYTHING so you don't
    -- make another mistake you can't reverse.
    
    RESTORE DATABASE YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak' WITH REPLACE, NORECOVERY;
    -- be very careful with REPLACE as needing it proves there is un-backed-up data
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 111500.log' WITH NORECOVERY;
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 113000.log' WITH NORECOVERY;
    -- restore more log files, all of them, in order, with none skipped
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121209 020000.log'
       WITH STOPAT = '20121209 01:57:00', RECOVERY;
    

    ここで使用したことに注意してWITH STOPATください。これにより、特定の時点までデータベースを復元できます。私の例では、ログのバックアップは15分ごとに行われ、致命的なクエリは2012-12-09の午前1:57:15に発行されました。

データベースを新しいデータベースに復元する場合は、次のようにする必要があります。

RESTORE DATABASE NewDB FROM DISK
   = 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak'
WITH
   MOVE 'YourDBLogicalName' TO 'D:\MSSQL\Data\NewDB.mdf',
   MOVE 'YourDBLogicalName_Log' TO 'L:\MSSQL\Logs\NewDB.ldf';

RESTORE FILELISTONLYバックアップの内容を把握するために使用します。同じファイルに複数のバックアップがある場合は、その情報を読み取って、操作するバックアップを指定するための構文がさらにあります。sp_helpdb 'YourDB'NewDBデータベースとログファイルを配置する場所を見つけるために使用します。

次に、必要に応じて、論理ファイルの名前を変更するためのスクリプトがさらにあります(私はいつもそうしています)。

もちろん、ばかげていますが、SSMSGUIを使用してこれのほとんどを実行できることに気づきました。しかし、これらすべてを理解し、それを本当に上手に使い始めたいのであれば、スクリプトを書くことをお勧めします。私は開発者ですが、「公式の」DBAの助けを求めることなく、データベースを細かく分割して復元できます。

于 2012-12-09T09:01:10.027 に答える