Sql server SQL Server数据库文件未被截断
我有一个大约4GB大小的数据库。我复制了那个数据库并删除了其中99%的数据,因为我需要一个只包含模式和基本数据的数据库,其中大部分是静态数据 现在的问题是MDF文件的大小仍然是~4GB。例如,如果我使用读取表的大小,它们的总和小于20MB。日志文件已经收缩,但我运行的脚本中没有一个用于收缩DB文件的脚本 注意:我通常不这样做,但这次我需要收缩数据库,我知道这是不推荐的 编辑:+有用信息 命令:Sql server SQL Server数据库文件未被截断,sql-server,sql-server-2008,shrink,Sql Server,Sql Server 2008,Shrink,我有一个大约4GB大小的数据库。我复制了那个数据库并删除了其中99%的数据,因为我需要一个只包含模式和基本数据的数据库,其中大部分是静态数据 现在的问题是MDF文件的大小仍然是~4GB。例如,如果我使用读取表的大小,它们的总和小于20MB。日志文件已经收缩,但我运行的脚本中没有一个用于收缩DB文件的脚本 注意:我通常不这样做,但这次我需要收缩数据库,我知道这是不推荐的 编辑:+有用信息 命令: exec sp_spaceused select object_name(id) as objnam
exec sp_spaceused
select object_name(id) as objname, SUM(dpages*8) as dpages, COUNT(*) as cnt
from sysindexes
group by id
order by dpages desc
输出:
database_name database_size unallocated_space
AccudemiaEmptyDb 3648.38 MB 4.21 MB
object_name(id) sum(dpages*8) count(*)
sysdercv 675328 1
sysxmitqueue 359776 1
sysdesend 72216 1
sysconvgroup 47704 1
sysobjvalues 4760 5
sec_OperationAccessRule 3472 5
sec_PageAccessRule 2232 5
syscolpars 656 11
AuditObjects 624 2
sysmultiobjrefs 408 5
HelpPage 376 8
sysschobjs 352 9
syssoftobjrefs 328 7
sysidxstats 272 10
sysrscols 200 1
Translation 160 3
sysallocunits 128 3
sysiscols 128 8
syssingleobjrefs 96 5
sysrowsets 80 4
命令:
exec sp_spaceused
select object_name(id) as objname, SUM(dpages*8) as dpages, COUNT(*) as cnt
from sysindexes
group by id
order by dpages desc
输出:
database_name database_size unallocated_space
AccudemiaEmptyDb 3648.38 MB 4.21 MB
object_name(id) sum(dpages*8) count(*)
sysdercv 675328 1
sysxmitqueue 359776 1
sysdesend 72216 1
sysconvgroup 47704 1
sysobjvalues 4760 5
sec_OperationAccessRule 3472 5
sec_PageAccessRule 2232 5
syscolpars 656 11
AuditObjects 624 2
sysmultiobjrefs 408 5
HelpPage 376 8
sysschobjs 352 9
syssoftobjrefs 328 7
sysidxstats 272 10
sysrscols 200 1
Translation 160 3
sysallocunits 128 3
sysiscols 128 8
syssingleobjrefs 96 5
sysrowsets 80 4
可以使用DBCC命令来收缩数据库
这是对和编辑的引用:因此,空间似乎仍然分配在某个地方。您可以基于sp_spaceused尝试此查询吗 首轮
exec sp_spaceused
在数据库中检查可以恢复多少。如果您发现它没有显示未使用的空间,那么您误解了空间分配
这就是我通常收缩test1db的方式,在这里我打开了所有StackOverflow查询。我刚把它从3GB削减到8MB
use test1;
exec sp_spaceused;
checkpoint;
alter database test1 set recovery simple;
alter database test1 set recovery full;
dbcc shrinkfile(1,1);
dbcc shrinkfile(2,1);
值得一提的是,这是我用来按表检查分配大小的方法。也许你查错了?这包括索引
select object_name(id), SUM(dpages*8), COUNT(*)
from sysindexes
group by id
编辑-基于占用被编辑空间的表格
Martin的评论转而回答:涉及的表是ServiceBroker对话。该链接有一个变通方法
还有一种选择;使用已经缩减的数据库
生成脚本-所有对象-包括所有选项键、全文、默认值等
包括脚本数据的选项
创建一个新的数据库并从脚本中填充它
回想起来,SSSB队列不包括在生成数据脚本中如果复制数据库怎么办?右键单击数据库并执行任务,复制数据库。只是一个很容易尝试的想法 谢谢大家,主要是Richard提供的所有信息 要解决此问题,我必须删除并重新创建我的服务:
DROP SERVICE [//Audit/DataWriter]
GO
CREATE SERVICE [//Audit/DataWriter]
AUTHORIZATION dbo
ON QUEUE dbo.TargetAuditQueue ([//Audit/Contract])
一旦我这么做了,数据库就是5GB!但这次我在问题中提出的第二个查询显示,sysxmitqueue是第一个结果。
在互联网上再挖一点,我就可以清理大桌子了:
ALTER DATABASE [your_database] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [your_database] SET NEW_BROKER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [your_database] SET MULTI_USER
GO
然后,运行DBCC SHRINKFILE,仅此而已!!=现在只有40MB
谢谢你们 我在互联网上找到的所有解决方案。。。DBCC SHRINKDATABASE,更改为RECOVERY SIMPLE,然后是DBCC,所有表上的DBCC DBREINDEX,碎片整理索引和更新统计信息,然后是DBCC,备份/恢复,分离/附加,DBCC CLEANTABLE,以及其他脚本…确定。它说数据库大小=3.6GB,未分配=8MB如何找到空间的使用位置?原始问题中提到的脚本表示表的大小只有~20MB。@Diego您检查过这个答案中的最后一个查询了吗?好的,很酷!前5行是sysdercv、sysxmitqueue、sysdesend、sysconvgroup、sysobjvalues。这是什么意思?如何从那里清空空间?谢谢@迭戈-请使用1 sp_spaceused 2的输出编辑问题此回答中的最后一个查询看起来像是服务代理问题,Remus Rusanu检查底部的“不是答案”注释@Richard-是的,只是在探查器中查看。该查询返回的值与DBCC FILEHEADER“AdventureWorks2008”1中作为MinSize返回的值不同;因此仍然不确定DBCC SHRINKDATABASEOK会将其中哪一个视为最小大小。具有更多保留空间的对象为NULL:,在sysxmitqueue、sysdercv、sysdesend等之后…@Diego-带有NULL的大行只是‘因为我添加了一个汇总以获得总计’。