我为创建了太多辅助数据文件(.ndf)tempdb
。要删除多余的文件,我需要清空文件(内容将移至其他文件):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
然后删除文件:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
但是EMPTYFILE
命令返回错误:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
不用担心,我只需要找到正在使用此页面的对象即可对此进行操作:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
该命令返回很多信息,其中包括object_id。但:
Metadata: ObjectId = 0
我不知道该怎么办。是什么猫阻止了此页面的移动?如何找到该对象,过程,会话或其任何内容?任何帮助将不胜感激,但请注意,将所有内容保留不变或删除其他文件不是解决此问题的有效方法;)。
编辑:
我要删除文件,因为我们过去一直遵循“最佳实践”,即为每个处理器核心创建一个文件(相同的初始大小,相同的增长率)。但是据我所知,除非遇到争用问题,否则没有必要在同一设备上创建其他tempdb文件。在我们看来,这是有道理的,因为我们已打开MPIO,并且存储设备可以处理4条路径。但是有一个错误,我们最终使用6核cpu总共生成了5个文件。它比MPIO路径多,比CPU内核少,而且不是偶数。它可能不会引起任何问题,但似乎并不正确:)。
通过将其中一个数据库(我怀疑是造成问题的数据库)设置为单用户模式(立即回滚),我终于能够清空并删除文件而无需重新启动服务器。它有效,但我很幸运。我真正想要的是始终能够跟踪页面:)。
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
关于您的解决方案:它可以工作,但我真的很想在不降低实例性能的情况下执行此操作。