您能否僅使用事務日誌更新數據庫,而無需進行完全恢復?
初始說明我不是 DBA,我正在工作中學習。
在我工作的地方,我們有一個過時的第三方系統,每周向我們發送一次 .bak 文件,每小時發送一次日誌文件。為了在數據庫中獲取前一天的數據,我們有一個執行 python 腳本的程序,該腳本建構 SQL 以進行完全恢復。每晚恢復大約需要 2 小時。我們的最終使用者要求我們盡可能“實時”獲取數據,這在理論上是可行的,因為我們每小時都會收到日誌文件。但是,我還沒有找到僅恢復日誌文件的方法,因為似乎必須先完成完全恢復才能恢復事務日誌文件。
我想執行一個每小時載入最新日誌文件的程序,然後每週執行一次完整還原(當我們收到最新的 bak 文件時)。反正有這樣做嗎?說只恢復最新的日誌文件或執行部分恢復,這樣我們就不必每次都恢復所有文件?
我想執行一個每小時載入最新日誌文件的程序,然後每週執行一次完整還原(當我們收到最新的 bak 文件時)。反正有這樣做嗎?
假設您執行相同版本的 SQL Server,是的。您正在尋找的內容稱為RESTORE WITH STANDBY:
RESTORE WITH STANDBY 使數據庫處於備用狀態,在這種狀態下,數據庫可用於有限的只讀訪問。此選項等效於在 RESTORE 語句中指定 WITH STANDBY。
選擇此選項要求您在備用文件文本框中指定備用文件。備用文件允許撤銷恢復效果。
每次應用另一個日誌備份時,使用者都需要短暫斷開連接。這就是日誌傳送的工作方式,只要他們向您發送所有事務日誌備份,您就不需要恢復每週的完整備份。只需應用鏈中的下一個日誌備份。
正如 David Browne - Microsoft 已經發布的那樣,我想擴展我在答案中使用的概念。
如果您有數據庫,則可以使用該
WITH STANDBY...
功能並將數據庫還原到某個時間點(您的最後一次 TLOG 備份),然後使數據庫處於Standby / Read-Only
模式。您必須執行的步驟是:
USE [master] RESTORE DATABASE [AdminDB2] FROM DISK = N'C:\SQL\Backup\AdminDB2\FULL\AdminDB2_FULL_20210220_223019.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5, REPLACE RESTORE DATABASE [AdminDB2] FROM DISK = N'C:\SQL\Backup\AdminDB2\DIFF\AdminDB2_DIFF_20210222_223007.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\Backup\AdminDB2\LOG\AdminDB2_LOG_20210222_231512.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\Backup\AdminDB2\LOG\AdminDB2_LOG_20210223_001513.trn' WITH FILE = 1, STANDBY = N'C:\SQL\BACKUP\AdminDB2_RollbackUndo_2021-02-23_15-22-54.bak', NOUNLOAD, STATS = 5
通過最後一次事務日誌恢復,您告訴數據庫保持在待機模式 (
STANDBY = N'C:\SQL\BACKUP\AdminDB2_RollbackUndo_2021-02-23_15-22-54.bak'
),這允許您將額外的 TLOG 備份應用到數據庫。對 TLOG 備份的附加還原就像為下一次 TLOG 還原執行以下命令一樣簡單:
RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\Backup\AdminDB2\LOG\AdminDB2_LOG_20210223_011512.trn' WITH FILE = 1, STANDBY = N'C:\SQL\BACKUP\AdminDB2_RollbackUndo_2021-02-23_15-22-54.bak', NOUNLOAD, STATS = 5
從 TLOG 備份文件上的時間戳可以看出,我不斷將最新的每小時 TLOG 備份應用到
Standby / Read-only
數據庫AdminDB2。... AdminDB2_LOG_20210223_001513.trn AdminDB2_LOG_20210223_011512.trn ...
參考: RESTORE 語句 (Transact-SQL) (Microsoft | SQL Docs)
恢復數據庫後,數據庫的元素保持可訪問性,只是處於
Read-only
模式。***免責聲明:*實際還原和螢幕截圖是今天拍攝的。在此過程中沒有生產數據受到損害。
回答你的問題
我想執行一個每小時載入最新日誌文件的程序,然後每週執行一次完整還原(當我們收到最新的 bak 文件時)。反正有這樣做嗎?說只恢復最新的日誌文件或執行部分恢復,這樣我們就不必每次都恢復所有文件?
只要您繼續按小時接收 TLOG 備份,您就應該能夠繼續將最新的 TLOG 備份恢復到
STANDBY
數據庫中,無限(沒有結束或限制)。您只需在 TLOG 鏈中斷後應用 FULL 恢復。
可能的問題
如果恢復到 STANDBY 失敗,由於您收到的錯誤消息:
無法使用 WITH STANDBY 恢復此備份,因為需要升級數據庫'
..然後您可以使用以下命令從備份文件中檢索數據庫的版本:
RESTORE HEADERONLY FROM DISK = N'C:\SQL\Backup\AdminDB2\FULL\AdminDB2_FULL_20210220_223019.bak'
這將產生一個帶有列的輸出
SoftwareVersionMajor
,SoftwareVersionMinor
而SoftwareVersionBuild
.(使用我的範例備份文件)
SoftwareVersionMajor SoftwareVersionMinor SoftwareVersionBuild 12 0 6433
然後您可以在 Microsoft 的頁面上查找資訊:
…在我的情況下返回:
SQL Server 2014
CU4 + GDR for SP3(12 . 0 . 6433 .1 - 2021 年 1 月)
Version Major : 12 Version Minor : 0 Version Build : 6433
所以我必須安裝帶有 Service Pack 3 的 SQL Server 2014 和帶有 GDR 的 CU3 才能恢復備份文件。你的里程我的變化。