Shrink log file for log_reuse_wait_desc = ‘log_backup’, there are cases we are getting often that transaction log full due do lack of log_backup or sometimes in simple mode the log is full for larger high IOPS transaction.
Take a look on this –> https://sqlserverblogforum.com/dba/database-transaction-log-file-full-in-the-full-recovery-model/
Here is the script to shrink transaction log file. schedule it on agent for every hour.
/* -- create database DBA_DB --drop table tbl_log_shrink_temp_load use DBA_DB go create table [dbo].[tbl_log_shrink_temp_load]( [db] [nvarchar](128) null, [size_mb] [int] null, [log_reuse_wait_desc] [nvarchar](60) null, [name] [sysname] not null, [recovery_model_desc] [nvarchar](60) null ) go --drop table tbl_log_shrink_history create table [dbo].[tbl_log_shrink_history]( [db] [nvarchar](128) null, [size_mb] [int] null, [log_reuse_wait_desc] [nvarchar](60) null, [name] [sysname] not null, [recovery_model_desc] [nvarchar](60) null, [date] [datetime] null ) on [primary] go alter table [dbo].[tbl_log_shrink_history] add default (getdate()) for [date] go */ -- drop proc usp_shrink_log_file -- select * from tbl_log_shrink_history order by date desc use DBA_DB go alter proc usp_shrink_log_file (@backup_location varchar(100)) as /* Summary: Shrink the log file log_reuse_wait_desc = 'log_backup' or nothing and recovery_model_desc <>'simple' and the size greater than 5GB, you can change the threshold Contact: muthukkumaran kaliyamoorhty Description: big log file shrink changelog: date coder description 2018-15-june muthukkumaran kaliyamoorhty initial */ begin declare @log_wait varchar(50) declare @db varchar(50) declare @minrow int declare @maxrow int declare @logical_name varchar(100) declare @sql varchar(1000) declare @sql1 varchar(1000) declare @sql2 varchar(1000) declare @bak_location varchar(1000) declare @recovery_mode varchar(50) set @bak_location= @backup_location --select @bak_location truncate table tbl_log_shrink_temp_load insert into tbl_log_shrink_temp_load select db_name(f.database_id) as db, f.size / 128 as size_mb,d.log_reuse_wait_desc,f.name,recovery_model_desc --into tbl_log_shrink_temp_load from master.sys.databases d join master.sys.master_files f on ( d.database_id = f.database_id ) where f.type_desc = 'log' and f.database_id not in( 1, 2, 3, 4 ) and f.size / 128 > 5120 -- > 5GB and d.is_read_only=0 group by db_name(f.database_id),f.size,d.log_reuse_wait_desc,f.name,recovery_model_desc declare @shrink_log table ( id int primary key identity, db varchar(100), log_reuse_wait_desc varchar(100), name varchar (50),recovery_model_desc varchar (50) ) insert into @shrink_log select db , log_reuse_wait_desc, name, recovery_model_desc from tbl_log_shrink_temp_load -- where log_reuse_wait_desc = 'nothing' --select db , log_reuse_wait_desc from tbl_log_shrink_temp_load select @minrow = min(id) from @shrink_log --where log_reuse_wait_desc = 'nothing' select @maxrow = max(id) from @shrink_log --where log_reuse_wait_desc = 'nothing' select @log_wait = log_reuse_wait_desc from @shrink_log --where log_reuse_wait_desc = 'nothing' --select @log_wait if (@log_wait='nothing') begin while (@minrow <=@maxrow) begin select @db=db, @logical_name=name from @shrink_log where id = @minrow and log_reuse_wait_desc = 'nothing' --print @logical_name set @sql='exec (''use[' + @db+ '];dbcc shrinkfile(''''' +@logical_name+''''')'')' --print (@sql) exec (@sql) set @minrow =@minrow +1 end end else --select @log_wait begin select @minrow = min(id)from @shrink_log where log_reuse_wait_desc = 'log_backup' and recovery_model_desc <>'simple' select @maxrow = max(id) from @shrink_log where log_reuse_wait_desc = 'log_backup' and recovery_model_desc <>'simple' --select @minrow,@maxrow while (@minrow <=@maxrow)-- and @recovery_mode<>'simple') begin select @db=db, @logical_name=name from @shrink_log where id = @minrow and log_reuse_wait_desc = 'log_backup' --select db, name from @shrink_log where id = @minrow and log_reuse_wait_desc = 'log_backup' --print @db set @sql1='backup log [' + @db + '] to disk=''' +@bak_location+''+@db+replace (replace(convert(nvarchar(20),getdate(),120),':','_'),' ','_') + '.trn''' --print (@sql1) exec (@sql1) exec (@sql1) set @sql2='exec (''use[' + @db + '];dbcc shrinkfile(''''' +@logical_name +''''')'')' --print(@sql2) exec (@sql2) set @minrow =@minrow +1 end end insert into tbl_log_shrink_history select *,getdate() from tbl_log_shrink_temp_load -- select * from tbl_log_shrink_history end -- EXEC DBA_DB.DBO.USP_SHRINK_LOG_FILE '\\WIN-PC\DB_Backups\'