Sql-Server

僅從完整備份將數據庫還原到時間點

  • March 27, 2019

我有一個恢復模式設置為 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/

它將生成一個腳本以恢復到一個時間點,具有不同的數據庫名稱等。

我也找到了和你有類似問題的人。他找到了一個不太完美的解決方案,但也許對您的情況有所幫助:

我可以在沒有備份的情況下將數據庫恢復到某個時間點嗎?

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