前事不忘,后事之师,不忘国耻!

 立即注册  找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1390|回复: 0

【转帖】压缩数据库日志

[复制链接]

【转帖】压缩数据库日志

[复制链接]
ehxz

主题

0

回帖

3万

积分

管理员

积分
37090
2004-6-20 18:19:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

压缩日志及数据库文件大小
因为要对数据库进行分离处理
所以存储过程不能创建在被压缩的数据库中</P>
<>--邹建 2004.3--*/</P>
<>/*--调用示例
exec p_compdb 'test'
--*/</P>
<>use master  --注意,此存储过程要建在master数据库中
go</P>
<>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</P>
<>create proc p_compdb
@dbname sysname,   --要压缩的数据库名
@bkdatabase bit=1,   --因为分离日志的步骤中,可能会损坏数据库,所以你可以选择是否自动数据库
@bkfname nvarchar(260)='' --备份的文件名,如果不指定,自动备份到默认备份目录,备份文件名为:数据库名+日期时间
as
--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH  NO_LOG')</P>
<>--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')</P>
<>--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')</P>
<>--4.设置自动收缩
exec('EXEC sp_dboption '''+@dbname+''',''autoshrink'',''TRUE''')</P>
<>--后面的步骤有一定危险,你可以可以选择是否应该这些步骤
--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</P>
<P>--进行分离处理
create table #t(fname nvarchar(260),type int)
exec('insert into #t select filename,type=status&amp;0x40 from ['+@dbname+']..sysfiles')
exec('sp_detach_db '''+@dbname+'''')</P>
<P>--删除日志文件
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</P>
<P>--附加数据库
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
</P>
免责申明1、欢迎访问本站,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@fmlist.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|爱谁谁社区 ( 鲁ICP备14013101号-3 )

GMT+8, 2024-5-18 16:11 , Processed in 0.035394 second(s), 9 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表