Redefinindo o tamanho do LOG no SQL Server
Redefinindo o tamanho do LOG no SQL Server
por Magico

Esta procedure é bem bacana de se ter catalogada no master do SqlServer 2000 para adequar o tamanho dos arquivos físicos de uma base de dados. Uma vez se que cria uma base, um arquivo de Log é criado em paralelo para fazer o papel de syslog de uma base. O problema é que ao recalcularmos o tamanho de uma base de dados (através de um shirink), o log continua crescendo, graças ao recurso do sql 2000 de auto-increment de tamanho de arquivo. Só que haja disco ! Neste caso, a procedure abaixo vai resolver seu problema. Primeiro, vamos criar a porra da procedure:

CREATE PROCEDURE ShrinkLog (@LogFileName varchar(200), @NewSize INT)
AS
SET NOCOUNT ON
DECLARE @MaxMinutes INT,
 @LogicalFileName sysname
SELECT @LogicalFileName = @LogFileName
-- 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

 

Agora pra executar, basta digitar o nome dela, passando como parametro o nome do arquivo físico de log e o tamanho que deverá ter este arquivo a partir de agora. Suponha que eu tenha uma base chamada XISPITA com o alias do log XISPITA_LOG e quero que seu tamanho seja de 80 MBytes:

ShrinkLog 'XISPITA_LOG',80

 

Fácil !