第一步:创建清理数据库日志存储过程
GO IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID('usp_p_delDBLog')) BEGIN DROP PROC dbo.usp_p_delDBLog END GO CREATE PROC usp_p_delDBLog( @DriveLimit AS BIGINT, @DBLogSise AS INT =0 ) /* * 功能:收缩当前数据库日志文件 * 参数 @DriveLimit:当前数据库所在磁盘空间到达多少的时候进行收缩数据库 MB * @DBLogSise:日志文件收缩至多少M 默认收缩到最小 */ AS BEGIN IF @DBLogSise<0 OR @DriveLimit<0 BEGIN RETURN END --当前数据库所在磁盘 DECLARE @Drive AS VARCHAR(10) DECLARE @Available AS BIGINT SELECT TOP 1 @Drive=SUBSTRING(filename,1,1) from sysfiles CREATE TABLE #TempFile( Drive VARCHAR(10),--磁盘 Available BIGINT --可用大小MB ) INSERT INTO #TempFile(Drive,Available) exec master..xp_fixeddrives --查询当前数据库所在磁盘剩余空间大小 SELECT @Available=Available FROM #TempFile WHERE Drive=@Drive --符合条件则进行收缩日志文件 IF @Available<=@DriveLimit BEGIN --查询出数据库对应的日志文件名称 DECLARE @strDBName AS NVARCHAR(500) DECLARE @strLogName AS NVARCHAR(500) DECLARE @strSQL AS VARCHAR(1000) SELECT @strLogName=B.name, @strDBName=A.name FROM master.sys.databases AS A INNER JOIN sys.master_files AS B ON A.database_id = B.database_id WHERE A.database_id=DB_ID() SET @strSQL=' --设置数据库恢复模式为简单 ALTER DATABASE ['+@strDBName+'] SET RECOVERY SIMPLE; --收缩日志文件 DBCC SHRINKFILE ('''+@strLogName+''' , '+CONVERT(VARCHAR(20),@DBLogSise)+'); --恢复数据库还原模式为完整 ALTER DATABASE ['+@strDBName+'] SET RECOVERY FULL ' exec(@strSQL) END DROP TABLE #TempFile END GO
第二步:创建作业自动清理数据库日志
--添加作业 --作业每天间隔两小时执行一次 --执行条件为磁盘空间不足 5000MB,即@DriveLimit=5000 可自行配置 DECLARE @@jobname AS VARCHAR(1000) SELECT @@jobname=DB_NAME()+'_自动清理当前数据库日志文件' EXEC dbo.usp_p_CreateJob @jobname = @@jobname, -- varchar(100) @sql = 'EXEC usp_p_delDBLog @DriveLimit=5000,@DBLogSise=0', -- varchar(max) @freqtype = 'day', -- varchar(6) @fsinterval = 2, -- int @time = 235959, -- int @description = '自动清理当前数据库日志文件' -- varchar(1000)
参考连接:https://www.cnblogs.com/yanweidie/p/3811035.html#_label1