我无法删除文件组。我收到标准错误:“无法删除文件组 '~~~~',因为它不为空。” 我一直在网上搜索,但仍然找不到答案。服务器版本为 Microsoft SQL Server 2019。
我已经非常彻底地经历了这两个:
我扫描的内容以查看是否与文件组有任何关联:
- 文件 : 0
- 分配单位:0
- 指数:0
- 分区方案:0
- 分区函数:0
- 分区:0
我还运行了 DBCC CHECKFILEGROUP,它也没有显示任何内容。我真的很困惑。有人可以帮我弄清楚还有什么可能阻止我删除这个文件组吗?
完全公开,我正在使用我写的模块:
https://github.com/tcartwright/tcdbtools/blob/main/docs/Invoke-DBSafeShrink.md
该模块执行以下步骤:
- 创建一个临时文件和文件组
- 将聚簇索引、非聚簇索引、LOBS 和堆移动到新文件组
- 缩小原始文件组
- 将所有原始对象移回原始文件组
- 删除临时文件组
作为移动 LOB 的一部分,我使用 Kimberly Tripp 的这个技巧来移动它们:https ://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/
编辑:我想我已经弄清楚是什么阻碍了下降,但我不知道如何解决它。这个查询:
SELECT * FROM sys.[tables] AS [t] WHERE [t].[lob_data_space_id] IN (
SELECT [ds].[data_space_id] FROM sys.[data_spaces] AS [ds] WHERE [ds].[name] <> 'PRIMARY'
)
返回一个表,该表在分配单元中没有任何关联的 LOB 数据。我也不知道如何摆脱它。我有:
- 删除并重新创建此表的 PK
- 重建表上的所有索引并
这些都没有帮助。
我认为该文件组中肯定有一个对象,因此,您可能首先想知道它是什么, 此脚本可能会有所帮助
在更改位置或丢弃这些对象之后,您将丢弃 FG
好的,我终于想通了。在开始修复之前,让我对我认为可能发生的事情进行推理。我正在使用分区技巧将 LOB 数据从一个 FG 移动到另一个。结合移动过程中使用CREATE INDEX (DROP_EXISTING = ON)的部分导致索引重建这一事实。
我认为当索引在新 FG 上重建时,可能所有 LOB 数据都移动到行中,消除了 LOB_DATA 分配单元。但是,移动后 lob_dataspace_id 仍设置为新的 FG。导致我无法删除它。
当代码将其移回时,它没有看到分配任何 LOB_DATA,也没有使用分区技巧将索引移回。
为了解决这个问题,我需要使用相同的分区技巧将索引移回 PRIMARY。
我修改了代码以同时检查表 lob_dataspace_id 以确定我要移动到的 FG 是否不同。然后它将利用分区技巧将索引移回,并导致 lob_dataspace_id 重置。
一旦我使用分区技巧将索引来回移动到 PRIMARY,我就能够成功删除文件组。