SQLSERVER--定期清理维护作业的历史记录
刚删除一个数据库时,在清理数据库备份历史记录时,执行超过近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--定期清理维护作业的历史记录的更多相关文章
- SQLServer:定时作业
SQLServer:定时作业: 如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代理-作业来实现 也快可以定时备 ...
- SqlServer中代理作业实现总结
今天弄SqlServer代理作业,弄了半天,把遇到的问题总结出来,主要是抨击一下Sql Server的Express版本.好了,看下面的正题. 首先,需要安装Sql Server Agent服务,该服 ...
- sqlserver索引维护(重新组织生成索引)
sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = par ...
- sqlserver 作业调度(作业常用的几个步骤)
--[作业常用的几个步骤] EXEC msdb.dbo.sp_delete_job EXEC msdb.dbo.sp_add_job EXEC msdb.dbo.sp_add_jobstep EXEC ...
- sqlserver日常维护脚本
SQL code --备份declare @sql varchar(8000) set @sql='backup database mis to disk=''d:\databack\mis\mis' ...
- SqlServer数据维护
现有两个表:Code和CodeCategory Code表: CodeCategory表: 现要把Code表中的数据如实维护一份数据,但是要设PlantID字段值为2,而ID要按规则自增并且要与Pla ...
- 安装完成Dynamics 365 CE后别忘了更改维护作业的运行时间
摘要: 微软动态CRM专家罗勇 ,回复309或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装完毕Dy ...
- sqlserver获取代理服务作业job的执行情况
以下脚本为获取sqlserver的执行job with testtemp as( SELECT sch.job_id,--his.[server] as InstanceName CONVERT(nv ...
- SqlServer自动备份作业
/*********完整备份作业*********/ –完整备份,每周一次 USE Master GO declare @str varchar(100) set @str='D:\DBtext\jg ...
随机推荐
- 详解log4j2(上) - 从基础到实战
log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等.如果已经掌握 ...
- NOI 2001 食物链(eat)
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description ...
- 在eclipse中运行perl代码,需要配置的插件以及方法
Eclipse配置正则表达式 网址:http://www.cnblogs.com/itech/archive/2010/02/23/1671676.html perl的环境配置以及在Eclipse中安 ...
- setTimeout注意事项
<script type="text/javascript"> function show(v){ alert(v); } func ...
- JQuery Checkbox的change事件
JQuery Checkbox的change事件 参考 http://blog.csdn.net/hbhgjiangkun/article/details/8126981 $(functio ...
- c++实战吐槽(我还是太年轻了)
习惯了用java, 现在切换到c++遇到了一些很滑稽的问题, 特此记录. 一. 使用了野指针 都知道不能使用野指针, 指针定义后,要初始化为null, 我在项目里面默认构造函数里面确实初始化为null ...
- 团队博客作业Week1
Study the projects done by previous student groups - View their blog site, use their software, email ...
- android system.img
哥们要我做些模拟包,给过来的是mtk的底包,需要从system.img中提取部分文件. 网上一找资料,说是yaffs2文件系统,同时以前做linux的时候也是用yaffs2,感觉碰到老朋友了,不管三七 ...
- 【转】jquery validate验证框架与kindeditor使用需二次提交的问题
原文:http://blog.csdn.net/wlsyn/article/details/11536399在使用jquery的验证框架对kindeditor富文本编辑器进行验证的过程中,发现提 交时 ...
- git -- 出现冲突的情况
以下三点可能会出现冲突: 1 修改了同一个文件的同一行: 2 文件被重命名为不同的名字: 3 在一个分支上文件被删除,在另一个分支上文件被修改.