TempDB不会收缩。没有公开交易


9

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

我收到以下错误:

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

我已经能够通过运行DBCC FREEPROCCACHE并重新运行其中一个收缩例程来回收一些空间,使我摆脱危险,但是显然这不是理想的选择,可能只会给我带来一点时间。

我已经运行过DBCC OpenTran,那里没有东西挂。

我在Internet上阅读的所有内容都归结为回收SQL Server ...肯定有更好的方法...有人吗?

谢谢,

汤姆

Answers:


7

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

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';

一旦缩小了tempdb

当然,这不是永久性的解决方案。您将收缩tempdb,然后它将再次增长。每当发生此游戏时,这可能会变得非常无聊且乏味。如果它再次增长,那么与此同时,您将如何处理这些空闲空间?租出它,然后在tempdb再次需要它时将其逐出?您需要:

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

其他一些建议:

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

1
SELECT * FROM sys.dm_tran_active_transactions WHERE name = N'worktable'; 从同一日期(14年7月10日)返回6行。transaction_id是否代表SPID?
user45117 2014年

不,transaction_id不是SPID。如果事务确实处于活动状态(它们不是系统事务),则应该能够与sys.dm_tran_session_transactions中的session_id匹配。无论如何,您确定这是从DBCC SHRINKFILE得到的消息吗?那ALTER DATABASE ...修改文件呢?同样,我不确定我是否理解为什么清除过程高速缓存会使您摆脱麻烦;过程高速缓存在内存中,而不是在tempdb中...
Aaron Bertrand

该消息来自DBCC SHRINKDATABASE。我还没有尝试过ALTER DATABASE ... MODIFY FILE ...那将是下一个。清除过程高速缓存可使tempdb缩减约10%,并为我提供了4gb的驱动器空间。我无法将那些来自sys.dm_tran_active_transactions的transaction_id链接到sys.dm_tran_session_transactions中的任何内容
user45117 2014年

1
我认为清除过程高速缓存与“允许” tempdb收缩的关系不如您想像的多。巧合一直发生。
亚伦·伯特兰

0

我在Internet上阅读的所有内容都归结为回收SQL Server ...肯定有更好的方法...有人吗?

不,这是一个临时解决方案。我猜您曾发布过相同的问题,然后才能告诉您SQL Server实例中数据库的总大小是多少。tempdb的大小取决于您的查询使用了多少。除非您使用它,否则它不能自行生长。Aron共享的链接会有所帮助,但是如果查询大量使用temdbb或可能是环境的默认要求,则需要调整查询。我见过很少的环境。其中200 G的tempdb是可以接受的,因为查询需要那么多的tempdb空间。

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.