Ada*_*amL 10 sql-server data-pages dbcc sql-server-2008-r2 datafile
我为 .ndf 创建了太多辅助数据文件 (.ndf) tempdb
。要删除多余的文件,我需要清空文件(内容将移动到其他文件):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
Run Code Online (Sandbox Code Playgroud)
然后删除文件:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Run Code Online (Sandbox Code Playgroud)
但是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.
Run Code Online (Sandbox Code Playgroud)
不用担心,我只需要找到使用此页面的对象即可:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
Run Code Online (Sandbox Code Playgroud)
该命令返回了很多信息,其中的object_id。但:
Metadata: ObjectId = 0
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办。什么猫阻止了这个页面被移动?如何定位该对象、进程、会话或其他任何内容?任何帮助将不胜感激,但请注意保持原样或删除其他文件不是解决此问题的有效方法;)。
编辑:
我正在删除这些文件,因为我们曾经遵循“最佳实践”,即为每个处理器内核创建一个文件(相同的初始大小,相同的增长率)。但据我所知,在遇到争用问题之前,没有必要在同一设备上创建额外的 tempdb 文件。在我们的例子中,这是有道理的,因为我们打开了MPIO,并且存储设备可以处理 4 个路径。但是有一个错误,我们最终得到了 5 个 6 核 cpu 的文件。它比 MPIO 路径多,比 CPU 内核少,而且不是偶数。它可能不会导致任何问题,但似乎不正确:)。
通过将数据库之一(我怀疑会导致问题)设置为单用户模式(立即回滚),我终于能够在不重新启动服务器的情况下清空和删除文件。它奏效了,但我很幸运。我真正想要的是始终能够跟踪页面:)。
重新启动服务器应该足够了 - 那些工作表应该清除。但我可能会在单用户模式 (-m) 下启动它,以防止其他进程在成功删除这些文件之前创建工作表。然后重新定义所需的文件tempdb
;也许删除不必要的文件,更改大小等。您还应该确保您拥有偶数个文件,它们都设置为相同的大小,并且它们都具有相同的自动增长设置(以 MB 为单位,而不是 %)。现在可能也是考虑 TF 1117 和 TF 1118(起点)的好时机。
对于在再次启动 SQL Server 之前仅从文件系统中删除文件的建议,我非常谨慎 - 它可能根本无法启动。
(不过,我也很好奇实际问题是什么。拥有太多文件并不会伤害您,真的。)