我正在创建我的博士战略,我的全面备份恢复良好。
完全备份是使用Ola Hallengren脚本的修改版本进行的。
完整备份的文件时间戳显示07/26/2022 2:17上午
我每5分钟就会记录一次事务日志,所以我想恢复其中的一条链。这些事务日志备份是通过Server中的代理作业创建的。我有前一天和整个星期的交易日志。
理想情况下,我希望能够用脚本来完成恢复工作。
事务日志是使用维护作业获取的。我的问题是如何控制事务日志文件的名称,以及如何创建脚本来进行还原?
另外,我如何知道哪个事务日志与最后一个完整备份( LSN )相关,而不是中断日志链?
发布于 2022-08-05 17:27:55
有几种恢复数据库备份的方法;msdb
数据库包含所需的所有详细信息。
尽管如此,由于您使用的是Ola Hallengren的维护解决方案,您可能会使用其他脚本中的一个脚本,这些脚本都是围绕该系统使用的文件夹结构构建的。
例如,平面网有一个自动恢复过程。
本质上,该页面展示了如何使用xp_cmdshell
获取备份文件夹中所有备份的列表,对备份进行排序,查找最新的完全备份,还原备份,然后恢复所有日志备份。实际的还原脚本本身是从MSSQLTips获取的。MSSQLTips脚本是:
USE Master;
GO
SET NOCOUNT ON
-- 1 - Variable declaration
DECLARE @dbName sysname
DECLARE @backupPath NVARCHAR(500)
DECLARE @cmd NVARCHAR(500)
DECLARE @fileList TABLE (backupFile NVARCHAR(255))
DECLARE @lastFullBackup NVARCHAR(500)
DECLARE @lastDiffBackup NVARCHAR(500)
DECLARE @backupFile NVARCHAR(500)
-- 2 - Initialize variables
SET @dbName = 'Customer'
SET @backupPath = 'D:\SQLBackups\'
-- 3 - get list of files
SET @cmd = 'DIR /b "' + @backupPath + '"'
INSERT INTO @fileList(backupFile)
EXEC master.sys.xp_cmdshell @cmd
-- 4 - Find latest full backup
SELECT @lastFullBackup = MAX(backupFile)
FROM @fileList
WHERE backupFile LIKE '%.BAK'
AND backupFile LIKE @dbName + '%'
SET @cmd = 'RESTORE DATABASE ' + QUOTENAME(@dbName) + ' FROM DISK = '''
+ @backupPath + @lastFullBackup + ''' WITH NORECOVERY, REPLACE'
PRINT @cmd
-- 4 - Find latest diff backup
SELECT @lastDiffBackup = MAX(backupFile)
FROM @fileList
WHERE backupFile LIKE '%.DIF'
AND backupFile LIKE @dbName + '%'
AND backupFile > @lastFullBackup
-- check to make sure there is a diff backup
IF @lastDiffBackup IS NOT NULL
BEGIN
SET @cmd = 'RESTORE DATABASE ' + QUOTENAME(@dbName) + ' FROM DISK = '''
+ @backupPath + @lastDiffBackup + ''' WITH NORECOVERY'
PRINT @cmd
SET @lastFullBackup = @lastDiffBackup
END
-- 5 - check for log backups
DECLARE backupFiles CURSOR FOR
SELECT backupFile
FROM @fileList
WHERE backupFile LIKE '%.TRN'
AND backupFile LIKE @dbName + '%'
AND backupFile > @lastFullBackup
OPEN backupFiles
-- Loop through all the files for the database
FETCH NEXT FROM backupFiles INTO @backupFile
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'RESTORE LOG ' + QUOTENAME(@dbName) + ' FROM DISK = '''
+ @backupPath + @backupFile + ''' WITH NORECOVERY'
PRINT @cmd
FETCH NEXT FROM backupFiles INTO @backupFile
END
CLOSE backupFiles
DEALLOCATE backupFiles
-- 6 - put database in a useable state
SET @cmd = 'RESTORE DATABASE [' + @dbName + '] WITH RECOVERY'
PRINT @cmd
如果要使用该路径,则需要引用的msdb
表包括:
最后,dbo.backupset
包含以下列,这些列可用于确保您正在以正确的LSN顺序还原文件。
first_lsn
包含备份集所涵盖的最早的LSN。last_lsn
自然包含备份集涵盖的最新LSN。而且,嘿-presto,database_backup_lsn
包含最近的完全备份的LSN。
发布于 2022-08-08 13:33:45
发布于 2022-08-07 14:10:59
作为对@HannahVernon提供的脚本的改进,可以在不使用动态SQL的情况下做到这一点。
SET NOCOUNT ON;
-- 1 - Initialize user variables
DECLARE @dbName sysname = 'Customer';
DECLARE @backupPath NVARCHAR(500) = 'D:\SQLBackups\';
DECLARE @onlyListFiles bit = 0;
-- 2 - Other variable declaration
DECLARE @lastBackupDate datetime;
DECLARE @lastFullBackup NVARCHAR(500);
DECLARE @lastDiffBackup NVARCHAR(500);
DECLARE @logBackups TABLE (backupFile NVARCHAR(255), creation_time datetime);
DECLARE @crsr CURSOR;
DECLARE @backupFile NVARCHAR(500);
-- 3 - get latest full backup
SELECT TOP (1)
@lastFullBackup = f.full_filesystem_path,
@lastBackupDate = f.creation_time
FROM sys.dm_os_enumerate_filesystem(@backupPath, @dbName + '*.bak') f
ORDER BY
f.creation_time DESC;
IF @lastFullBackup IS NULL
THROW 50001, 'Cannot find last full backup', 1;
-- 4 - get latest diff after the full backup
SELECT TOP (1)
@lastDiffBackup = f.full_filesystem_path,
@lastBackupDate = f.creation_time
FROM sys.dm_os_enumerate_filesystem(@backupPath, @dbName + '*.dif') f
WHERE f.creation_time > @lastBackupDate
ORDER BY
f.creation_time DESC;
-- 5 - get list of log backups
INSERT INTO @logBackups(backupFile, creation_time)
SELECT
f.full_filesystem_path,
f.creation_time
FROM sys.dm_os_enumerate_filesystem(@backupPath, @dbName + '*.trn') f
WHERE f.creation_time > @lastBackupDate;
IF @onlyListFiles = 1
BEGIN
SELECT backupFile
FROM @logBackups
UNION ALL
SELECT @lastDiffBackup
WHERE @lastDiffBackup IS NOT NULL
UNION ALL
SELECT @lastFullBackup;
RETURN;
END;
-- 6 - restore full
RESTORE DATABASE @dbName
FROM DISK = @lastFullBackup
WITH NORECOVERY, REPLACE;
-- 7 - check to make sure there is a diff backup
IF @lastDiffBackup IS NOT NULL
BEGIN
RESTORE DATABASE @dbName
FROM DISK = @lastDiffBackup
WITH NORECOVERY;
END;
-- 8 - check for log backups
SET @crsr = CURSOR FAST_FORWARD FOR
SELECT f.backupFile
FROM @fileList f
ORDER BY
f.creation_time;
OPEN @crsr;
-- Loop through all the files for the database
FETCH NEXT FROM @crsr INTO @backupFile;
WHILE @@FETCH_STATUS = 0
BEGIN
RESTORE LOG @dbName
FROM DISK = @backupFile
WITH NORECOVERY;
FETCH NEXT FROM @crsr INTO @backupFile;
END;
CLOSE @crsr;
-- 9 - put database in a useable state
RESTORE DATABASE @dbName WITH RECOVERY;
https://dba.stackexchange.com/questions/315280
复制相似问题