转自 http://topic.csdn.net/t/20040406/13/2931507.html

--压缩日志及数据库文件大小 

/*--特别注意 
请按步骤进行,未进行前面的步骤,请不要做后面的步骤 
否则可能损坏你的数据库. 
--*/ 

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) 

 

--下面是压缩处理的存储过程,你可以定期调用这个存储过程完成压缩日志的操作. 

use   master     --注意,此存储过程要建在master数据库中 
go 

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[p_compdb] ')   and   OBJECTPROPERTY(id,   N 'IsProcedure ')   =   1) 
drop   procedure   [dbo].[p_compdb] 
GO 

/*--压缩数据库的通用存储过程 

压缩日志及数据库文件大小 
因为要对数据库进行分离处理 
所以存储过程不能创建在被压缩的数据库中 

--邹建   2004.3--*/ 

/*--调用示例 
exec   p_compdb   'test ' 
--*/ 
create   proc   p_compdb 
@dbname   sysname, --要压缩的数据库名 
@bkdatabase   bit=1, --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库 
@bkfname   nvarchar(260)= ' ' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间 
as 
if   @bkdatabase=1 --确定是否备份数据库 
begin 
if   isnull(@bkfname, ' ')= ' '   
set   @bkfname=@dbname+ '_ '+convert(varchar,getdate(),112) 
+replace(convert(varchar,getdate(),108), ': ', ' ') 
select   提示信息= '备份数据库到SQL   默认备份目录,备份文件名: '+@bkfname 
exec( 'backup   database   [ '+@dbname+ ']   to   disk= ' ' '+@bkfname+ ' ' ' ') 
end 

--1.清空日志 
exec( 'DUMP   TRANSACTION   [ '+@dbname+ ']   WITH     NO_LOG ') 

--2.截断事务日志: 
exec( 'BACKUP   LOG   [ '+@dbname+ ']   WITH   NO_LOG ') 

--3.收缩数据库文件(如果不压缩,数据库的文件不会减小 
exec( 'DBCC   SHRINKDATABASE([ '+@dbname+ ']) ') 

--4.设置自动收缩 
exec( 'EXEC   sp_dboption   ' ' '+@dbname+ ' ' ', ' 'autoshrink ' ', ' 'TRUE ' ' ') 

/*--后面的步骤有一定危险,如果你无法确定它的危险性,请勿启用 
--5.分离数据库 

--进行分离处理 
create   table   #t(fname   nvarchar(260),type   int) 
exec( 'insert   into   #t   select   filename,type=status&0x40   from   [ '+@dbname+ ']..sysfiles ') 
exec( 'sp_detach_db   ' ' '+@dbname+ ' ' ' ') 

--删除日志文件 
declare   @fname   nvarchar(260),@s   varchar(8000) 
declare   tb   cursor   local   for   select   fname   from   #t   where   type=64 
open   tb   
fetch   next   from   tb   into   @fname 
while   @@fetch_status=0 
begin 
set   @s= 'del   " '+rtrim(@fname)+ ' " ' 
exec   master..xp_cmdshell   @s,no_output 
fetch   next   from   tb   into   @fname 
end 
close   tb 
deallocate   tb 

--附加数据库 
set   @s= ' ' 
declare   tb   cursor   local   for   select   fname   from   #t   where   type=0 
open   tb   
fetch   next   from   tb   into   @fname 
while   @@fetch_status=0 
begin 
set   @s=@s+ ', ' ' '+rtrim(@fname)+ ' ' ' ' 
fetch   next   from   tb   into   @fname 
end 
close   tb 
deallocate   tb 
exec( 'sp_attach_single_file_db   ' ' '+@dbname+ ' ' ' '+@s) 
--*/ 
go 

posted on 2011-11-04 11:01  花祭果凛  阅读(367)  评论(0编辑  收藏  举报