【问题标题】:Unable to remove or re-attach FileStream FileGroup to a SQL Server Database无法将 FileStream 文件组删除或重新附加到 SQL Server 数据库
【发布时间】:2019-06-21 06:15:18
【问题描述】:

背景:我在 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

关于在哪里进行此操作有什么想法吗?

【问题讨论】:

    标签: sql sql-server filestream


    【解决方案1】:

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

    解决方案(至少对我而言):

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

    我做的其他家务事(可能有帮助也可能没有帮助)...我将数据库切换到离线状态,然后重新在线。我还必须将自动增长从无限制切换到 10%,然后再返回以摆脱“目录已满”错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2012-07-21
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多