原文:使用作业自动清理数据库日志文件

在上一篇文章中介绍了如何删除数据库日志文件,但是想想还是不是不方便需要手工操作,于是想结合作业实现自动清理日志文件,在清理日志文件时我加上了条件,当磁盘控空间不足多少M才会清理,下面介绍如何实现该功能。没有阅读上一篇文章的,可以通过传送门阅读(删除数据库日志文件的方法)!

阅读目录

  • SQL查询磁盘空间大小
  • 存储过程添加作业
  • 示例下载
回到顶部

SQL查询磁盘空间大小

   采用内置的存储过程,即可查看各个磁盘可用空间

  

exec master..xp_fixeddrives

回到顶部

存储过程添加作业

  

GO
IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID('usp_p_CreateJob'))
BEGINDROP PROC dbo.usp_p_CreateJob
END
GO
CREATE PROCEDURE dbo.usp_p_CreateJob(@jobname varchar(100),         @sql VARCHAR(MAX),                      @freqtype varchar(6)='day',     @fsinterval int=1,                @time int=235959,                     @description VARCHAR(1000)=''
)
AS
/*
功能:创建SQL作业
参数:@jobname:作业名称@sql:要执行的命令@freqtype:时间周期,month 月,week 周,day 日@fsinterval:相对于每日的重复次数@time:开始执行时间,对于重复执行的作业,将从0点到23:59分@description:作业的描述
*/
BEGINDECLARE @dbname AS VARCHAR(500)SET @dbname=DB_NAME()BEGIN TRANSACTIONDECLARE @ReturnCode INTSELECT @ReturnCode = 0--添加类别IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name='添加作业' AND category_class=1)BEGINEXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'添加作业'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackEND--删除作业  DECLARE @JobID BINARY(16)   DECLARE @ErrMsg NVARCHAR(500)      SELECT  @JobID = job_id  FROM msdb.dbo.sysjobs WHERE name = @JobName  IF ( @JobID IS NOT NULL )  BEGIN   -- 检查此作业是否为多重服务器作业  IF ( EXISTS ( SELECT * FROM msdb.dbo.sysjobservers WHERE ( job_id = @JobID ) AND ( server_id <> 0 ) ) )  BEGIN  --多重服务器作业不操作  SET @ErrMsg = '无法导入作业"' + @JobName + '",因为已经有相同名称的多重服务器作业。'  RAISERROR (@ErrMsg, 16, 1)   GOTO QuitWithRollback  END  ELSE  BEGIN  -- 删除[本地]作业   EXECUTE msdb.dbo.sp_delete_job @job_name = @JobName  SELECT @JobID = NULL  END  END  SET @JobID = NULL    EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=@jobname, @enabled=1, @notify_level_eventlog=2, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=@description, @category_name=N'添加作业', @owner_login_name=N'sa', @job_id = @jobId OUTPUTIF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback/****** Object:  Step [数据同步]    Script Date: 01/25/2014 23:00:36 ******/EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=@jobname, @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=5, @retry_interval=5, @os_run_priority=0, @subsystem=N'TSQL', @command= @sql, @database_name=@dbname, @flags=0IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackEXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback--创建调度declare @ftype int,@fstype int,@ffactor intselect @ftype=case @freqtype when 'day' then 4when 'week' then 8when 'month' then 16 end,@fstype=case @fsinterval when 1 then 0 else 8 endif @fsinterval<>1 set @time=0set @ffactor=case @freqtype when 'day' then 0 else 1 endEXEC msdb..sp_add_jobschedule @job_name=@jobname, @name = @jobname,@freq_type=@ftype ,                                        @freq_interval=1,                                       @freq_subday_type=@fstype,                       @freq_subday_interval=@fsinterval,        @freq_recurrence_factor=@ffactor,@active_start_time=@time                         IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackEXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackCOMMIT TRANSACTIONGOTO EndSaveQuitWithRollback:IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTIONEndSave:
END
GO

结合上一篇文章的usp_p_delDBLog,进行改造

  

GO
IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID('usp_p_delDBLog'))
BEGINDROP PROC dbo.usp_p_delDBLog
END
GO
CREATE PROC usp_p_delDBLog(@DriveLimit AS BIGINT,@DBLogSise AS INT =0
)
/*
*    功能:收缩当前数据库日志文件
*    参数  @DriveLimit:当前数据库所在磁盘空间到达多少的时候进行收缩数据库  MB
*          @DBLogSise:日志文件收缩至多少M 默认收缩到最小
*/
AS
BEGINIF @DBLogSise<0 OR @DriveLimit<0BEGINRETURNEND--当前数据库所在磁盘DECLARE @Drive AS VARCHAR(10)DECLARE @Available AS BIGINTSELECT TOP 1  @Drive=SUBSTRING(filename,1,1)  from   sysfilesCREATE TABLE #TempFile(Drive VARCHAR(10),--磁盘Available BIGINT --可用大小MB
    )INSERT INTO #TempFile(Drive,Available)exec master..xp_fixeddrives--查询当前数据库所在磁盘剩余空间大小SELECT @Available=Available FROM #TempFileWHERE Drive=@Drive--符合条件则进行收缩日志文件IF @Available<=@DriveLimitBEGIN--查询出数据库对应的日志文件名称DECLARE @strDBName AS NVARCHAR(500)DECLARE @strLogName AS NVARCHAR(500)DECLARE @strSQL AS VARCHAR(1000)SELECT @strLogName=B.name,@strDBName=A.nameFROM master.sys.databases AS AINNER JOIN sys.master_files AS BON A.database_id = B.database_idWHERE 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)    ENDDROP TABLE #TempFile
END
GO

这里主要添加了查询当前数据库所在磁盘空间剩余大小的功能

    --当前数据库所在磁盘DECLARE @Drive AS VARCHAR(10)DECLARE @Available AS BIGINTSELECT TOP 1  @Drive=SUBSTRING(filename,1,1)  from   sysfilesCREATE TABLE #TempFile(Drive VARCHAR(10),--磁盘Available BIGINT --可用大小MB
    )INSERT INTO #TempFile(Drive,Available)exec master..xp_fixeddrives--查询当前数据库所在磁盘剩余空间大小SELECT @Available=Available FROM #TempFileWHERE Drive=@Drive

好了上面的准备工作做完以后可以通过以下SQL进行添加自动运行的作业

--添加作业
--作业每天间隔两小时执行一次
--执行条件为磁盘空间不足 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)

回到顶部

示例下载

示例sql

  

   相关阅读:附加没有日志文件的数据库方法

删除数据库日志文件的方法

使用作业自动清理数据库日志文件相关推荐

  1. SQL Server 2008 清理数据库日志文件

    前言:今天运维支撑跟我反映生产环境的数据库日志文件过大,占用服务器过多空间,希望我能帮忙解决这个问题,于是有了这个记录. 这是修改前的某一个数据库日志文件163G: 一开始我们在数据库执行下方语句: ...

  2. SQL SERVER 2014 清理数据库日志文件踩的坑!

    先简单带一下.ldf和.mdf区别 .mdf:数据库数据文件,存放一个数据库的数据信息. .ldf:数据库日志文件,存放对该数据库的更新操作(增.删.改)的文件. 所在在还原数据库时很慢,还原成功后发 ...

  3. 服务器怎么清除日志文件,如何清理服务器数据库日志文件

    如何清理服务器数据库日志文件 内容精选 换一换 在本容灾方案中,线下的生产数据中心有两台MySQL,需要配置为主备关系,以确保线下仅MySQL故障时,可直接在线下切换到备节点,因此,需要先配置业务端内 ...

  4. 系统运维|SqlServer2008|数据库日志文件过大需要清理的操作攻略

    摘要: 1.执行SQL语句改成"简单模式" 2.收缩数据库 3.执行SQL语句改回"完全模式" 原文链接: http://www.lookdaima.com/W ...

  5. SQLSERVER数据库日志文件过大,如何压缩并定期清理 ?

    日志文件64.7G,硬盘都快满了, 解决方案如下:先压缩数据库日志文件 (以我SQL2000 的iRecorder数据库为例): 右键iRecorder   属性 --> 选项-->故障还 ...

  6. PostgreSQL归档配置及自动清理归档日志

    PostgreSQL归档配置及自动清理归档日志 在生产环境中,数据库都需要开启归档模式,那么PG该如何开始归档呢? PG中归档配置涉及几个参数: # - Archiving - #是否开启归档 #ar ...

  7. 当SQL数据库日志文件已满,或者日志很大,怎么办

    当SQL数据库日志文件已满,或者日志很大,就需要压缩日志及数据库文件: 1.清空日志   DUMP  TRANSACTION  库名  WITH  NO_LOG    2.截断事务日志:   BACK ...

  8. Sqlserver系统数据库和用户数据库日志文件全部丢失的恢复

    系统数据库和用户数据库日志都丢失的情况下,数据库无法启动,需要先重建系统数据库日志文件以便把sqlserver service拉起来,再重建用户数据库 试过但是行不通的办法 1.-mClient单用户 ...

  9. Python 自动清理电脑垃圾文件,一键启动即可

    经常存在在我们的电脑中的垃圾文件主要是指系统在运行过程中产生的tmp临时文件.日志文件.临时备份文件等.垃圾清理器的作用其实也是对这些文件进行清理,不会影响到我们使用产生的数据文件.如果是手动删除的话 ...

  10. 【mysql-日志】清理二进制日志文件

    清理二进制日志文件 近期开发中碰到大数据量表格,对结构做操作的时候会产生大量二进制日志,所以在此学习一下清理二进制日志文件. 查看二进制文件命令 show master logs; 方法一:reset ...

最新文章

  1. Java编译那些事儿【转】
  2. Bad version number in .class file
  3. 利用tcpdump抓取mysql sql语句
  4. 【VC基础】 5、对象相关性(Object Dependencies)
  5. 【十二省联考】春节十二响【贪心】【堆】【启发式合并】
  6. 工具杂记-notepad++正则表达式匹配替换
  7. RobotStudio Smart组件创建动态夹具
  8. android jni framework,Android Framework层的JNI机制(二)
  9. STM32之端口复用与重映射
  10. cmd cd命令_Windows系统CMD命令提示符的常用命令汇总
  11. [leetcode]1131. 绝对值表达式的最大值 --绝对值表达式枚举拆分的方法
  12. win10系统的快捷键
  13. linux 获取指定目录最大深度(层数)02
  14. adb工具包的安装和使用方法
  15. 7.72GB ARCGIS ERDAS ENVI干货教程网盘下载
  16. 45+最佳免费WordPress主题(2021年)
  17. 科学把妹法 ( ̄▽ ̄)
  18. 破解数字化转型难题,华为云一站式大数据BI赋能企业发展
  19. XPO 的三篇介绍文章。
  20. Windows10+YOLOV3+VisualStudio2017最新版本超详细过程

热门文章

  1. 在windows下把txt文件改为utf8格式
  2. Memcache:set()
  3. 130 MySQL字段完整性约束(重要)
  4. MYSQL 碎片查询
  5. SqlServer的代理问题
  6. Object-C——三大特性之多态
  7. yii2添加自定义字段
  8. block(块元素)、inline(内联元素)的差别是什么?
  9. MQTT协议(1)-简介
  10. whose view is not in the window hierarchy