无法删除FileStream FileGroup或将其重新附加到SQL Server数据库

时间:2019-06-21 06:15:18

标签: sql sql-server filestream

背景:我在SQL 2010中创建了一个正常工作的SQL Server数据库,带有2个不同的FileStream / FileGroups,工作正常。我分离了数据库,使用SQL 2016(在Win 10 Pro上)将其移动到另一个桌面,然后手动复制了2个Filestream文件夹(称为ImageFS和 DocFS )。我只是简单地重新连接了mdf数据库,并且没有注意Filestream函数,因为它没有被使用。几个月后,我注意到一个FileGroup / Fileshare(ImageFG / ImageFS)可以正常工作,而另一个( DocFG / DocFS )不能正常工作。更详细地讲,这就是我得到的

SELECT DocFileID, ModifiedDate FROM DocFile
-- WORKS FINE

SELECT DocFileID, ModifiedDate, Doc FROM DocFile
--Returns this error:
-- A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)

因此,Doc是此表中的文件流字段。我试图删除该字段并再次添加,但SSMS不允许我这样做:

ALTER TABLE DocFile DROP COLUMN Doc
--Returns this error:
-- The FILESTREAM filegroup '**DocFG**' has no files assigned to it. FILESTREAM data cannot be populated on this filegroup until a file is added.
-- Huh?  there are already files in this Windows folder

我还尝试缩小DocFG文件组以尝试将其删除,但出现此错误。

DBCC SHRINKFILE ('DocFG', EMPTYFILE)
--Returns this error:
--Could not locate file 'DocFG' for database 'MyDB' in sys.database_files. The file either does not exist, or was dropped.

我已尝试使用此代码分离并重新附加数据库,但这没有什么不同:

CREATE DATABASE [MyDB]
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\MyDB.mdf' , SIZE = 71040KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
 FILEGROUP [ImageFG] CONTAINS FILESTREAM 
( NAME = N'ImageFS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\ImageFS' , MAXSIZE = UNLIMITED), 
 FILEGROUP [DocFG] CONTAINS FILESTREAM DEFAULT
( NAME = N'DocFS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\DocFS' , MAXSIZE = UNLIMITED)
 LOG ON ( NAME = N'MyDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\MyDB_log.ldf' , SIZE = 43264KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)
FOR ATTACH

这很好,但是DocFS / DocFG仍然不起作用。我还尝试使用SSMS手动“删除” DocFG,但同时也出现错误:

SSMS1

SSMS2

是否有关于如何进行此操作的想法?

1 个答案:

答案 0 :(得分:0)

事实证明,这是一个奇怪的情况。 DocFS(“数据库”属性的“文件”选项卡)和DocFG(“数据库”属性的“文件组”选项卡)以某种方式不同步(因为缺少更好的术语)。如果您尝试基于DocFG重新创建DocFS,SSMS将不允许您这样做。原因是原始的对应Windows目录已经存在,SSMS试图在该目录中重新创建一个目录。

解决方案(至少对我来说):

  1. 将Windows目录(在我的情况下为“ ... \ DocFS”)重命名为临时名称,例如“ .. \ DocFS_Temp \”)
  2. 返回并在“数据库属性”的“文件”标签中重新创建DocFS“文件”,并确保选择相应的FileGroup(例如DocFG)。然后,这将创建一个新的“ ... \ DocFS” Windows目录
  3. 删除此新创建的“ ... \ DocFS” Windows目录
  4. 将临时目录重命名为“ ... \ DocFS”

我做过的其他家政服务(可能有帮助,也可能没有帮助)...我使数据库脱机,然后又联机。我还必须将自动增长从无限制切换到10%,然后重新启动以消除“目录已满”错误。

希望这对其他人有帮助。