数据库的自动作业清理日志脚本

原创 2011年01月23日 23:08:00

数据库在运行后会产生非常大的日志,在每天自动备份后就会是硬盘的空间呈指数增长,这是后清理数据库日志是很必要的。一下是建立如何自动清理数据库日志的作业的脚本

/***运行后会在"SQL Server 代理/作业"中添加相应的作业项***/
/***可能通过双击来修改其中的"步骤"和"计划"***/
/* 本文原创于 葫芦之家 www.huluhome.com 转载请注明出处 **/
USE [msdb]
GO
DECLARE @KeduDBName VARCHAR(20), @DatabaseID int, @JobName VARCHAR(100)
SET @KeduDBName = N'Kedu4s_Test'
set @JobName = N'清理数据库日志(Kedu4s_Test)'
-- 运行后还需要修改配置中的数据库(步骤中的数据库)
-- 还需要核对日志文件名(步骤中的代码部分)

/****** 对象:  Job [清理mydb_test数据库日志]     ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** 对象:  JobCategory [[Uncategorized (Local)]]]    ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=@JobName,
  @enabled=1,
  @notify_level_eventlog=0,
  @notify_level_email=0,
  @notify_level_netsend=0,
  @notify_level_page=0,
  @delete_level=0,
  @description=N'无描述。',
  @category_name=N'[Uncategorized (Local)]',
  @owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** 对象:  Step [清理业务数据库日志] 
本文原创于:  www.huluhome.com 转载请注明   ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'清理数据库日志',
  @step_id=1,
  @cmdexec_success_code=0,
  @on_success_action=3,
  @on_success_step_id=0,
  @on_fail_action=2,
  @on_fail_step_id=0,
  @retry_attempts=0,
  @retry_interval=0,
  @os_run_priority=0, @subsystem=N'TSQL',
  @command=N'SET NOCOUNT ON
Begin Try
    DROP TABLE DummyTrans
End Try
Begin Catch
End Catch

DECLARE @LogicalFileName sysname,
        @MaxMinutes INT,
        @NewSize INT

SELECT @LogicalFileName = ''mydbLog'', -- 日志文件名
       @MaxMinutes = 10, -- Limit on time allowed to wrap log.
       @NewSize = 10 -- 你想设定的日志文件的大小(M)

-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName

SELECT ''Original Size of '' + db_name() + '' LOG is '' +
       CONVERT(VARCHAR(30),@OriginalSize) + '' 8K pages or '' +
       CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ''MB''
FROM sysfiles
WHERE name = @LogicalFileName

CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)

DECLARE @Counter INT,
        @StartTime DATETIME,
        @TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
       @TruncLog = ''BACKUP LOG '' + db_name() + '' WITH TRUNCATE_ONLY''

EXEC (@TruncLog)
DBCC SHRINKFILE (@LogicalFileName, @NewSize)

-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
    BEGIN -- update
        INSERT DummyTrans VALUES (''Fill Log'')
        DELETE DummyTrans
        SELECT @Counter = @Counter + 1
    END
    EXEC (@TruncLog)
END

SELECT ''Final Size of '' + db_name() + '' LOG is '' +
       CONVERT(VARCHAR(30),size) + '' 8K pages or '' +
       CONVERT(VARCHAR(30),(size*8/1024)) + ''MB''
FROM sysfiles
WHERE name = @LogicalFileName

DROP TABLE DummyTrans

SET NOCOUNT OFF',
  @database_name=@KeduDBName,
  @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
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'每周一次',
  @enabled=1,
  @freq_type=8,
  @freq_interval=1,
  @freq_subday_type=1,
  @freq_subday_interval=0,
  @freq_relative_interval=0,
  @freq_recurrence_factor=1,
  @active_start_date=20090806,
  @active_end_date=99991231,
  @active_start_time=150000,
  @active_end_time=235959
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:

利用脚本自动清理Oracle归档日志

背景由于Oracle数据库开启了归档模式,经常因为归档日志文件占用空间过大而导致数据库无法正常连接,发现问题后需要手动清理归档日志,而发现问题时可能已经过去很长时间了,在生产环境中对用户的使用有非常严...
  • jaune161
  • jaune161
  • 2016年01月04日 09:07
  • 6200

linux自动清理日志脚本

脚本: #!/bin/bash for j in `du -h --max-depth=0 /home/zhanghu/*/_package/run/ |grep G|grep -v '/home...
  • xiaoyida11
  • xiaoyida11
  • 2017年06月08日 19:24
  • 198

shell脚本自动清理服务器日志、图片等信息

在做性能测试的时候,linux服务器时常会产生大量数据,如日志信息,图片信息,文件信息等,压测一段时间后,导致服务器磁盘空间暂满而崩溃,每天手动清理比较麻烦, 利用shell脚本自动清理,脚本如下 ...
  • haoluojie
  • haoluojie
  • 2016年03月21日 16:11
  • 1065

IIS日志自动删除 bat脚本

forfiles /p c:\inetpub\logs\LogFiles\W3SVC1\ /s /m *.*  /d -2 /C "cmd /c del /q @FILE"
  • u014623506
  • u014623506
  • 2017年06月17日 17:11
  • 282

sql server 自动清除日志文件

sql server 自动清除日志文件
  • zhuxiangdong
  • zhuxiangdong
  • 2010年07月28日 17:11
  • 2646

shell脚本自动删除n天前日志

转自:http://www.cnblogs.com/peida/archive/2013/03/25/2980121.html linux是一个很能自动产生文件的系统,日志、邮件、备份等。虽然现...
  • huluedeai
  • huluedeai
  • 2015年03月22日 13:26
  • 2243

sql server 定期自动清理日志

原文地址:点击打开链接 数据库日志文件是随着时间增长而增长的,如果长时间不清理,文件会变得特别大,因此需要定期清空,但是日至文件是恢复数据库的重要依据,不用日志文件也是不明智的。手工清除单个数...
  • qq798833488
  • qq798833488
  • 2016年05月11日 10:46
  • 1705

linux 日志定时清理脚本

linux 日志清理
  • zhuyijian135757
  • zhuyijian135757
  • 2015年07月11日 23:40
  • 2855

linux 定期删除spark日志 shell 脚本

如下: 在linux命令行中创建一个空白文件,将下面代码加入到文件中。 注意:1.如果在windows 中编辑,上传到linux服务器中,需要利用vim 的 : set ff=unix  ...
  • huojingjia
  • huojingjia
  • 2016年10月21日 15:50
  • 798

Linux应用--日志定时清理

上篇文章写到了在工作中遇到的一个因为磁盘空间占满导致的问题,因应用每天都要写日志,所以如果不定时对部署应用的服务器进行清理的话会经常遇到这样的问题。为避免相似的问题发生,今天总结一个Linux日志定时...
  • lmb55
  • lmb55
  • 2017年02月02日 20:25
  • 3125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库的自动作业清理日志脚本
举报原因:
原因补充:

(最多只允许输入30个字)