TempDB 不会收缩。没有未结交易

use*_*117 10 sql-server-2008 shrink tempdb

我在 SQL 2008 上有一个 TempDB,它变得非常大(> 40gb),我想缩小它。我已经通过 Management Studio 使用了 dbcc 收缩数据库、dbcc 收缩文件和收缩命令。

我收到以下错误:

页面 1:4573184 无法移动,因为它是工作表页面。

通过运行 DBCC FREEPROCCACHE 并重新运行其中一个收缩例程,我已经能够回收一​​些空间使我脱离危险,但显然这并不理想,而且可能只会给我争取一点时间。

我已经运行 DBCC OpenTran 并且没有任何东西挂在那里。

我在互联网上读到的所有地方都归结为回收 SQL Server ……肯定有更好的方法……有人吗?

谢谢,

汤姆

Aar*_*and 9

注意:这篇文章也可能有用:

TempDB mdf 文件的问题不断增加

除非您能弄清楚哪个进程正在使用该工作表(并且可以安全地杀死它),否则我必须同意您的搜索已经产生的结果:循环服务器,您应该能够缩小 tempdb。

另一个问题是为#temp 表解决这个问题;不知道能不能适应工作台:

查找哪个会话持有哪个临时表

我也写过关于它的博客(同样,对于#temp 表):

http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table

我怀疑工作表与快照隔离/版本存储有关,但以防万一:

查找填满版本存储的事务

另外,不要依赖DBCC OPENTRAN;- 我已经观察到很多情况,我知道我有一个活跃的交易,但它没有出现在那里。请注意,数据库上下文很重要;事务处于活动状态的数据库不一定是 tempdb。你在这里看到什么?任何事物?

SELECT * FROM sys.dm_tran_active_transactions
  WHERE name = N'worktable';
Run Code Online (Sandbox Code Playgroud)

一旦你缩小了 tempdb

当然,这不是永久的解决方案。您将缩小 tempdb,然后它会再次增长。每次玩这个游戏都会变得非常无聊和乏味。如果它会再次增长,在此期间您将如何处理这些可用空间?出租它然后在 tempdb 再次需要它时驱逐人们?您需要:

  1. 首先修复使 tempdb 变得异常大的过程。
  2. 为 tempdb 分配足够的空间,使其不需要增长,并停止缩小它(特别是如果只是暂时的;这只是浪费工作!)。

一些其他建议:

  • 不要使用SHRINKDATABASE(应该称为自动片段)或 UI。编写特定的、有针对性的SHRINKFILE命令来影响单个文件。
  • 考虑为 tempdb 使用多个文件(如果/如果可能,您可以将其分散到不同的存储),并考虑跟踪标志1117(只要此行为不会影响您的用户数据库)和 1118。
  • 这里有一些关于最小化 tempdb 利用率的提示: