Sql-Server

您能否僅使用事務日誌更新數據庫,而無需進行完全恢復?

  • February 23, 2021

初始說明我不是 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模式。

在 Standby 和 Read_only 模式下恢復的數據庫 AdminDB2 數據庫的螢幕截圖

***免責聲明:*實際還原和螢幕截圖是今天拍攝的。在此過程中沒有生產數據受到損害。

回答你的問題

我想執行一個每小時載入最新日誌文件的程序,然後每週執行一次完整還原(當我們收到最新的 bak 文件時)。反正有這樣做嗎?說只恢復最新的日誌文件或執行部分恢復,這樣我們就不必每次都恢復所有文件?

只要您繼續按小時接收 TLOG 備份,您就應該能夠繼續將最新的 TLOG 備份恢復到STANDBY數據庫中,無限(沒有結束或限制)。

您只需在 TLOG 鏈中斷後應用 FULL 恢復。

可能的問題

如果恢復到 STANDBY 失敗,由於您收到的錯誤消息:

無法使用 WITH STANDBY 恢復此備份,因為需要升級數據庫'

..然後您可以使用以下命令從備份文件中檢索數據庫的版本:

RESTORE HEADERONLY 
FROM   DISK = N'C:\SQL\Backup\AdminDB2\FULL\AdminDB2_FULL_20210220_223019.bak' 

這將產生一個帶有列的輸出SoftwareVersionMajorSoftwareVersionMinorSoftwareVersionBuild.

(使用我的範例備份文件)

SoftwareVersionMajor  SoftwareVersionMinor    SoftwareVersionBuild
12                    0                       6433

然後您可以在 Microsoft 的頁面上查找資訊:

確定 SQL Server 及其組件的版本、版次和更新級別

…在我的情況下返回:

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 才能恢復備份文件。你的里程我的變化。

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