Tüm Veritabanı Log Dosyalarını Shrink Etmek / Shrinking All Log Files

Veritabanı Log (.LDF) dosyalarımızın hepsini birden shrink etme ihtiyacımız olabilir. Recovery Model Simple olsa dahi bazen bunu yapmamız gerekebilir*

Yazmış olduğum SP ile tüm LDF dosyalarını topluca shrink edebilirsiniz. Bu SPyi tek olarak çalıştırabilir ya da sadece script ürettirebilirsiniz.

* Not: Shrink işleminin periyodik olarak ya da plansız yapılması önerilmeyen bir işlemdir. Shrink bir operasyon olarak ele alınmalı ve bilinçli bir şekilde yapılandırılmalı.

Kullanımı şu şekilde;

EXEC sp_shrinkLogFiles
@executeNumber = 2,  -- Kaç kes çalışsın?
@execute = 1         -- 1: çalıştırır 0: sadece script üretir

SP’nin create scripti;

CREATE PROC sp_shrinkLogFiles

@executeNumber INT = 1,
@execute BIT = 0

AS

DECLARE @cmd varchar(max)

SELECT @cmd = COALESCE(@cmd + '
', '') + '
USE [' + DB_NAME(database_id) + ']
DBCC SHRINKFILE (N'''+ name + ''' , 0, TRUNCATEONLY)'
FROM sys.master_files
WHERE database_id > 4 AND [type] = 1 AND [state] = 0

IF (@execute = 1)
 BEGIN
 PRINT '--- Started: ' + CONVERT(NVARCHAR(19),GETDATE(), 104) + ' ' + CONVERT(NVARCHAR(20),GETDATE(), 114) + ' ---'
 PRINT ''
 WHILE (@executeNumber > 0)
 BEGIN
 EXEC(@cmd)
 SET @executeNumber -= 1
 END
 PRINT ''
 PRINT '--- Finished: ' + CONVERT(NVARCHAR(19),GETDATE(), 104) + ' ' + CONVERT(NVARCHAR(20),GETDATE(), 114) + ' ---'
 END
ELSE
 BEGIN
 SELECT @cmd = REPLACE(@cmd,'TRUNCATEONLY)','TRUNCATEONLY)
GO ' + (SELECT CASE @executeNumber WHEN 1 THEN '' ELSE CAST(@executeNumber AS VARCHAR) END))

SELECT @cmd
 END