从数据库中删除文件组和文件

问题描述 投票:0回答:5

这是我的数据库结构:

  • 4 个文件组:PRIMARY、FileGroup201708、FileGroup201709、FileGroup201710
  • 4个文件:File1.mdf、File201708.ndf、File201709.ndf、File201710.ndf

这是分区方案和功能:

CREATE PARTITION FUNCTION [MyFunction](datetime) 
AS RANGE RIGHT FOR VALUES (N'2017-08-01T00:00:00.000', N'2017-09-01T00:00:00.000', N'2017-10-01T00:00:00.000')

CREATE PARTITION SCHEME [MyScheme] 
AS PARTITION [MyFunction] TO ([PRIMARY], [FileGroup201708], [FileGroup201709], [FileGroup201710])

数据库中的所有表都是分区的。

好吧,我决定删除201708期间的所有数据,首先我执行:

TRUNCATE TABLE MyTable WITH (PARTITIONS (partition_number)) 

所有桌子。此操作后表中没有任何分区数据。

SELECT
    p.partition_number, fg.name, p.rows, OBJECT_NAME(p.object_id)
FROM
    sys.partitions p
INNER JOIN 
    sys.allocation_units au ON au.container_id = p.hobt_id
INNER JOIN 
    sys.filegroups fg ON fg.data_space_id = au.data_space_id
WHERE
    p.object_id = OBJECT_ID('MyTable')

上面的查询为特定文件组提供了 0 行。

现在我想删除文件和文件组,当我尝试删除文件时没有问题,但是当我尝试删除文件组时,SQL Server 出现错误:

无法删除文件组“FileGroup201708”,因为它不为空

我使用这个查询检查了该文件组中是否有一些索引:

SELECT 
    OBJECT_NAME(i.[object_id]) AS [ObjectName],
    i.[index_id] AS [IndexID],
    i.[name] AS [IndexName],
    i.[type_desc] AS [IndexType],
    i.[data_space_id] AS [DatabaseSpaceID],
    f.[name] AS [FileGroup],
    d.[physical_name] AS [DatabaseFileName]
FROM 
    [sys].[indexes] i
INNER JOIN 
    [sys].[filegroups] f ON f.[data_space_id] = i.[data_space_id]
INNER JOIN 
    [sys].[database_files] d ON f.[data_space_id] = d.[data_space_id]
INNER JOIN 
    [sys].[data_spaces] s ON f.[data_space_id] = s.[data_space_id]
WHERE 
    OBJECTPROPERTY(i.[object_id], 'IsUserTable') = 1
ORDER BY 
    OBJECT_NAME(i.[object_id]), f.[name], i.[data_space_id]

但是所有行都在“文件组”列中,主文件组。谁能给些建议?

sql-server sql-server-2016 database-partitioning filegroup
5个回答
0
投票

我有同样的问题(无法删除文件组)。 我所做的是:

  1. 删除表 MyTable

  2. DROP 那些文件组中的文件

    ALTER DATABASE MyDB
    REMOVE FILE logical_file_name_found_in_db_properties_in_files_section

  3. 删除分区方案 MyScheme

  4. 删除分区函数 MyFunction

  5. DROP 文件组


0
投票

这是我的解决方案:

ALTER TABLE Fisier DROP column Fisier
GO
ALTER TABLE Fisier SET (FILESTREAM_ON="NULL")
GO
ALTER TABLE FisierRev DROP column Fisier
GO
ALTER TABLE FisierRev SET (FILESTREAM_ON="NULL")
GO
ALTER TABLE Contract DROP column Fisier
GO
ALTER TABLE Contract SET (FILESTREAM_ON="NULL")
GO

USE gestiunea_inan_19Rebut
GO
DBCC SHRINKFILE (N'inan_magazin5_fs', EMPTYFILE)
GO


EXEC sp_filestream_force_garbage_collection @dbname = N'gestiunea_inan_19Rebut'

ALTER Database gestiunea_inan_19Rebut REMOVE FILE inan_magazin5_fs
GO
ALTER Database gestiunea_inan_19Rebut REMOVE FILEGROUP FILESTREAMGROUP
GO


IF COL_LENGTH('Fisier','Fisier') IS NULL
BEGIN
    ALTER TABLE Fisier ADD Fisier [varbinary](max)   NULL
END
GO
IF COL_LENGTH('FisierRev','Fisier') IS NULL
BEGIN
    ALTER TABLE FisierRev ADD Fisier [varbinary](max)   NULL
END
GO

IF COL_LENGTH('Contract','Fisier') IS NULL
BEGIN
    ALTER TABLE Contract ADD Fisier [varbinary](max)   NULL
END
GO

0
投票

试试看

GO
ALTER PARTITION FUNCTION MyFunction() MERGE RANGE (31);
GO
ALTER DATABASE [MYDB] REMOVE FILE [File31]
GO
ALTER DATABASE [MYDB] REMOVE FILEGROUP [FileGroup_31]
GO

0
投票

第一个

DBCC Shrinkfile
截断, 然后从分区方案中删除文件组

ALTER DATABASE [数据库名称]

REMOVE FILE
[文件名] 去

ALTER DATABASE [数据库名称]

REMOVE FILEGROUP
[FileGroup201708] 去


0
投票

此过程不适用于我的数据库: 收缩空文件:OK 删除文件:确定 删除文件组:KO 无法删除文件组 FG_201510,因为它不为空。

© www.soinside.com 2019 - 2024. All rights reserved.