首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >还原完整备份SQLSERVER 2019后如何还原多个事务日志备份

还原完整备份SQLSERVER 2019后如何还原多个事务日志备份
EN

Database Administration用户
提问于 2022-08-05 15:59:49
回答 4查看 494关注 0票数 3

我正在创建我的博士战略,我的全面备份恢复良好。

完全备份是使用Ola Hallengren脚本的修改版本进行的。

完整备份的文件时间戳显示07/26/2022 2:17上午

我每5分钟就会记录一次事务日志,所以我想恢复其中的一条链。这些事务日志备份是通过Server中的代理作业创建的。我有前一天和整个星期的交易日志。

理想情况下,我希望能够用脚本来完成恢复工作。

事务日志是使用维护作业获取的。我的问题是如何控制事务日志文件的名称,以及如何创建脚本来进行还原?

另外,我如何知道哪个事务日志与最后一个完整备份( LSN )相关,而不是中断日志链?

EN

回答 4

Database Administration用户

回答已采纳

发布于 2022-08-05 17:27:55

有几种恢复数据库备份的方法;msdb数据库包含所需的所有详细信息。

尽管如此,由于您使用的是Ola Hallengren的维护解决方案,您可能会使用其他脚本中的一个脚本,这些脚本都是围绕该系统使用的文件夹结构构建的。

例如,平面网有一个自动恢复过程。

本质上,该页面展示了如何使用xp_cmdshell获取备份文件夹中所有备份的列表,对备份进行排序,查找最新的完全备份,还原备份,然后恢复所有日志备份。实际的还原脚本本身是从MSSQLTips获取的。MSSQLTips脚本是:

代码语言:javascript
运行
复制
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。

票数 3
EN

Database Administration用户

发布于 2022-08-08 13:33:45

如果PowerShell是脚本的一个选项,巴多醇恢复数据库 cmdlet可能是您的朋友。

将完整备份链还原到最新的事务日志可以非常简单,如下所示:

代码语言:javascript
运行
复制
Restore-DbaDatabase -SqlInstance sqlinstanceWhereToRestore -Path \\path\to\database\backups -DatabaseName  restoredDB

有大量的参数可用于控制还原。它很好地使用了Ola的BackupDatabase过程所做的备份。

票数 3
EN

Database Administration用户

发布于 2022-08-07 14:10:59

作为对@HannahVernon提供的脚本的改进,可以在不使用动态SQL的情况下做到这一点。

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/315280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档