![自动删除备份和事务日志会留下损坏的备份点](https://linux22.com/image/718753/%E8%87%AA%E5%8A%A8%E5%88%A0%E9%99%A4%E5%A4%87%E4%BB%BD%E5%92%8C%E4%BA%8B%E5%8A%A1%E6%97%A5%E5%BF%97%E4%BC%9A%E7%95%99%E4%B8%8B%E6%8D%9F%E5%9D%8F%E7%9A%84%E5%A4%87%E4%BB%BD%E7%82%B9.png)
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 备份的任务,所以请把我当成这个主题的门外汉。
我决定每天创建完整的数据库备份(当然复制到外部存储),将其中几个备份保留在服务器上以方便使用,删除旧备份,然后用事务日志填补漏洞,以便在几天内进行当日恢复。在谷歌上搜索了一下之后,我在测试数据库上做了以下事情:
创建手动完整备份,因为这是日志传送所必需的 - 这里不会出现任何故障
设置维护计划以在午夜创建和删除测试数据库的旧完整备份 - 这里也没有问题
尝试从备份中恢复,但因缺少交易文件而导致问题。打开 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
截至目前,备份点总数为 29682 个。
我希望“恢复”窗口再次响应,我有两个测试数据库可以自由测试。我可以安全地清除备份列表吗?如何让它自动执行,以便与我当前的计划工作配合良好?
我在数据库和操作系统上都拥有完全的管理权限、完全的创作控制权以及在虚拟机上剩余的大量资源,因此对可能的解决方案几乎没有任何限制。
答案1
可以使用删除备份历史存储过程来清除旧历史记录。请注意,它不知道您删除了什么,但它将清除您指定的日期 X 之前的旧历史记录。
清除大量备份条目后,它应该会变得响应迅速。这可以很容易地包含在您的代理作业中,方法是使用当前日期减去 X 天数作为作业的最后一步来调用 SP。