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 ...
随机推荐
- TJI读书笔记10-复用类
TJI读书笔记10-复用类 组合语法 继承语法 代理 final关键字 final的数据 final的参数 final的方法 final的类 初始化和类的加载 乱七八糟不知道怎么归类的知识点 代码复用 ...
- [Tomcat 源码分析系列] (附件) : catalina.bat 脚本
摘自 apache-tomcat-8.0.39-src 源码包中的 catalina.bat 脚本内容 @echo off rem Licensed to the Apache Software Fo ...
- Icinga快速安装与配置
Icinga快速安装与配置/* body */body { margin: 20px; padding: 0; font-family: "Lucida Grande", &quo ...
- 修改win10打开文件资源管理器
- JavaScript实例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Android Studio 引入 Fresco
首选在build.gradle文件中配置 查看NDK路径 然后在gradle.properties文件中配置 ndk.path=C\:\\Users\\lixishuang\\AppData\\Loc ...
- Rsync+inotify实现实时同步
1.1 inotify介绍 inotify是一种强大的.细粒度的.异步的文件系统事件控制机制.linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加.删除. ...
- python命令行参数
〇.python中对应的argc, argv需要模块:sys参数个数:len(sys.argv)脚本名: sys.argv[0]参数1: sys.argv[1]参数2: sys. ...
- 简述UICollectionView 使用
一.介绍 UICollectionView类负责管理数据的有序集合以及以自定义布局的模式来呈现这些数据,它提供了一些常用的表格(table)功能,此外还增加了许多单栏布局.UICollectionVi ...
- 一个有趣的基于C++的模拟发牌程序
在内存中模拟出一副牌,然后模拟洗牌,发牌等动作. 流程是这样的:构建一副牌保存到一个数组中—洗牌—创建玩家—向玩家发牌–输出每个玩家的牌. #include <stdio.h> #incl ...