Sql-Server

如何從 LDF 文件中恢復數據?

  • January 24, 2012

我們使用的是 SQL 2005 Express Edition。我們想從 LDF 文件中讀取數據以恢復一些已刪除的記錄。

我們嘗試使用 ApexSQL 的試用版,它對我們有很大幫助。我們沒有使用第三方軟體,而是試圖弄清楚如何自己讀取日誌文件。

我們如何從 LDF 文件中讀取和恢復數據?

您將需要以前的完整備份以及自上次完整備份以來進行的任何日誌備份

1)取日誌備份的尾部

BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE
  1. 查找已刪除記錄的事務(操作將是 LOP_DELETE_ROWS 用於 DELETE 和 LOP_SET_BITS & LOP_MODIFY_ROW 用於 TRUNCATE TABLE)
SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'
  1. 將以前的完整備份和日誌備份以及尾部還原到新數據庫 WITH NORECOVERY 和 STOPAT=‘Just Before Begin Time for Transaction’
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 的範例,以允許您查詢不同時間點的數據庫狀態。

引用自:https://dba.stackexchange.com/questions/10582