Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 数据库占用的空间比表的总和还要多_Sql_Sql Server - Fatal编程技术网

Sql 数据库占用的空间比表的总和还要多

Sql 数据库占用的空间比表的总和还要多,sql,sql-server,Sql,Sql Server,我有一个数据库占用了近7个Gig。如果我看一下桌子的使用量,应该比这个少很多,比如40兆。昨天我删除了一个很大的日志表,但我的数据库仍然显示它非常大 以下是统计数据: database_name database_size unallocated space Umbraco_Indoorpower 6911.56 MB 859.59 MB reserved data index_size unused 31144 KB 26272 KB 3240 KB 16

我有一个数据库占用了近7个Gig。如果我看一下桌子的使用量,应该比这个少很多,比如40兆。昨天我删除了一个很大的日志表,但我的数据库仍然显示它非常大

以下是统计数据:

database_name   database_size   unallocated space
Umbraco_Indoorpower 6911.56 MB  859.59 MB

reserved    data    index_size  unused
31144 KB    26272 KB    3240 KB 1632 KB
我运行了以下命令:

DBCC SHRINKDATABASE (umbraco_indoorpower, 99);
这使我的数据库降到了2.3千兆。不过还是太大了

database_name   database_size   unallocated space
Umbraco_Indoorpower 2302.44 MB  1.63 MB

reserved    data    index_size  unused
30016 KB    26200 KB    3240 KB 576 KB
我猜我没有从昨天删除的日志表中释放出所有空间。我实际运行了
从tblLog中删除
。也许这是错误的做法


有人知道如何释放更多空间吗?

日志文件有多大?您的恢复模式是什么?上面的
数据库大小
数字很可能是近7GB的日志和很少的数据。查找硬盘上的文件-您可以使用以下方法查找路径:

EXEC umbraco_indoorpower..sp_helpfile;
我敢打赌LDF是巨大的,而MDF实际上很小。在这种情况下,您可能处于完全恢复模式,并且从未进行过日志备份。如果这是真的,则可以执行以下操作:

USE umbraco_indoorpower;
GO
BACKUP LOG umbraco_indoorpower TO DISK = 'C:\some_path\umbraco.trn';
GO
DBCC SHRINKFILE(umbraco_indoorpower_log, 20); -- guessing on target MB size here
(如果您使用的是简单恢复模型,则上述操作将失败,但会有一些其他解释说明为什么日志文件很大—例如,长时间运行或未提交的事务,您的删除提交了吗?)

然后,您需要(a)设置适当的维护,包括完整/差异/日志备份,这将有助于优化日志文件的重用;或者(b)切换到简单恢复,在这种情况下,日志将自行管理

在大多数情况下,在发生灾难时,简单恢复并不能提供足够的保护,但这由您自己决定

同时,您可以随心所欲地收缩文件,但如果您保持恢复模型和事务处理方式不变,您将看到文件再次增长,明天您将返回运行shrink命令。这对你的文件来说是绝对可怕的。这就是为什么我反对像“运行收缩手术”这样的答案。我在这里谈论原因:

在任何情况下,您都有数据和日志,要缩小日志,您必须进行备份


编辑:一切

现有答案已经相当不错了。我还有一个额外的解决方案:为包含数据的数据库编写脚本(SSMS UI允许您轻松地执行此操作),并在新的数据库中执行脚本


您可能也希望切换到简单日志模型(如果您没有使用完整日志模型的特殊需要)。有一件事是肯定的:您不能在完全模式下运行,也不能进行适当的事务日志管理。

另一件会在SQL Server中占用更多空间的事情是Service Broker队列。在我的例子中,队列中有600万行,占用17GB

@DOK不,我不认为这是因为索引。你看过上面的输出了吗?@Aaron Bertrand:我想你是对的。我在考虑索引可能(希望暂时)占用大量磁盘空间的情况。虽然我同意有时在大数据更改后移动到新数据库更简单,但我不确定simple“可能”是更好的选择。就我个人而言,我认为保持完整状态并添加适当的事务日志管理要安全得多。YMMV。虽然暂时切换到simple并返回到full可能有助于简化现有日志的转储。我建议使用simple模式,因为OP现在似乎没有tlog管理。他当然可以实现这样的事情,但也许他不需要或不想投入时间。明白,我只是不认为使用simple的一般建议对所有读者都是正确的(记住,你给出的答案不仅仅是OP)。我认为你是对的,编辑我的答案是为了更普遍地适用。