Share via


How to Trouble Shoot Transaction Log file Growth in SQLServer

How to Trouble Shoot T-Log file Growth
============================

Enable the following TF for checkpoint:-

TRACEFLAG 3512
Description ='Write info on log space used at checkpoint time to errorlog'
 
TRACEFLAG 3502
Description ='Send checkpoint state changes to errorlog'
 
TRACEFLAG 3504
Description ='Send checkpoint summary to errorlog ,Displays number of pages written and other stats'
 

Make sure this TF 3505 is not enabled which TF 3505Allows checkpointing to be dynamically disabled'
 

Create a database named Log_space_analysis and create these tables
===================================================

Create table LogSpaceusage
(dbname varchar(20), Log_Size_MB varchar(20), Log_Space_Used varchar(20), Status
varchar(20), rdate datetime default getdate())

Create table OpenTran
(trantag varchar(30), tranvalue varchar(46), rdate datetime default getdate())

CREATE TABLE [dbo].[trandetails]
([transaction_id] [bigint] NOT NULL, [session_id] [int] NOT NULL, [database_id]
[int] NOT NULL ,[database_transaction_begin_time] [datetime] NULL,
[database_transaction_log_bytes_used] [bigint] NOT NULL,
[database_transaction_log_bytes_used_system] [int] NOT NULL,
[database_transaction_log_bytes_reserved] [bigint] NOT NULL,
[database_transaction_log_bytes_reserved_system] [int] NOT NULL,
[database_transaction_log_record_count] [int] NOT NULL, [rdate] [datetime] NOT NULL

) ON [PRIMARY]

Run this three particular queries in different query windows (or) as different jobs just Before we start the operation which consumes Log.

Query 1
------------

while (1=1)
begin
DECLARE @string VARCHAR (255)
SELECT @string = 'DBCC sqlperf(''logspace'') '
INSERT INTO logspaceusage
(dbname,Log_Size_MB ,Log_Space_Used,Status)
EXEC (@string)
waitfor delay '0:00:30'
end

Query 2
------------
while (1=1)
begin
DECLARE @string VARCHAR (255)
SELECT @string = 'DBCC OPENTRAN(''Database_name'') WITH TABLERESULTS'
INSERT INTO OpenTran
(trantag, tranvalue)
EXEC (@string)
waitfor delay '0:00:30'
end

Note: In the select query we have to give the name of the database, of which the
log size was growing , instead of Database_name.

Query 3
------------

while (1=1)
begin
insert into trandetails
select
b.transaction_id,
b.session_id,
a.database_id,
a.database_transaction_begin_time,
a.database_transaction_log_bytes_used,
a.database_transaction_log_bytes_used_system,
a.database_transaction_log_bytes_reserved,
a.database_transaction_log_bytes_reserved_system,
a.database_transaction_log_record_count,
getdate() rdate
from sys.dm_tran_database_transactions a,sys.dm_tran_session_transactions b where
a.transaction_id=b.transaction_id
waitfor delay '0:00:30'
end

 

"select * from trandetails" will give you the transaction and session  which consumes T-Log (we can Sort it based on Log bytes used)

Do not miss to Kill the query 1,2 and 3 once you collected the data.

If possible Create a server side profiler trace with these events ERRORS and Warnings, RPC
Starting, RPC Completed, SP Starting, SP Completed, SP-SQL STMT Starting, SP-SQL
STMT Completed, TSQL-SQL STMT Starting, TSQL-SP SQL STMT Completed. 

Regards

Karthick PK