Невозможно удалить или повторно присоединить FileStream FileGroup к базе данных SQL Server - PullRequest
1 голос
/ 21 июня 2019

Справочная информация: у меня была рабочая база данных SQL Server, созданная в SQL 2010, с двумя разными 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 голосов
/ 22 июня 2019

Оказывается, это была странная ситуация.Каким-то образом DocFS (вкладка «Файлы» в свойствах базы данных) и DocFG (вкладка «Группы файлов» в свойствах базы данных) не были синхронизированы (из-за отсутствия лучшего термина).Если вы попытаетесь воссоздать DocFS на основе DocFG, SSMS не позволит вам.Причина в том, что исходный соответствующий каталог Windows уже был там, и SSMS пыталась воссоздать его там.

Решение (по крайней мере для меня):

  1. Переименуйте каталог Windows (в моем случае «... \ DocFS»), на что-то временное, например «.. \ DocFS_Temp \»)
  2. вернитесь и заново создайте «файл» DocFSна вкладке «Файлы» в разделе «Свойства базы данных» обязательно выберите соответствующую группу файлов (например, DocFG).После этого будет создан новый каталог Windows "... \ DocFS"
  3. Удалить этот недавно созданный каталог Windows "... \ DocFS"
  4. Переименуйте временный каталог обратно в "...\ DocFS "

Другие домашние дела, которые я делал (которые могли или не могли помочь) ... Я отключил БД в автономном режиме, а затем снова включил.Мне также пришлось отключить автоматический рост с неограниченного до 10% и обратно, чтобы избавиться от ошибки «каталог заполнен».

Надеюсь, это поможет кому-то еще.

...