web-dev-qa-db-ja.com

LDFファイルからデータを回復するにはどうすればよいですか?

SQL 2005 Express Editionを使用しています。一部の削除されたレコードを復元するために、LDFファイルからデータを読み取ります。

ApexSQLの試用版を使用してみました。サードパーティのソフトウェアを使用する代わりに、ログファイルを自分で読み取る方法を見つけようとしています。

LDFファイルからデータを読み取って回復するにはどうすればよいですか?

9
goofyui

以前の完全バックアップと、最後の完全バックアップ以降に取得されたログバックアップが必要です。

1)ログバックアップの末尾を取得する

BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE

2)削除されたレコードのトランザクションを検索します(DELETEの場合はLOP_DELETE_ROWS、TRUNCATE TABLEの場合はLOP_SET_BITS&LOP_MODIFY_ROWになります)

SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'

3)以前のフルバックとログバックアップに加えて、NORECOVERYとSTOPAT = 'トランザクションの開始時間の直前'の新しいデータベースへの末尾を復元します。

RESTORE DATABASE NewDB
FROM DISK='C:\Previous_Full_Backup_Of_OldDB.bak'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM',
MOVE 'OldDB' TO 'C:\DATABASES\NewDB.mdf',
MOVE 'OldDB_Log' TO 'C:\DATABASES\NewDB.ldf'

RESTORE LOG NewDB
FROM DISK='C:\Previous_TranLog_Backup_Of_OldDB.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'

RESTORE LOG NewDB
FROM DISK='C:\OldDB_Tail.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'

-- This recovers the restored database and allows access
RESTORE DATABASE NewDB WITH RECOVERY

この ブログ の投稿では、fn_dblogを使用してSTOPATする時間を見つける方法について詳しく説明しています。この ブログ の投稿では、ログから直接データを回復することに成功していますが、特定の時点の回復と比較すると、非常に時間がかかる可能性があります。

また、この ブログ Robert L Davisによる投稿には、STOPとSTANDBYを組み合わせて、さまざまな時点でのデータベースの状態を照会できるようにする例があります。

11
MartinC