背景:我在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正在尝试在那里重新创建一个。
解决方案(至少对我来说):
- 将 windows 目录(在我的例子中为"...\DocFS")重命名为临时名称,例如"..\DocFS_Temp\")
- 返回并在"数据库属性"的"文件"选项卡中重新创建 DocFS"文件",确保选择相应的文件组(例如 DocFG)。 然后,这将创建一个新的"...\DocFS"Windows目录
- 删除此新创建的"...\DocFS"Windows 目录
- 将临时目录重命名回"...\DocFS">
我做过的其他家政工作(可能会也可能没有帮助)......我将数据库脱机切换,然后重新联机。 我还必须将自动增长从无限切换到 10%,然后再切换回来以摆脱"目录已满"错误。
我希望这对其他人有所帮助。