Файлы FILESTREAM, оставленные после удаления строки - PullRequest
19 голосов
/ 26 октября 2009

Я успешно настроил FILESTREAM на моем сервере SQL 2008; однако я заметил, что даже когда я удалил строки, содержащие данные FILESTREAM, файл физических данных, похоже, не удаляется.

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

Кто-нибудь знает, удалит ли SQLServer файл в конце концов? Если из базы данных будет удалено много больших файлов, я ожидаю, что смогу быстро освободить место, вот и все.

Ответы [ 4 ]

24 голосов
/ 26 октября 2009

FILESTREAM данные подлежат контролю транзакции и поэтому не удаляются мгновенно.

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

Из документации :

FILESTREAM Сборка мусора - это фоновая задача, которая запускается процессом контрольной точки базы данных. Контрольная точка запускается автоматически, когда было сгенерировано достаточно журнала транзакций. Дополнительные сведения см. В разделе Электронная документация по SQL Server 2008 , раздел «CHECKPOINT и активная часть журнала» (http://msdn.microsoft.com/en-us/library/ms189573.aspx)., учитывая, что файловые операции FILESTREAM минимально регистрируются в базе данных. В журнале транзакций может пройти некоторое время, прежде чем количество сгенерированных записей в журнале транзакций вызовет процесс проверки и произойдет сборка мусора. Если это становится проблемой, вы можете форсировать сборку мусора с помощью оператора CHECKPOINT.

14 голосов
/ 19 февраля 2013

использование

sp_filestream_force_garbage_collection

к сожалению, это работает только> = SQL Server 2012

1 голос
/ 16 ноября 2018

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

USE [DataBaseName]
GO

-- Create a checkpoint on current database
CHECKPOINT
GO 

-- Execute Garbage Collector after a checkpoint created
EXEC sp_filestream_force_garbage_collection  'DataBaseName'
GO
1 голос
/ 22 февраля 2010

УДАЛИТЬ ИЗ tbl_XXX ОБЪЯВИТЬ @test CHECKPOINT @test = 0

Запустите это на вашем сервере sql и Вы также можете наблюдать удаление файла из файловой системы ..

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

Спасибо

харанат

...