有什么方法可以减少/缩小tempdb.mdf的大小而无需重新启动SQL Server


15

是否有必要后重新启动SQL服务器DBCC SHRINKFILEtempdb.mdf或有任何其他方法,以减少大小tempdb.mdf,无需重新启动SQL服务器?

请为我的生产服务器提供帮助,我希望在不造成任何停机的情况下进行缩减。


2
DBCC SHRINKFILE不需要重新启动服务。
格雷格

您无法缩小tempdb的使用状态。是的,对此有一些解决方案,但是它不是很干净并且有一些副作用。
Ionic

Answers:


15

您可以这样进行:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

最后一步是最棘手的。在收缩过程中,不应使用tempdb进行任何其他操作,因为这可能会导致SHRINKFILE操作中止。由于tempdb非常容易收缩,因此不需要花费很长时间即可收缩它。

请注意,这类似于“软重启”。所有内容将从缓冲区中删除并写入光盘。这意味着对I / O子系统(写入)的影响,因为它必须处理所有写入操作。之后,您可以收缩文件(这会影响读写性能),最后,所有查询任何表的进程都需要将数据从I / O子系统检索回缓冲区。这可能会给重启带来更大的伤害。

如果您正在运行开发系统,则应该重新启动计算机,而不是采用这种方式。但是在某些没有故障转移伙伴的生产系统上,这可能很有用。


感谢Ionic提供了很好的解释。在我的情况下,tempdb.mdf为46 GB。如果没有正在进行的交易,那我可以缩小到100%。请提示。
Manii 2015年

是的40960MB只是一个例子。在我的系统上,tempdb的正常运行速度约为50GB,在极少数情况下会增长到200GB。:-)
Ionic

<pre>我以DBCC SHRINKFILE(tempdev,1024)的身份运行查询; </ b> </ b>它成功释放了空间,但再次以类似方式运行</ b> </ b> DBCC SHRINKFILE(tempdev,30000); </ b> </ b>结果如下:</ b> </ b> DbId字段当前大小使用的最小大小估计的页面</ b> 2 1 5699352 1024 696696 </ b> </ b>但由于未减少选中的tempdb大小。</ pre>
Manii,2015年

如果事务在收缩时使用tempdb,则可能会出现此消息。也可能是您定义的收缩大小(〜30GB)超出了tempdb的可用限制。
Ionic

1

您只能按照以下步骤进行

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

您的答案与上述答案有何不同?
Kin Shah

1
您好,Kindb,Tempdb文件大小将通过DBCC FREEPROCCACHE减小;然后收缩tempdb文件。对于收缩tempdb,我们不需要以下语句。DBCC DROPCLEANBUFFERS;DBCC FREESYSTEMCACHE('ALL'); DBCC FREESESSIONCACHE;
杰瑞

1
这是较简单的答案,在大多数情况下,只需要DBCC FREEPROCCACHE即可缩小tempdb。 看到相关问题
James Jenkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.