/*------特别注意------*/ 

 执行以下操作前,请您勿必要备份一下数据库,否则发生什么不可预计的损失后悔也来不及了 

 请按步骤进行,未进行前面的步骤,请不要做后面的步骤,否则可能损坏你的数据库. 

 一般不建议做第4,6两步 

 第4步不安全,有可能损坏数据库或丢失数据 

 第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复. 

 /*----------------------*/ 



 1.清空日志 

 DUMP   TRANSACTION   库名   WITH   NO_LOG 



 2.截断事务日志: 

 BACKUP LOG 数据库名 WITH NO_LOG 

 3.收缩数据库文件(如果不压缩,数据库的文件不会减小 

     企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 

 --选择日志文件--在收缩方式里选择收缩至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 = 'pubs' 

 b.删除日志文件 

 c.再附加 

 EXEC sp_attach_single_file_db @dbname = 'pubs',  

     @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf' 

 5.为了以后能自动收缩,做如下设置: 

 企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" 

 --SQL语句设置方式: 

 EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE' 

 6.如果想以后不让它日志增长得太大 

 企业管理器--服务器--右键数据库--属性--事务日志 

 --将文件增长限制为xM(x是你允许的最大数据文件大小) 

 --SQL语句的设置方式: 

 alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) 

 ----------------------------------------------------------------------------------------------------------------- 

 另外提供一种更简单的方法,本人屡试不爽,建议大家使用。 

 更简单的方法: 

    1。右建数据库属性窗口--故障还原模型--设为简单 

    2。右建数据库所有任务--收缩数据库 

    3。右建数据库属性窗口--故障还原模型--设为大容量日志记录 

 ----------------------------------------------------------------------------------------------------------------- 

 可以采用这个存储过程截断日志文件  

 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 OFF  

 GO