无法删除未使用的文件组

sar*_*rnu 7 sql-server filegroups sql-server-2008-r2

我想删除 SQL Server 数据库中一些未使用的文件组/文件,但由于 SQL Server 认为文件组/文件仍在使用中而被卡住。

一些背景:

  • 我们有一些分区表,我们将它们转换回非分区表
  • 删除了所有分区函数和 -schemes
  • 我像这样查询未使用的文件组的 dm 视图:

    SELECT 
    *
    FROM sys.filegroups fg
    LEFT OUTER JOIN 
    sysfilegroups sfg
    ON fg.name = sfg.groupname
    LEFT OUTER JOIN 
    sysfiles f
    ON sfg.groupid = f.groupid
    LEFT OUTER JOIN 
    sys.indexes i
    ON fg.data_space_id = i.data_space_id
    WHERE i.object_id IS NULL
    
    Run Code Online (Sandbox Code Playgroud)

    这为我提供了我试图从数据库中删除的文件组/文件列表。但其中一些无法删除。示例错误消息:

    The filegroup 'FG_XXXX' cannot be removed because it is not empty.
    
    Run Code Online (Sandbox Code Playgroud)
  • 我无法通过sys.data_spaces和连接到这些文件组的表/索引sys.indexes

    SELECT * FROM  sys.data_spaces ds
    INNER JOIN sys.indexes i
    ON ds.data_space_id = i.data_space_id
    WHERE ds.name = 'FG_XXXX'
    
    Run Code Online (Sandbox Code Playgroud)
  • 我知道如果某个分区方案中引用了某个文件组,则无法删除该文件组。
    但这不是这里的原因,因为我删除了数据库中的所有分区方案/功能。

任何提示我可以做些什么来摆脱文件组?

db2*_*db2 8

您可能仍有一些 LOB 数据(text/image/varchar(max)/nvarchar(max))位于文件组中。不久前,我短暂地被这个问题吸引住了。在不同的文件组/分区上重建表/索引不会移动任何 LOB 数据。

SELECT
    au.*,
    ds.name AS [data_space_name],
    ds.type AS [data_space_type],
    p.rows,
    o.name AS [object_name]
FROM sys.allocation_units au
    INNER JOIN sys.data_spaces ds
        ON au.data_space_id = ds.data_space_id
    INNER JOIN sys.partitions p
        ON au.container_id = p.partition_id
    INNER JOIN sys.objects o
        ON p.object_id = o.object_id
WHERE au.type_desc = 'LOB_DATA'
Run Code Online (Sandbox Code Playgroud)

如果确实发生了这种情况,那么移动 LOB 数据的最简单方法是重新创建表。您可以使用 bcp out/in 移动数据,也可以通过直接插入新表并在之后重命名(或通过移动您拥有的数据的任何其他首选方法)来移动数据。确保在创建新表时为行和文本数据指定正确的文件组。

  • 感谢您的回答,但相应的文件组中没有 LOB 数据。此外,指向文件组的表/分区方案被删除。 (2认同)

小智 4

实际上,我找到了解决此问题的简单解决方案,因为我遇到了同样的问题。

我试图删除文件组[fg_LMeterDetail_13],但收到“无法删除,因为它不为空”错误。该文件组的唯一缺陷是与分区方案相关联。该文件组没有数据。

因此,在发现 没有相反的内容后NEXT USED,我进行了实验,发现您可以发出另一个命令NEXT USED,但将其指向上一个文件组:

ALTER PARTITION SCHEME ps_LMeterDetail
NEXT USED [fg_LMeterDetail_12]
Run Code Online (Sandbox Code Playgroud)

之后,我能够发出REMOVE FILEGROUP然后自动将其从分区方案中删除

ALTER DATABASE [WACOE] 
REMOVE FILEGROUP [fg_LMeterDetail_13]
Run Code Online (Sandbox Code Playgroud)

瞧!有效!

不客气大家。