对表删除了大量数据,为什么数据库文件没减小?按理说至少要减少10G 对表删除了大量的数据,为什么数据库文件没减小?按理说至少要减少10G,我们这个表的数据有43G,为什么对里面的数据删除了1/3,为什么数据库文件没减少2次都是在缩收过数据库之后对比.是不是表空间还要单独释放什么的?怎么把这表数据空间减少? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 *--压缩数据库的通用存储过程 压缩日志及数据库文件大小 因为要对数据库进行分离处理 所以存储过程不能创建在被压缩的数据库中 --邹建 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 大家帮写一个自定义函数吧。谢谢了。 安装数据库的问题 100分求如下要求的存储过程 牛人指教 (表结构如下:) 这句话什么意思? 关于一个SELECT语句 sql server2000个人版安装后,vc编译的程序连接不上数据库 sql server 2005按位'非'运算 sql触发器 约束冲突 100分求解 报错:Database in use,The system administrator must have exclusive use of the database to run the restore operation 生成订单号 在win7下与SQL的版本的问题?
压缩日志及数据库文件大小
因为要对数据库进行分离处理
所以存储过程不能创建在被压缩的数据库中 --邹建 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