SQL Server - shrink file & shrink job

在SQL Server中,日誌文件會一直記錄。
所以我們需要使用Log truncation來釋放日誌文件中的空間,供日誌文件空間重複使用。
爲避免空間不足,除非出於某些原因延遲日誌截斷,否則在發生以下事件後會自動發生截斷:
在簡單恢復模式下,經過一個檢查點。
在完全恢復模型或大容量日誌記錄的恢復模型下,如果自上次備份以來已出現檢查點,則在日誌備份後會發生截斷(除非它是僅複製日誌備份)。
在Log truncation之外,我們還可以使用shrink功能針對log file進行截斷。

--查詢日誌文件號
select file_id from sys.database_files where type_desc = 'LOG';
--對日誌文件進行shrink。
USE testdb;
GO
DBCC SHRINKFILE (X); -- X爲上一步查出的file_id。
GO

當然我們可以做一個job,定期執行。

USE testdb;
IF EXISTS(SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'Shrinktestdb_JOB')
   EXEC msdb.dbo.sp_delete_job @job_name=N'Shrinktestdb_JOB'
GO

DECLARE @jobname SYSNAME, @file_id SYSNAME, @servername SYSNAME, @dbname SYSNAME
DECLARE @SQL VARCHAR(100)

SELECT @jobname='Shrinktestdb_JOB', @dbname=db_name(), @file_id=file_id from sys.database_files where type_desc = 'LOG';
SELECT @servername=name from sys.servers;
SET @SQL ='DBCC SHRINKFILE (' + @file_id +');' 

--1.創建作業
exec msdb.dbo.sp_add_job @job_name=@jobname

--2.創建作業步驟
exec msdb.dbo.sp_add_jobstep 
   @job_name=@jobname,
   @step_name = '收縮數據庫',
   @subsystem = 'TSQL',
   @database_name = @dbname,
   @command = @SQL,
   --@command = 'exec DateTableProc',
   @retry_attempts = 1,     --重試次數
   @retry_interval = 1      --重試間隔

--3 創建調度,創建作業計劃,每小時執行一次
EXEC msdb.dbo.sp_add_jobschedule @job_name = @jobname, 
   @name = 'Shrinktestdb_JOB',
   @freq_type = 4,              --freq_type指定作業執行時間的值,4代表間隔爲每天,8代表每週,16代表每月
   @freq_interval = 2,          --freq_interval執行作業的日期,依賴於freq_type 的值,1代表每天執行一次
   @freq_subday_type=0x8,       --重複方式,0x1=在指定的時間,0x4=多少分鐘,0x8=多少小時執行一次
   @freq_subday_interval=1,     --重複週期數,這裏每小時執行一次
   @active_start_date = NULL,   --作業執行的開始日期,爲NULL時表示當前日期,格式爲YYYYMMDD
   @active_end_date = 99991231, --作業執行的停止日期,默認爲99991231,格式爲YYYYMMDD
   @active_start_time = 00000,  --作業執行的開始時間,格式爲HHMMSS
   @active_end_time = 235959    --作業執行的停止時間,格式爲HHMMSS

--4 添加目標服務器
EXEC msdb.dbo.sp_add_jobserver 
    @job_name = @jobname ,  
    @server_name = @servername

--5 開始作業
exec msdb.dbo.sp_start_job 
    @job_name = @jobname--,@server_name='(local)'

將整段代碼一起執行,就會生成一個job,每小時執行一次,針對log文件進行shrink。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章