我有一个大小约为4GB的数据库。我复制了该数据库并删除了99%的数据,因为我需要一个只包含模式和基本数据的数据库(主要是静态数据)。
现在的问题是MDF文件的大小仍然是~4GB。如果我读取表格的大小(例如,使用this),它们总和不到20 MB。日志文件已经缩小,但我运行的脚本都没有用于缩小数据库文件。
注意:我通常不这样做,但这次我需要缩小数据库(我知道不推荐)
命令:
exec sp_spaceused
输出:
database_name database_size unallocated_space
AccudemiaEmptyDb 3648.38 MB 4.21 MB
命令:
select object_name(id) as objname, SUM(dpages*8) as dpages, COUNT(*) as cnt
from sysindexes
group by id
order by dpages desc
输出:
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
答案 0 :(得分:3)
首次运行
exec sp_spaceused
在数据库中检查你可以恢复多少。如果您发现它没有显示未使用的空间,那么您就误解了空间分配。
这就是我通常缩小test1
数据库的方式,这是我在所有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的评论转而回答:涉及的表是Service Broker对话。 http://social.msdn.microsoft.com/Forums/en/sqlservicebroker/thread/03180f45-cd83-4913-8f0e-3d8306f01f06该链接有解决方法。
还有另一种选择;使用已经减少的数据库
(从回忆中,SSSB队列不包含在生成数据脚本中)
答案 1 :(得分:2)
编辑:所以似乎空间仍在某处分配。您可以尝试此查询(基于sp_spaceused
)吗?
select OBJECT_NAME(p.object_id),
reservedpages = sum(a.total_pages),
usedpages = sum(a.used_pages),
pages = sum(
CASE
-- XML-Index and FT-Index internal tables are not considered "data", but is part of "index_size"
When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0
When a.type <> 1 Then a.used_pages
When p.index_id < 2 Then a.data_pages
Else 0
END
)
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
left join sys.internal_tables it on p.object_id = it.object_id
GROUP BY p.object_id
with rollup
答案 2 :(得分:2)
谢谢你们,主要是理查德所有的信息!
要解决此问题,我不得不放弃并重新创建我的服务:
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
谢谢你们!
答案 3 :(得分:0)
您可以使用DBCC命令收缩数据库。
的引用答案 4 :(得分:0)
如果复制数据库怎么办?右键单击数据库并执行任务“复制数据库”。只是一个可能很容易尝试的想法。