Подтвердить что ты не робот

SQL Server 2008: невозможно удалить файл FileStream и файловую группу

С пакетом обновления 1 (SP1) для SQL Server 2008 я удалил единственную таблицу с связанным с ней фильтром, но каждый раз, когда я пытаюсь сделать следующее:

изменить базу данных ConsumerMarketingStore удалить файл CMS_JobInstanceFiles

изменить базу данных ConsumerMarketingStore удалить файловую группу JobInstanceFiles

Я получаю следующее исключение:

Msg 5042, уровень 16, состояние 10, строка 2 Файл CMS_JobInstanceFiles не может быть удален, поскольку он не пуст. Msg 5042, уровень 16, состояние 11, строка 3 Файловая группа "JobInstanceFiles" не может быть удалена, поскольку она не пуста.

Как в мире я могу избавиться от файла Filestream и файловой группы? Спасибо!

4b9b3361

Ответ 1

Убедитесь, что таблица, на которую вы уронили, фактически является единственной таблицей, в которой используется файл filestream:

select * 
from ConsumerMarketingStore.sys.tables t 
join ConsumerMarketingStore.sys.data_spaces ds 
 on t.filestream_data_space_id = ds.data_space_id 
 and ds.name = 'JobInstanceFiles'

Результат вышеуказанного запроса должен быть пустым. Если у вас были другие таблицы с столбцами Filestream и вы сказали, что вы удалили столбцы, таблица все равно будет использовать файл Filestream. Способ избавиться от этого использования - установить таблицу Filestream filegroup в NULL:

alter table t1 set (filestream_on = "NULL")

Ответ 2

Вам нужно запустить DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

Это будет означать, что файл является "пустым" и позволяет его отбрасывать.

Конечно, ALTER DATABASE не упоминает об этом, но DBCC SHRINKFILE делает... очевидным, а??

Ответ 3

После того, как вы уронили таблицу, сборщик мусора занимает некоторое время, чтобы очистить данные. Это может быть причиной этого. Вы можете принудительно собрать сбор мусора, выпустив CHECKPOINT.

Вы можете проверить, очищены ли данные FILESTREAM, перейдя в контейнер данных Filestream. Если данные FILESTREAM удалены, ALTER DATABASE dbname REMOVE FILE обычно будет успешным. Как только это будет сделано, вы можете выдать ALTER DATABASE dbname REMOVE FILEGROUP.

Ответ 4

@inam - моя ситуация была немного иной; Я создал вторую файловую группу и переместил в нее кластерный индекс. После этого я удалил кластеризованный индекс во вторичной группе файлов. После этого я попытался удалить файловую группу, но я продолжал получать ошибку, группа файлов не пуста.

Я видел несколько других сообщений, которые указывали на перенос данных в другой файл в пределах той же файловой группы. Проблема здесь заключалась в том, что у меня был только один файл в группе файлов, и я хотел удалить в нем файловую группу и файл.

Обходной путь, который я придумал, заключается в следующем. Я скопировал все записи из таблицы1 в таблицу2 (выберите * в таблицу2 из таблицы1)

Затем я удалил таблицу1; после этого я смог удалить файловую группу2 и  файл данных в нем.

Последний я переименовал таблицу2 в таблицу1.