自动删除备份和事务日志会留下损坏的备份点

自动删除备份和事务日志会留下损坏的备份点

TLDR:默认日志传送作业和维护计划正在从磁盘中删除旧文件,但备份仍显示在 SSMS 中,导致显示“恢复”窗口非常慢。如何正确删除旧的 .trn/.bak?


(Azure 虚拟机、Windows Server 2016 Datacenter(10.0)、Microsoft SQL Server Web(2017 兼容级别)、SMMS 17.3)

(显示日期采用 YYYY-MM-DD 或 DD-MM-YYYY 格式,24 小时制)

管理数据库不在我的技能范围内,也不在我的工作描述范围内,但我却被委以准备 MS Sql Server 备份的任务,所以请把我当成这个主题的门外汉。

我决定每天创建完整的数据库备份(当然复制到外部存储),将其中几个备份保留在服务器上以方便使用,删除旧备份,然后用事务日志填补漏洞,以便在几天内进行当日恢复。在谷歌上搜索了一下之后,我在测试数据库上做了以下事情:

  1. 创建手动完整备份,因为这是日志传送所必需的 - 这里不会出现任何故障

  2. 生成默认事务日志传送计划任务,删除旧文件。运行良好,每分钟发送垃圾邮件 .trn 并从磁盘中删除旧文件 日志传送作业

  3. 设置维护计划以在午夜创建和删除测试数据库的旧完整备份 - 这里也没有问题

维护计划

  1. 让它从星期五运行到星期一,.trn 和 .bak 都已正确创建和删除,因此我有两天的备份可以使用: 日志

  2. 尝试从备份中恢复,但因缺少交易文件而导致问题。打开 Tasks\Restore\Database 非常非常慢,SMMS 会在几分钟内耗费 100% 的磁盘空间,以获取约 10MB 的空数据库 .trn。对于没有自动完整备份的数据库,它会列出所有曾经创建的 .trn(首先是手动完整备份),显然会伴随“文件未找到”错误。对于每日完整备份的数据库,默认情况下,将有限结果集设置回上次完整备份并恢复可以正常工作,但仅显示备份列表仍然非常慢。浏览时间线也很慢(几分钟“无响应”)。

我找到了获取脚本历史记录的脚本https://www.mssqltips.com/sqlservertip/1601/script-to-retrieve-sql-server-database-backup-history-and-no-backups/(稍微修改一下以返回感兴趣的数据库的所有备份)

SELECT 
CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
msdb.dbo.backupset.database_name, 
msdb.dbo.backupset.backup_start_date, 
msdb.dbo.backupset.backup_finish_date, 
msdb.dbo.backupset.expiration_date, 
CASE msdb..backupset.type 
WHEN 'D' THEN 'Database' 
WHEN 'L' THEN 'Log' 
END AS backup_type, 
msdb.dbo.backupset.backup_size, 
msdb.dbo.backupmediafamily.logical_device_name, 
msdb.dbo.backupmediafamily.physical_device_name, 
msdb.dbo.backupset.name AS backupset_name, 
msdb.dbo.backupset.description 
FROM msdb.dbo.backupmediafamily 
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
WHERE 
--(CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7) 
--and
 [database_name] = 'test'
ORDER BY 
msdb.dbo.backupset.database_name, 
msdb.dbo.backupset.backup_finish_date 

其中包括已删除的 .trn 和 .bak 文件: 在此处输入图片描述

截至目前,备份点总数为 29682 个。

我希望“恢复”窗口再次响应,我有两个测试数据库可以自由测试。我可以安全地清除备份列表吗?如何让它自动执行,以便与我当前的计划工作配合良好?

我在数据库和操作系统上都拥有完全的管理权限、完全的创作控制权以及在虚拟机上剩余的大量资源,因此对可能的解决方案几乎没有任何限制。

答案1

可以使用删除备份历史存储过程来清除旧历史记录。请注意,它不知道您删除了什么,但它将清除您指定的日期 X 之前的旧历史记录。

清除大量备份条目后,它应该会变得响应迅速。这可以很容易地包含在您的代理作业中,方法是使用当前日期减去 X 天数作为作业的最后一步来调用 SP。

相关内容