我用MSSQL2005,有一个数据库(名为QT2007),有自动维护计划,每天要对数据库做完整备份,每四个小时作日志的备份。
现在每次备份日志都要备下来4G的数据。1、如何在每天的完整备份的时候自动截短日志。
2、如果手工截短日志。我对数据库十分不了解,烦劳回答问题的各位前辈说到详细些,小弟先谢了。解决任意一个问题就立即结分,肯定各位前辈多指点。多谢!

解决方案 »

  1.   

    清除日志: 
    DECLARE @LogicalFileName sysname,
            @MaxMinutes INT,
            @NewSize INT
    USE     szwzcheck             -- 要操作的数据库名
    SELECT  @LogicalFileName = 'szwzcheck_Log',  -- 日志文件名
    @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
            @NewSize = 20                  -- 你想设定的日志文件的大小(M)
    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size 
      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)
    DECLARE @Counter   INT,
            @StartTime DATETIME,
            @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
            @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time 
          AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = 
    @LogicalFileName)  
          AND (@OriginalSize * 8 /1024) > @NewSize  
      BEGIN -- Outer loop.
        SELECT @Counter = 0
        WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
          BEGIN -- update
            INSERT DummyTrans VALUES ('Fill Log')  
            DELETE DummyTrans
            SELECT @Counter = @Counter + 1
          END   
        EXEC (@TruncLog)  
      END   
    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
    SET NOCOUNT OFF
     
    把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。 
    有全角的空格(为了显示好看),你自己把他换一下. 
    收缩日志:企业管理器--所有任务--收缩数据库--文件--选日志文件收缩
      

  2.   

    --select * from sysfiles
    --1. 假設資料庫IEERP 資料檔iedata1(邏輯名稱), log檔ielog1(邏輯名稱)
     
    --2.執行下列指令(各步驟都設定資料庫為IEERP):
    dbcc shrinkfile(IEDB3_Log,notruncate)  
    dbcc shrinkfile(IEDB3_Log,truncateonly) 
    create table t1 (char1 char(4000))
      go
      declare @i
      int select @i = 0
      while (1 = 1)
      begin
        while (@i < 100)
        begin
          insert into t1 values ('a') select @i = @i +1
        end
        truncate table t1
        backup log ERPDB with truncate_only
      end
      go
     
     --此段程式為無權迴圈, 請視log大小 執行約數分鐘或數小時再stop(一般而
    --言,2~10分鐘應已足夠)
     
     dbcc shrinkfile(IEDB3_Log,truncateonly)
     
     drop table t1
     
     -- 3.查看log file size 應已Shrink成功        
      

  3.   

    缩小日志
    可以执行以下sql语句,:DUMP TRANSACTION 你的数据库名 WITH NO_LOG
    BACKUP LOG 你的数据库名 WITH NO_LOG
    DBCC SHRINKDATABASE(你的数据库名)
    EXEC sp_dboption '你的数据库名', 'autoshrink', 'TRUE' 
      

  4.   

    将日志文件缩小到自己想要的大小了。把代码COPY到查询分析器里,,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可(我已经用过多次了)
    -----
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
    @MaxMinutes INT,
    @NewSize INT
    USE Marias -- 要操作的数据库名
    SELECT @LogicalFileName = 'Marias_log', -- 日志文件名
    @MaxMinutes = 10, -- Limit on time allowed to wrap log.
    @NewSize = 100 -- 你想设定的日志文件的大小(M)-- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size 
    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)
    DECLARE @Counter INT,
    @StartTime DATETIME,
    @TruncLog VARCHAR(255)
    SELECT @StartTime = GETDATE(),
    @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'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) 
    AND (@OriginalSize * 8 /1024) > @NewSize 
    BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
    BEGIN -- update
    INSERT DummyTrans VALUES ('Fill Log') 
    DELETE DummyTrans
    SELECT @Counter = @Counter + 1
    END 
    EXEC (@TruncLog) 
    END 
    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
    SET NOCOUNT OFF 
      

  5.   

    每天的完整备份的时候会自动截短日志的,只是没有自动收缩日志文件而已
    在有维护计划的情况下,手工截短日志没有必要
    可以把数据库设置成“自动收缩”,或者手动一次收缩日志文件即可,具体用
    DBCC SHRINKFILE 命令