SQL 7 Can not truncate Transaction Log

  • but why ? setting to simple and then back to full acheives nothing other than forcing you to take another backup to start a new LSN chain.

    what does setting to simple mode do for you that can't be done by a checkpoint and backup log?

    MVDBA

  • I did not give a but why just a will work.

  • Here is the proc from Andrew Zanevsky.

     

    CREATE proc sp_force_shrink_log

    @target_percent tinyint = 0,

    @target_size_MB int = 10,

    @max_iterations int = 1000,

    @backup_log_opt nvarchar(1000) = 'with truncate_only'

    as

    set nocount on

    declare @db sysname,

    @last_row int,

    @log_size decimal(25,2),

    @unused1 decimal(25,2),

    @unused decimal(25,2),

    @shrinkable decimal(25,2),

    @iteration int,

    @file_max int,

    @file int,

    @fileid varchar(5)

    select @db = db_name(),

    @iteration = 0

    create table #loginfo(

    id int identity,

    FileId int,

    FileSize numeric(25,0),

    StartOffset numeric(25,0),

    FSeqNo int,

    Status int,

    Parity smallint,

    CreateLSN Varchar(50)

    )

    create table #logfiles ( id int identity(1,1), fileid varchar(5) not null )

    insert #logfiles ( fileid ) select convert( varchar, fileid ) from sysfiles

    where status & 0x40 = 0x40

    select @file_max = @@rowcount

    if object_id( 'table_to_force_shrink_log' ) is null

    exec( 'create table table_to_force_shrink_log ( x nchar(3000) not null )' )

    insert #loginfo ( FileId, FileSize, StartOffset, FSeqNo, Status, Parity,

    CreateLSN ) exec ( 'dbcc loginfo' )

    select @last_row = @@rowcount

    select @log_size = sum( FileSize ) / 1048576.00,

    @unused = sum( case when Status = 0 then FileSize else 0 end ) /

    1048576.00,

    @shrinkable = sum( case when id < @last_row - 1 and Status = 0 then

    FileSize else 0 end ) / 1048576.00

    from #loginfo

    select @unused1 = @unused -- save for later

    select 'iteration' = @iteration,

    'log size, MB' = @log_size,

    'unused log, MB' = @unused,

    'shrinkable log, MB' = @shrinkable,

    'shrinkable %' = convert( decimal(6,2), @shrinkable * 100 /

    @log_size )

    while @shrinkable * 100 / @log_size > @target_percent

    and @shrinkable > @target_size_MB

    and @iteration < @max_iterations begin

    select @iteration = @iteration + 1 -- this is just a precaution

    exec( 'insert table_to_force_shrink_log select name from sysobjects

    delete table_to_force_shrink_log')

    select @file = 0

    while @file < @file_max begin

    select @file = @file + 1

    select @fileid = fileid from #logfiles where id = @file

    exec( 'dbcc shrinkfile( ' + @fileid + ' )' )

    end

    exec( 'backup log ' + @db + ' ' + @backup_log_opt )

    truncate table #loginfo

    insert #loginfo ( FileId, FileSize, StartOffset, FSeqNo, Status, Parity,

    CreateLSN ) exec ( 'dbcc loginfo' )

    select @last_row = @@rowcount

    select @log_size = sum( FileSize ) / 1048576.00,

    @unused = sum( case when Status = 0 then FileSize else 0 end ) /

    1048576.00,

    @shrinkable = sum( case when id < @last_row - 1 and Status = 0 then

    FileSize else 0 end ) / 1048576.00

    from #loginfo

    select 'iteration' = @iteration,

    'log size, MB' = @log_size,

    'unused log, MB' = @unused,

    'shrinkable log, MB' = @shrinkable,

    'shrinkable %' = convert( decimal(6,2), @shrinkable * 100 /

    @log_size )

    end

    if @unused1 < @unused

    select 'After ' + convert( varchar, @iteration ) +

    ' iterations the unused portion of the log has grown from ' +

    convert( varchar, @unused1 ) + ' MB to ' +

    convert( varchar, @unused ) + ' MB.'

    union all

    select 'Since the remaining unused portion is larger than 10 MB,' where

    @unused

    > 10

    union all

    select 'you may try running this procedure again with a higher number of

    iterations.' where @unused > 10

    union all

    select 'Sometimes the log would not shrink to a size smaller than several

    Megabytes.' where @unused <= 10

    else

    select 'It took ' + convert( varchar, @iteration ) +

    ' iterations to shrink the unused portion of the log from ' +

    convert( varchar, @unused1 ) + ' MB to ' +

    convert( varchar, @unused ) + ' MB'

    exec( 'drop table table_to_force_shrink_log' )

     

     

    GO

    MohammedU
    Microsoft SQL Server MVP

Viewing 3 posts - 16 through 17 (of 17 total)

You must be logged in to reply to this topic. Login to reply