Backup

如何自動將數據庫還原到另一台伺服器?

  • November 7, 2019

計劃是擁有 1 個備份集,其中包含完整的事務日誌備份。(伺服器 1)

已經有一個計劃的作業將在 30 分鐘後將任何事務日誌附加到文件中。(伺服器 1)

Server1 和 Server2 之間有一個共享的網路驅動器。但問題是通過 T-SQL 將其自動化。這是腳本:

RESTORE LOG [db_test_rep] FROM  DISK = N'Z:\db_rep.bak' WITH  FILE = 19,  NORECOVERY,  NOUNLOAD,  STATS = 5

這樣做的問題是,每次執行計劃的作業時,它都會更新備份文件編號 + 1。因此,在這種情況下,在下一次事務日誌備份中,當我使用 SSMS 執行恢復腳本時,它將生成FILE = 20

你們能給我一個簡單的解決方法嗎?

也許是這樣的:

使用 RESTORE FILELISTONLY 獲取最新的 FILE 編號:

USE master
GO

IF OBJECT_ID('tempdb..#BackupMetadata') IS NOT NULL DROP TABLE #BackupMetadata

CREATE TABLE #BackupMetadata
(LogicalName NVARCHAR(500)
,PhysicalName NVARCHAR(500)
,Type NVARCHAR(500)
,FileGroupName NVARCHAR(500)
,Size NVARCHAR(500)
,MaxSize NVARCHAR(500)
,FileId NVARCHAR(500)
,CreateLSN NVARCHAR(500)
,DropLSN NVARCHAR(500)
,UniqueId NVARCHAR(500)
,ReadOnlyLSN NVARCHAR(500)
,ReadWriteLSN NVARCHAR(500)
,BackupSizeInBytes NVARCHAR(500)
,SourceBlockSize NVARCHAR(500)
,FileGroupID NVARCHAR(500)
,LogGroupGUID NVARCHAR(500)
,DifferentialBaseLSN NVARCHAR(500)
,DifferentialBaseGUID NVARCHAR(500)
,IsReadOnly NVARCHAR(500)
,IsPresent NVARCHAR(500)
,TDEThumbprint NVARCHAR(500)
)
INSERT INTO #BackupMetadata
EXEC('RESTORE FILELISTONLY FROM DISK = N''Z:\db_rep.bak''')

DECLARE @ID INT
SELECT @ID =  Max(FileId) FROM #BackupMetadata  WHERE Type = 'L'

然後使用動態 SQL 進行還原:

DECLARE @CMD NVARCHAR(500)
SET @CMD = 'RESTORE LOG [db_test_rep] FROM  DISK = N''Z:\db_rep.bak'' WITH  FILE = ' + @ID + ',  NORECOVERY,  NOUNLOAD,  STATS = 5'
EXEC (@CMD)

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