刚删除一个数据库时,在清理数据库备份历史记录时,执行超过近10分钟还未完成,随时查了下,吓死宝宝啦,逻辑读操作竟然高达8000万次以上!

通过UI进行删除数据库时,会默认勾选上“删除数据库备份和还原历史记录信息”,作为多年的老司机,删除数据库应该写脚本进行删除,即使使用UI删除,也应该不勾选该选项,但一时偷懒,直接点执行,导致该操作消耗大量逻辑IO和CPU并持续10分钟还不能成功完成。

勾选上“删除数据库备份和还原历史记录信息”后,会执行下面语句:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'monitor'
GO

执行该存储过程后,会在msdb数据库中嵌套地删除备份相关的N张表,其中一条删除语句如下:

 DELETE msdb.dbo.backupmediafamily
FROM msdb.dbo.backupmediafamily bmf
WHERE bmf.media_set_id IN ( SELECT media_set_id
FROM @media_set_id )
AND ( ( SELECT COUNT(*)
FROM msdb.dbo.backupset
WHERE media_set_id = bmf.media_set_id
) = 0 )

当备份和还原历史记录信息较多的时候,删除操作消耗的资源会成几何数增长,由于该服务器用作日志传送服务器,承载很多个数据库的日志传送,因此相关备份表中存有大量数据,导致删除操作长时间不能完成。

解决办法:

定期执行下面脚本来清理备份还原数据:

--设置历史记录保存期限为1天
DECLARE @keepMinutes BIGINT
SET @keepMinutes= 60*24 DECLARE @expiredDT NVARCHAR(100)
SELECT @expiredDT = dbo.ufn_FormatDate(DATEADD(MINUTE, 0 - @keepMinutes,
GETDATE()),
'yyyy-MM-ddTHH:mm:ss') EXEC msdb.dbo.sp_delete_backuphistory @expiredDT EXEC msdb.dbo.sp_purge_jobhistory @oldest_date = @expiredDT EXEC msdb.dbo.sp_maintplan_delete_log NULL, NULL, @expiredDT

上面脚本中使用到一个日期格式转换函数,代码为:

/****** Object:  UserDefinedFunction [dbo].[ufn_FormatDate]    Script Date: 2015/11/24 19:40:45 ******/
DROP FUNCTION [dbo].[ufn_FormatDate]
GO /****** Object: UserDefinedFunction [dbo].[ufn_FormatDate] Script Date: 2015/11/24 19:40:45 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO --====================================
--将时间转换成制定格式的字符串
CREATE FUNCTION [dbo].[ufn_FormatDate]
(
@Datetime DATETIME ,
@FormatMask VARCHAR(32)
)
RETURNS VARCHAR(32)
AS
BEGIN DECLARE @StringDate VARCHAR(32) SET @StringDate = @FormatMask IF ( CHARINDEX('YYYY', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'YYYY',
DATENAME(YY, @Datetime)) IF ( CHARINDEX('YY', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'YY',
RIGHT(DATENAME(YY, @Datetime), 2))
IF ( CHARINDEX('MM', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'MM',
RIGHT('' + CONVERT(VARCHAR, DATEPART(MM,
@Datetime)), 2)) IF ( CHARINDEX('DD', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'DD',
RIGHT('' + DATENAME(DD, @Datetime), 2)) IF ( CHARINDEX('HH', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'HH',
RIGHT('' + DATENAME(HH, @Datetime), 2)) IF ( CHARINDEX('mm', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'mm',
RIGHT('' + DATENAME(mm, @Datetime), 2)) IF ( CHARINDEX('ss', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'ss',
RIGHT('' + DATENAME(ss, @Datetime), 2)) IF ( CHARINDEX('ms', @StringDate) > 0 )
SET @StringDate = REPLACE(@StringDate, 'ms',
RIGHT('' + DATENAME(ms, @Datetime), 2)) RETURN @StringDate END
--==================================== GO

没多少技术含量,厚脸拿出来供初学者学习下!

============================================

SQLSERVER--定期清理维护作业的历史记录的更多相关文章

  1. SQLServer:定时作业

    SQLServer:定时作业: 如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代理-作业来实现 也快可以定时备 ...

  2. SqlServer中代理作业实现总结

    今天弄SqlServer代理作业,弄了半天,把遇到的问题总结出来,主要是抨击一下Sql Server的Express版本.好了,看下面的正题. 首先,需要安装Sql Server Agent服务,该服 ...

  3. sqlserver索引维护(重新组织生成索引)

    sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = par ...

  4. sqlserver 作业调度(作业常用的几个步骤)

    --[作业常用的几个步骤] EXEC msdb.dbo.sp_delete_job EXEC msdb.dbo.sp_add_job EXEC msdb.dbo.sp_add_jobstep EXEC ...

  5. sqlserver日常维护脚本

    SQL code --备份declare @sql varchar(8000) set @sql='backup database mis to disk=''d:\databack\mis\mis' ...

  6. SqlServer数据维护

    现有两个表:Code和CodeCategory Code表: CodeCategory表: 现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与Pla ...

  7. 安装完成Dynamics 365 CE后别忘了更改维护作业的运行时间

    摘要: 微软动态CRM专家罗勇 ,回复309或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装完毕Dy ...

  8. sqlserver获取代理服务作业job的执行情况

    以下脚本为获取sqlserver的执行job with testtemp as( SELECT sch.job_id,--his.[server] as InstanceName CONVERT(nv ...

  9. SqlServer自动备份作业

    /*********完整备份作业*********/ –完整备份,每周一次 USE Master GO declare @str varchar(100) set @str='D:\DBtext\jg ...

随机推荐

  1. asp.net web api 测试帮助页面建立并测试

    asp.net web api 测试帮助页面建立并测试 现在使用WEB API来开发,越来越流行. 在开发过程中的测试调试,可以使用Fiddler等工具来帮助测试外,还有: 在asp.net 中有种方 ...

  2. 转Web安全测试之XSS

    转http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html XSS 全称(Cross Site Scripting) 跨站脚本攻击 ...

  3. 获取Spring容器中的Bean

    摘要 SpringMVC框架开发中可能会在Filter或Servlet中用到spring容器中注册的java bean 对象,获得容器中的java bean对象有如下方法 Spring中的Applic ...

  4. flex 导出Excel功能实现

    方法一: 1.Excel导出主要代码: try   {    var bytes: ByteArray = new ByteArray();    bytes.writeMultiByte(DataG ...

  5. How to Shorten the Paper

    . Remember: you are writing for an expert. Cross out all that is trivial or routine. . Avoid repetit ...

  6. C#拼接地图瓦片

    为了在AE程序中使用离线的电子地图,思路如下: 利用下载工具下载地图切片,然后利用C#进行切片拼接成一张图片,最后使用ArcMap进行地理配准,然后发布成ArcGIS Server 切片服务供程序使用 ...

  7. mongodb:短网址项目

    短网址项目概述 1.短网址项目,是将给定的长网址,转换成短网址. 如 新浪 http://t.cn/zQd5NPw ,其中zQd5NPw就是短网址 前段页面如下

  8. AngularJS学习--- 事件处理(Event Handlers) ng-click操作 step 10

    本文主要通过介绍ng-click方法来对angularjs中的事件处理方法做个了解. 1.切换目录 git checkout step- npm start 2.效果 点击右边的小图片,那么左边框中将 ...

  9. 程序员遇到Bug时的25个反应

    开发应用程序是一个非常有压力的工作.没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象.面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会灰心丧气,而另一些程序员会依然保持冷静沉 ...

  10. memalign vs malloc - 使用O_DIRECT参数open一个文件并读写

    听说使用odirect参数打开文件时能够以扇区的单位进行读写. 于是open了一个块设备文件/dev/sdo,当然还要带上读写参数O_RDWR 然后进行读写时出错了. 找了一会发现问题根本在于读写的b ...