Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用作业自动清理数据库日志文件

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

作者头像
用户1168362
发布于 2018-01-05 08:01:00
发布于 2018-01-05 08:01:00
1K00
代码可运行
举报
文章被收录于专栏:.net core新时代.net core新时代
运行总次数:0
代码可运行

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

阅读目录

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

回到顶部

SQL查询磁盘空间大小

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exec master..xp_fixeddrives

回到顶部

存储过程添加作业

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GO
IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID('usp_p_CreateJob'))
BEGIN
    DROP 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:作业的描述
*/ 
BEGIN
    DECLARE @dbname AS VARCHAR(500)
    SET @dbname=DB_NAME()
        
    BEGIN TRANSACTION
    DECLARE @ReturnCode INT
    SELECT @ReturnCode = 0
    
    --添加类别
    IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name='添加作业' AND category_class=1)
    BEGIN
        EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'添加作业'
        IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    END
    
    --删除作业  
    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 OUTPUT
    IF (@@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=0
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    
    --创建调度
    declare @ftype int,@fstype int,@ffactor int
    select @ftype=case @freqtype when 'day' then 4
                                            when 'week' then 8
                                            when 'month' then 16 end
            ,@fstype=case @fsinterval when 1 then 0 else 8 end
    if @fsinterval<>1 set @time=0
    set @ffactor=case @freqtype when 'day' then 0 else 1 end
    
    EXEC 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 QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    COMMIT TRANSACTION
    GOTO EndSave
    QuitWithRollback:
        IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
    EndSave:
END
GO

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    --当前数据库所在磁盘
    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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--添加作业
--作业每天间隔两小时执行一次
--执行条件为磁盘空间不足 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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-06-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
删除数据库日志文件的方法
本文介绍了如何删除数据库日志文件的方法,通过两种方式:一是通过手动操作,二是通过存储过程。通过存储过程可以更方便地控制数据库日志文件的大小,从而提高数据库的性能和稳定性。同时,还介绍了一种通过存储过程附加没有日志文件的数据库的方法。
用户1168362
2018/01/05
1.3K0
删除数据库日志文件的方法
SQL Server 常用近百条SQL语句(收藏版)
sp_configure显示或更改当前服务器的全局配置设置。 RECONFIGURE表示SQL Server不用重新启动就立即生效 。
数据和云
2020/04/02
2.7K0
使用T-SQL配置日志传送
日志传送(log shipping)主要基于SQL Server代理,使用定时作业来完成,另外在配置日志传送之前必须要创建共享文件夹,用于辅助服务器访问。这里我们假设有数据库logTrans1需要进行日志传送,共享文件夹为“C:\data”,在T-SQL中配置日志传送主要有以下几步操作:
深蓝studyzy
2022/06/16
3640
Sqlserver2005日志文件太大,使其减小的方法
backup log dbNamewith NO_LOG backup log dbNamewith TRUNCATE_ONLY DBCC SHRINKDATABASE(dbName)
全栈程序员站长
2022/07/17
1.2K0
定时同步服务器上的数据的例子:
--测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test --1. 链接服务器上的表 create table [user](id int primary key,number varchar(4),name varchar(10)) go --2. 本地服务器上的表 --本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录 if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [user] GO create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit) go
jack.yang
2025/04/05
1020
数据库干货:整理SQLServer非常实用的脚本
今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助!
小明互联网技术分享社区
2021/02/25
3800
数据库干货:整理SQLServer非常实用的脚本
SQL Server 数据库清除日志的方法
SQLSERVER的数据库日志占用很大的空间,下面提供三种方法用于清除无用的数据库日志文件 方法一: 1、打开查询分析器,输入命令 BACKUP LOG database_name WITH NO_LOG 2、再打开企业管理器--右键要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至xxm,这里会给出一个允许收缩到的最小m数,直接输入这个数,确定就可以了。 方法二: 设置检查点,自动截断日志   一般情况下,SQL数据库的收缩并不能很大程度上减小数
逸鹏
2018/04/11
4.9K0
关于SQL Server 镜像数据库快照的创建及使用
从SQL Server 2005 SP1 起,SQL 开始支持数据库镜像。它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便。每个主体数据库只能有一个镜像数据库。镜像数据库作为主体数据库的一个副本,在主体数据库发生故障、不可访问时能够迅速恢复数据库访问,提供故障恢复功能。镜像数据库一直处于“恢复”状态,因此不能被直接访问。
东山絮柳仔
2021/03/20
2.3K0
数据库基本----SQL语句大全
EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'
阳光岛主
2019/02/19
6.3K0
SQL语句大全(3)
错误!未找到目录项。 set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE
py3study
2020/01/14
8060
数据库的一些注入技巧-sqlserver
SELECT * FROM Users WHERE username = '' OR 1=1 --' AND password ='';
Jumbo
2019/11/05
6930
数据库基础与SQL基础知识整理
1. DBMS(DataBaseManagement System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。还有一种是物理上的Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象 MSSQLServer、Oracle等某种DBMS;存放一堆数据表的一个分类( Catalog )
洋仔聊编程
2019/01/15
1.4K0
SQL之经典SQL语句大全
经典SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name  2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack  4
互联网金融打杂
2018/04/03
1.4K0
sql插数据语句_sql语句批量添加数据
注:如果要更新自增字段需要把IDENTITY_INSERT选项开启,用完后记得关闭
全栈程序员站长
2022/09/20
1.4K0
【DB宝84】使用OGG for MSSQL微服务快速双向同步RDS数据库(双主)
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。
AiDBA宝典
2022/02/23
2.6K0
【DB宝84】使用OGG for MSSQL微服务快速双向同步RDS数据库(双主)
SQL Server查询数据库文件分配大小和数据库真实大小的脚本分享
查询真实大小(非数据文件分配大小) -- 当前数据库真实大小 SELECT CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB, CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, CAST(ROUND(((SUM(a.total_pages)
AiDBA宝典
2023/04/27
1.1K0
SQL Server查询数据库文件分配大小和数据库真实大小的脚本分享
sql2005数据库置疑的解决方法_sql数据库置疑修复工具
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager 里面建立。 B.停掉数据库服务器。 C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据 库数据文件test_data.mdf。 D.启动数据库服务器。此时会看到数据库test的状态为”置疑”。这时候不能对此数据库进行任何*作。 E.设置数据库允许直接*作系统表。此*作可以在SQL Server Enterprise Manager里面选择数据库服 务器,按右键,选择”属性”,在”服务器设置”页面中将”允许对系统目录直接修改”一项选中。也可以 使用如下语句来实现。 use master go sp_configure ‘allow updates’,1 go reconfigure with override go F.设置test为紧急修复模式 update sysdatabases set status=-32768 where dbid=DB_ID(‘test’) 此时可以在SQL Server Enterprise Manager里面看到该数据库处于”只读\置疑\脱机\紧急模式”可以 看到数据库里面的表,但是仅仅有系统表 G.下面执行真正的恢复*作,重建数据库日志文件 dbcc rebuild_log(‘test’,’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf’) 执行过程中,如果遇到下列提示信息:
全栈程序员站长
2022/09/23
1.5K0
SQL Server代理作业的巨大性能飞跃:从2天到2小时的调优
在本文中,麦老师将给大家介绍如何调优SQL Server的代理作业JOB,并结合实际生产案例将一个运行时间从长达2天的作业调优缩短至令人欣喜的2小时。
AiDBA宝典
2024/02/26
4790
SQL Server代理作业的巨大性能飞跃:从2天到2小时的调优
Sql Server查看所有数据库名,表名,字段名(SQL语句)
1.获取所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name
静谧的小码农
2019/05/26
5.1K0
我为NET狂官方面试题-数据库篇答案
说明:如有错误可以批评指正,有更好写法也可以提点下~ 1. 求结果:select "1"? 报错,SQL里面只有单引号,列如:'xx' 2. 查找包含"objs"的表?查找包含"o"的数据库? select * from sys.objects where name like '%objs%' select * from sys.databases where name like '%o%' 3. 求今天距离2002年有多少年,多少天? select datediff(yy,'2002',getdate
逸鹏
2018/04/11
6930
我为NET狂官方面试题-数据库篇答案
推荐阅读
相关推荐
删除数据库日志文件的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档