僅從完整備份將數據庫還原到時間點
我有一個恢復模式設置為 FULL 的數據庫。這是一個開發數據庫,我有兩個完整的備份,日期分別為 19 日和 27 日,即最新的。
一位開發人員在 26 日做了一些更改,我想回滾這些更改並希望將數據庫恢復到 25 日的狀態。
restore database MyDb from disk = 'I:\MSSQL\DATA\MyDb_20160127.bak' with recovery, stopat = '2016-01-25 10:38:15.280', move 'MyDb' to 'I:\MSSQL\DATA\MyDb.mdf', move 'MyDb_log' to 'I:\MSSQL\DATA\MyDb.ldf'
STOPAT 子句指定了一個太早的時間點,無法恢復此備份集。選擇不同的停止點或使用 RESTORE DATABASE WITH RECOVERY 在目前點恢復。
我正在使用 SQL Server 2005
不,您需要獲取涵蓋您要使用的時間範圍的事務日誌
STOPAT
。您不能僅從完整的數據庫備份中執行此操作 - 這只是一次性副本,這就是我們有不同類型的備份(完整、日誌、差異)的原因。如果您在完整備份之間進行了事務日誌備份,請使用該資訊更新問題,我們可以向您展示恢復到某個時間點的步驟。但是這些教程很容易找到,所以我懷疑你在這裡問是因為你沒有進行日誌備份。如果是這樣的話,你有點卡住了——你也許可以使用某種日誌閱讀工具從目前事務日誌中獲取該資訊,但我對那裡的成功沒有信心-而且至少該產品似乎沒有稱為“恢復到時間點”的功能-它允許您恢復特定資訊,例如恢復表或撤消截斷。所以我認為這將是一個相當手動的“撤消事務 A、撤消事務 B、撤消事務 C 等”來獲得最終結果。可能比嘗試從
fn_dblog
輸出中自己做的工作更少。這個文章比較及時:
這些也可能有用:
為了證明您現在不能進行日誌備份並嘗試恢復到上次完整備份*之前的某個時間點。*首先,執行這個腳本:
USE master; GO CREATE DATABASE splunk; GO ALTER DATABASE splunk SET RECOVERY FULL; GO USE splunk; GO SELECT GETDATE(); -- use this in STOPAT GO WAITFOR DELAY '00:00:10'; GO BACKUP DATABASE splunk TO DISK = 'c:\temp\sp_full.bak' WITH INIT; GO WAITFOR DELAY '00:00:10'; GO
以上模擬了您所擁有的:完整備份,在您想要恢復到的時間之後進行,僅此而已。
現在,進行尾日誌備份:
BACKUP LOG splunk TO DISK = 'c:\temp\sp_tail.trn' WITH INIT, NO_TRUNCATE; GO
現在,讓我們開始恢復過程。首先,使用 norecovery 恢復完整備份:
USE master; GO RESTORE DATABASE splunk FROM DISK = 'c:\temp\sp_full.bak' WITH REPLACE, NORECOVERY; GO
STOPAT
現在,嘗試將參數設置為上面輸出的任何內容來恢復尾日誌備份GETDATE()
:RESTORE LOG splunk FROM DISK = 'c:\temp\sp_tail.trn' WITH NORECOVERY, STOPAT = '<paste GETDATE() output from above>';
我收到以下錯誤消息:
消息 4335,級別 16,狀態 1
指定的 STOPAT 時間太早。全部或部分數據庫已經前滾超過該點。
消息 3013,級別 16,狀態 1
恢復日誌異常終止。
為了恢復到某個時間點,您需要在完整備份之後進行至少一個事務日誌備份(不一定是在最後一次完整備份之後,而是在一個有效且可以恢復的備份之後),並且在該點之後您想要恢復到的時間(但在下一次完整數據庫備份之前)。
這就是為什麼我們通常每晚或每週進行一次完整備份,並且每 15 分鐘或每小時進行一次事務日誌備份(有時也會在其中進行差異/文件組備份,具體取決於業務需求、RTO/RPO 等)。在完全恢復模式中,您肯定不會希望每週進行一次完全備份,而在這之間沒有任何案例。這可能是一個非常昂貴的教訓,很難學習,但我敢打賭它不會發生在你身上兩次。
這篇文章可能有很多關於備份的有用點,我們為什麼要使用它們,日誌備份的有用性等 - 我強烈建議您將其加入書籤並在解決目前問題後徹底閱讀。
如果您處於完全恢復模式,那麼您必須在某個地方有一些日誌備份,我建議您使用 Paul Brewer 的“RestoreScriptGenie”之類的酷腳本來執行此操作,它位於: http://www.sqlservercentral。 com/articles/Restore/95839/
它將生成一個腳本以恢復到一個時間點,具有不同的數據庫名稱等。
我也找到了和你有類似問題的人。他找到了一個不太完美的解決方案,但也許對您的情況有所幫助: