当前位置:Gxlcms > 数据库问题 > SQLSERVER--定期清理维护作业的历史记录

SQLSERVER--定期清理维护作业的历史记录

时间:2021-07-01 10:21:17 帮助过:4人阅读

msdb.dbo.sp_delete_database_backuphistory @database_name = Nmonitor 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(0 + CONVERT(VARCHAR, DATEPART(MM,
                                                             @Datetime)), 2))




       IF ( CHARINDEX(DD, @StringDate) > 0 )
           SET @StringDate = REPLACE(@StringDate, DD,
                                     RIGHT(0 + DATENAME(DD, @Datetime), 2))




       IF ( CHARINDEX(HH, @StringDate) > 0 )
           SET @StringDate = REPLACE(@StringDate, HH,
                                     RIGHT(0 + DATENAME(HH, @Datetime), 2))


       IF ( CHARINDEX(mm, @StringDate) > 0 )
           SET @StringDate = REPLACE(@StringDate, mm,
                                     RIGHT(0 + DATENAME(mm, @Datetime), 2))


       IF ( CHARINDEX(ss, @StringDate) > 0 )
           SET @StringDate = REPLACE(@StringDate, ss,
                                     RIGHT(0 + DATENAME(ss, @Datetime), 2))


       IF ( CHARINDEX(ms, @StringDate) > 0 )
           SET @StringDate = REPLACE(@StringDate, ms,
                                     RIGHT(0 + DATENAME(ms, @Datetime), 2))


       RETURN @StringDate


   END
--====================================


GO
View Code


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

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

技术分享

 

SQLSERVER--定期清理维护作业的历史记录

标签:

人气教程排行