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

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


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

-- 邹建 2004.03(引用请保留此信息)--*/

/* --调用示例
exec p_compdb 'test '
--
*/

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

create proc p_compdb
@dbname sysname, -- 要压缩的数据库名
@bkdatabase bit = 1 , -- 因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库
@bkfname nvarchar ( 260 ) = ' ' -- 备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间
as
-- 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.分离数据库
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

-- 进行分离处理
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


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

也可在企业管理里收缩日志:
-- 收缩数据库
dbcc shrinkdatabase( ' 数据库名 ' , 0 ,notruncate)
DUMP TRANSACTION [ 库名 ] WITH NO_LOG
下例将 UserDB 用户数据库中名为 DataFil1 的文件收缩到
7 MB。

USE UserDB
GO
DBCC SHRINKFILE (DataFil1, 7 )


下例将 UserDB 用户数据库中的文件减小,以使 UserDB 中的文件有
10 % 的可用空间。

DBCC SHRINKDATABASE (UserDB, 10 )
GO
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值