SQL Server 2008: невозможно удалить файл FileStream и файловую группу - PullRequest
13 голосов
/ 16 февраля 2010

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

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 16 февраля 2010

Убедитесь, что таблица, которую вы удалили, фактически является единственной таблицей, в которой используется файл 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 таблицы значение NULL:

alter table t1 set (filestream_on = "NULL")
1 голос
/ 16 февраля 2010

Вам нужно бежать DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

Это пометит файл как «пустой» и позволит удалить его.

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

0 голосов
/ 15 сентября 2017

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

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

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

Затем я удалил table1; После этого я смог удалить filegroup2 и файл данных в нем.

Последнее, что я переименовал в table2 в table1.

0 голосов
/ 17 февраля 2010

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

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

...