第一步:创建清理数据库日志存储过程
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
