--压缩日志及数据库文件大小/*--特别注意 请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/--下面的所有库名都指你要处理的数据库的库名1.清空日志
DUMP  TRANSACTION  库名  WITH  NO_LOG    2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)

--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库 b.在我的电脑中删除LOG文件 c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库 此法将生成新的LOG,大小只有500多K 或用代码: 
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

a.分离
EXEC sp_detach_db @dbname = '库名' b.删除日志文件

c.再附加
EXEC sp_attach_single_file_db @dbname = '库名', 
   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf'5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"

--SQL语句设置方式:
EXEC sp_dboption '库名', 'autoshrink', 'TRUE' 6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小) --SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)

解决方案 »

  1.   

    delete操作是要写日志的,这就是你数据库从6g增加到9g的原因,怎样执行DELETE而使数据库不增加呢?这个在sql server是办不到的,只有在delete操作执行完以后收缩日志
      

  2.   

    补充!
    这个数据库由8个文件和一个日志文件组成
    DELETE后 日志文件未增加多少,那8个文件增加了3G,如上收缩时基本缩不掉多少
    怎么办啊
    请教
      

  3.   

    backup log 库名 with truncate_only
    dbcc shrinkfile(日志逻辑文件名,100)
      

  4.   

    按我说的步骤去做的吗? 不按步骤可能会收缩不了另外,你可以在查询分析器中用下面的语句查询数据所占的空间use 库名
    exec sp_spaceused 
      

  5.   

    改数据库的恢复模式为“简单”,再用dbcc shrinkdatabase(your database).
      

  6.   

    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS OFF 
    GO
    create  PROCEDURE strink_logspace
     AS
       SET NOCOUNT ON
       DECLARE @LogicalFileName sysname,
               @MaxMinutes INT,
               @NewSize INT   SELECT  @LogicalFileName = rtrim(name),
               @MaxMinutes = 10,      -- 最大执行时间
               @NewSize    = 10       -- 最小空间
       from sysfiles where status & 0x40 = 0x40   -- Setup / initialize
       DECLARE @OriginalSize int
       SELECT @OriginalSize = size -- in 8K pages
         FROM sysfiles
         WHERE name = @LogicalFileName   SELECT db_name() +'日志原始大小' +  
               CONVERT(VARCHAR(30),@OriginalSize) + ' pages/ 8K 或 ' + 
               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   DBCC SHRINKFILE (@LogicalFileName, @NewSize)   SELECT db_name() +'日志最后大小' + 
               CONVERT(VARCHAR(30),size) + ' pages/ 8K 或  ' + 
               CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
         FROM sysfiles 
         WHERE name = @LogicalFileName
       DROP TABLE DummyTrans
       PRINT '*** 数据库日志压缩成功 ***'
       SET NOCOUNT OFFGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO---执行    exec strink_logspace
      

  7.   

    使用trancate table tablename删除