Very useful on space constrained systems post index maintenance, etc. i.e.
exec usp_maintain_database_log
@target_free_pct = 20,
@minimum_size_mb = 500,
@backup_log_file_path = 'C:\TEMP\'
Enjoy!
Very useful on space constrained systems post index maintenance, etc. i.e.
exec usp_maintain_database_log
@target_free_pct = 20,
@minimum_size_mb = 500,
@backup_log_file_path = 'C:\TEMP\'
Enjoy!
if object_id('dbo.usp_maintain_database_log') is not null drop procedure dbo.usp_maintain_database_log go create procedure dbo.usp_maintain_database_log @target_free_pct int = 10, @minimum_size_mb int = 100, @backup_log_file_path nvarchar(max) = 'T:\SQLDUMP\LOGDUMP\' as /* Name: dbo.usp_maintain_database_log Author: Tommy Bollhofer (tbollhofer2@gmail.com) Purpose: Performs a checkpoint or a transaction log backup followed by a DBCC SHRINKFILE on the transaction log to the target percentage specified relative to the total data file(s) size. Usage: exec dbo.usp_maintain_database_log @target_free_pct = 10, @minimum_size_mb = 100, @backup_log_file_path = 'T:\SQLDUMP\LOGDUMP\' Last Modified: 09/10/2009 */ set nocount on declare @free_pct int, @file_name sysname, @total_log_size_mb int, @target_size_mb int, @database_name sysname, @backup_file_name nvarchar(max), @sql nvarchar(max), @cmd varchar(1000) create table #results ( [database_name] sysname, [file_name] sysname, [file_type] varchar(4), [total_size_mb] int, [available_space_mb] int, [free_space_pct] int ); with file_sizes_cte as ( select db_name() as database_name, [name] as [file_name], [file_type] = case type when 0 then 'data'when 1 then 'log' end, [total_size_mb] = case ceiling([size]/128) when 0 then 1 else ceiling([size]/128) end, [available_space_mb] = case ceiling([size]/128) when 0 then (1 - cast(fileproperty([name], 'spaceused') as int) /128) else (([size]/128) - cast(fileproperty([name], 'spaceused') as int) /128) end from sys.database_files with(nolock) ) insert into #results ( [database_name], [file_name], [file_type], [total_size_mb], [available_space_mb], [free_space_pct] ) select [database_name], [file_name], [file_type], [total_size_mb], [available_space_mb], ceiling(cast([available_space_mb] as decimal(10,1)) / [total_size_mb]*100) as [free_space_pct] from file_sizes_cte select @database_name = database_name, @file_name = [file_name], @total_log_size_mb = total_size_mb, @free_pct = available_space_mb * 100 / total_size_mb from #results where file_type = 'log' select @target_size_mb = convert(int,sum(total_size_mb) * .10) from #results where file_type = 'data' /* --debug print @free_pct print '>=' print @target_free_pct print 'and' print @total_log_size_mb print '>=' print @minimum_size_mb print 'and' print @target_size_mb print '<' print @total_log_size_mb */ if (@free_pct >= @target_free_pct and @total_log_size_mb >= @minimum_size_mb) and (@target_size_mb < @total_log_size_mb) begin if (select cast(databasepropertyex(db_name(), 'recovery') as varchar(10))) = 'SIMPLE' begin set @sql = 'checkpoint' exec sp_executesql @sql end if (select cast(databasepropertyex(db_name(), 'recovery') as varchar(10))) = 'FULL' begin set @backup_file_name = upper(db_name()) + '_Log_' + replace(replace(replace(convert(varchar(50), getdate(), 120), '-', ''), ' ', ''), ':', '') + '.lbk' set @sql = 'backup log ' + @database_name + ' to disk = ''' + @backup_log_file_path + @backup_file_name + ''' ' exec sp_executesql @sql end exec( 'dbcc shrinkfile( ' + @file_name + ',' + @target_size_mb +' )' ) end drop table #results go