无法删除或重新附加 FileStream 文件组到 SQL Server 数据库



背景:我在SQL 2010中创建了一个有效的SQL Server数据库,有2个不同的FileStream/FileGroups,工作正常。 我分离了数据库,将其移动到另一个带有SQL 2016的桌面(在Win 10 Pro上),并手动复制了2个Filestream文件夹(称为ImageFS和DocFS)。我只是重新附加了 mdf 数据库,并没有注意文件流功能,因为它没有被使用。 几个月后,我注意到一个FileGroup/文件共享(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 FilesMicrosoft SQL ServerMSSQL13.SQL2016MSSQLDATAMyDB.mdf' , SIZE = 71040KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
FILEGROUP [ImageFG] CONTAINS FILESTREAM 
( NAME = N'ImageFS', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL13.SQL2016MSSQLDATAImageFS' , MAXSIZE = UNLIMITED), 
FILEGROUP [DocFG] CONTAINS FILESTREAM DEFAULT
( NAME = N'DocFS', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL13.SQL2016MSSQLDATADocFS' , MAXSIZE = UNLIMITED)
LOG ON ( NAME = N'MyDB_log', FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL13.SQL2016MSSQLDATAMyDB_log.ldf' , SIZE = 43264KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)
FOR ATTACH

这很好,但 DocFS/DocFG 仍然不起作用。 我还尝试使用 SSMS 手动"删除"DocFG,但我也收到一个错误:

SSMS1

SSMS2

关于在哪里进行的任何想法?

事实证明,这是一个奇怪的情况。 不知何故,DocFS(数据库属性的文件选项卡)和 DocFG(数据库属性的文件组选项卡)不同步(因为缺乏更好的术语)。 如果你尝试基于 DocFG 重新创建 DocFS,SSMS 不会允许你这样做。 原因是原始的相应Windows目录已经存在,SSMS正在尝试在那里重新创建一个。

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

  1. 将 windows 目录(在我的例子中为"...\DocFS")重命名为临时名称,例如"..\DocFS_Temp\")
  2. 返回并在"数据库属性"的"文件"选项卡中重新创建 DocFS"文件",确保选择相应的文件组(例如 DocFG)。 然后,这将创建一个新的"...\DocFS"Windows目录
  3. 删除此新创建的"...\DocFS"Windows 目录
  4. 将临时目录重命名回"...\DocFS">

我做过的其他家政工作(可能会也可能没有帮助)......我将数据库脱机切换,然后重新联机。 我还必须将自动增长从无限切换到 10%,然后再切换回来以摆脱"目录已满"错误。

我希望这对其他人有所帮助。

相关内容

  • 没有找到相关文章

最新更新