我在尝试将数据迁移出文件组以清空并删除文件组时遇到问题。我已将使用文件组的所有索引/表和所有分区方案移动到新文件组,但我无法从旧文件组中删除最后一个文件。我得到的错误是文件不为空。
我尝试了 EMPTYFILE 技巧,但这不起作用,因为它说文件中仍有数据,这似乎是真的,因为查询 sys.allocation_units 显示文件中仍有大约 30 MB 的数据。查询索引、分区、对象和其他 DMV 不会报告任何仍在使用此文件组作为数据空间的内容。
还有哪些其他 DMV/DMF 可以向我展示文件中留下的数据实际上是什么?
SQL Server 2016 企业版
所以我永远无法确定为什么分配的页面无法使用 sys.allocation_units 链接到底层对象,但是,我最终能够使用来自 Paul Randal和 DBCC PAGE 的脚本的修改版本来识别对象。
首先,运行这个脚本(它基于 Paul Randal 的 sp_AllocationMetadata 但修改为基于文件组名称而不是对象名称进行过滤):
输出给了我一个分配单元列表和相关的页面标识符:
然后可以对照DBCC PAGE检查这些结果以识别底层对象:
这会输出一些元数据,特别是表示
Metadata: ObjectId = <object id>
. 此对象 ID 引用与此数据页相关的对象。就我而言,我有大约 300 个分配单元需要处理。相关部分是所识别的对象是建立在分区方案上的,这些分区方案从未将相关文件组引用为目标数据空间,但不知何故,数据最终分配到了这些文件中。在任何情况下,重建索引都会从相关文件组中释放页面,并且可以删除文件和文件组。