Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations derfloh on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Shrinking Transaction LOG

Status
Not open for further replies.

jkb3

Programmer
Joined
Jan 5, 2001
Messages
9
Location
US
This here is for everyone who has ever needed to shrink that transaction log and couldn't. This script shrank a 3 gig transaction log to 600 MB in about a minute and a half.

Supposedly this was found on MSDN, but I have never been able to find much of any value on MSDN without bleeding from my eyes first.

--sp_helpfile
--USE THIS TO FIND THE NAME OF YOUR LOGICAL
--FILENAMES

SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT

-- *** MAKE SURE TO CHANGE THE NEXT 3 LINES WITH YOUR
----CRITERIA. ***
USE Migrated
-- This is the name of the database for which the log will
-- be shrunk.
SELECT @LogicalFileName = 'Migrated_Log',
-- Use sp_helpfile to identify the logical file name that
-- you want to shrink.
@MaxMinutes = 10,
-- Limit on time allowed to wrap log.
@NewSize = 600
-- in MB
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
-- in 8K pages
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)


-- Wrap log and truncate it.
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
-- Try an initial shrink.
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE())
-- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
-- the log has not shrunk
AND (@OriginalSize * 8 /1024) > @NewSize
-- The value passed in for new size is smaller than the
--current size.
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
-- Because it is a char field it inserts 8000 bytes.
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END -- update
EXEC (@TruncLog)
-- See if a trunc of the log shrinks it.
END -- outer loop
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
PRINT '*** Perform a full database backup ***'
SET NOCOUNT OFF
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top