arquivos FILESTREAM ser deixado para trás após a linha excluída
-
06-07-2019 - |
Pergunta
I configurou com êxito FILESTREAM no meu SQL Server 2008; no entanto tenho notado que mesmo quando eu tiver excluído linhas contendo dados FILESTREAM, o arquivo de dados física parece não ficar excluído.
No arquivo físico, quero dizer o arquivo no diretório gerenciado do SQLServer com uma uniqueidentifer como o nome do arquivo não o arquivo original adicionado à dbase.
Alguém sabe se SQLServer irá apagar o arquivo, eventualmente? Se há um monte de grandes arquivos removidos do dbase eu esperaria para ser capaz de recuperar o espaço rapidamente isso é tudo.
Solução
dados FILESTREAM
está sujeito a controle de transação e, portanto, não é excluída imediatamente.
Em vez disso, SQL Server
funciona um coletor de lixo que limpa os dados de idade, quando é certo que tinha sido, em última instância excluída.
A partir da documentação :
coleção
FILESTREAM
lixo é uma tarefa de fundo que é acionado pelo processo de verificação de banco de dados. Um ponto de verificação é executado automaticamente quando o log de transações suficiente foi gerado. Para mais informações, consulte o SQL Server 2008 Books Online tópico “CHECKPOINT
ea parte ativa do Log” ( http://msdn.microsoft.com/en-us/library/ms189573.aspx ). Dado que as operações de arquivoFILESTREAM
são minimamente registradas no log de transações do banco de dados, pode demorar algum tempo antes que o número de registros de log de transações gatilhos gerou um processo de verificação e coleta de lixo ocorre. Se isso se torna um problema, você pode forçar a coleta de lixo usando aCHECKPOINT
statement.
Outras dicas
uso
sp_filestream_force_garbage_collection
Infelizmente isso só funciona> = SQL Server 2012
DELETE FROM tbl_XXX DECLARE @Test CHECKPOINT @Test = 0
Executar isso em seu servidor sql E você pode observar o arquivo ficar excluído do sistema de arquivos também ..
Você pode definir o número de minutos ou segundos para aguardar o coletor de lixo para limpar os arquivos de sistema de arquivos após a realização da operação de exclusão.
Graças
Haranath
Primeiro você tem que criar um Checkpoint para o trabalho Garbage Collector . Depois de excluídos linhas que você pode executar este código para eliminar todos os arquivos que não pertencem a qualquer linha.
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