使用作業自動清理數據庫日志文件


       在上一篇文章中介紹了如何刪除數據庫日志文件,但是想想還是不是不方便需要手工操作,於是想結合作業實現自動清理日志文件,在清理日志文件時我加上了條件,當磁盤控空間不足多少M才會清理,下面介紹如何實現該功能。沒有閱讀上一篇文章的,可以通過傳送門閱讀(刪除數據庫日志文件的方法)

SQL查詢磁盤空間大小

   采用內置的存儲過程,即可查看各個磁盤可用空間

   

exec master..xp_fixeddrives

 

 

 

存儲過程添加作業

  

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,進行改造

  

 

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


這里主要添加了查詢當前數據庫所在磁盤空間剩余大小的功能

    --當前數據庫所在磁盤
    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進行添加自動運行的作業

--添加作業
--作業每天間隔兩小時執行一次
--執行條件為磁盤空間不足 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

  

   相關閱讀:附加沒有日志文件的數據庫方法

                          刪除數據庫日志文件的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM