sar*_*rnu 7 sql-server filegroups sql-server-2008-r2
我想删除 SQL Server 数据库中一些未使用的文件组/文件,但由于 SQL Server 认为文件组/文件仍在使用中而被卡住。
一些背景:
我像这样查询未使用的文件组的 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)我知道如果某个分区方案中引用了某个文件组,则无法删除该文件组。
但这不是这里的原因,因为我删除了数据库中的所有分区方案/功能。
任何提示我可以做些什么来摆脱文件组?
您可能仍有一些 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 移动数据,也可以通过直接插入新表并在之后重命名(或通过移动您拥有的数据的任何其他首选方法)来移动数据。确保在创建新表时为行和文本数据指定正确的文件组。
小智 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)
瞧!有效!
不客气大家。
归档时间: |
|
查看次数: |
25846 次 |
最近记录: |