在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。