Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server数据库文件未被截断_Sql Server_Sql Server 2008_Shrink - Fatal编程技术网

Sql server SQL Server数据库文件未被截断

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

我有一个大约4GB大小的数据库。我复制了那个数据库并删除了其中99%的数据,因为我需要一个只包含模式和基本数据的数据库,其中大部分是静态数据

现在的问题是MDF文件的大小仍然是~4GB。例如,如果我使用读取表的大小,它们的总和小于20MB。日志文件已经收缩,但我运行的脚本中没有一个用于收缩DB文件的脚本

注意:我通常不这样做,但这次我需要收缩数据库,我知道这是不推荐的

编辑:+有用信息 命令:

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的大行只是‘因为我添加了一个汇总以获得总计’。