sp_filestream_force_garbage_collection (Transact-SQL)

Aplica-se a:SQL Server

Força a execução do coletor de lixo FILESTREAM (GC), excluindo todos os arquivos FILESTREAM desnecessários.

Um contêiner FILESTREAM não pode ser removido até que todos os arquivos excluídos dentro dele sejam limpos pelo GC. O FILESTREAM GC é executado automaticamente. No entanto, se você precisar remover um contêiner antes que o GC tenha sido executado, você pode usar sp_filestream_force_garbage_collection para executar o GC manualmente.

Convenções de sintaxe de Transact-SQL

Sintaxe

sp_filestream_force_garbage_collection
    [ @dbname = ] 'database_name'
    [ , [ @filename = ] 'logical_file_name' ]
[ ; ]

Argumentos

@dbname [ = ] 'database_name'

Significa o nome do banco de dados no qual executar o GC.

@dbname é sysname. Se não for especificado, o banco de dados atual será assumido.

@filename [ = ] 'logical_file_name'

Especifica o nome lógico do contêiner FILESTREAM no qual executar o GC. @filename é opcional. Se nenhum nome de arquivo lógico for especificado, o GC limpará todos os contêineres FILESTREAM no banco de dados especificado.

Valores do código de retorno

Valor Descrição
0 Êxito na operação
1 Falha na operação

Conjunto de resultados

Valor Descrição
file_name Indica o nome de contêiner FILESTREAM
num_collected_items Indica o número de itens FILESTREAM (arquivos ou diretórios) que foram coletados (excluídos) nesse contêiner.
num_marked_for_collection_items Indica o número de itens FILESTREAM (arquivos ou diretórios) que foram marcados para GC neste contêiner. Esses itens ainda não foram excluídos, mas podem ser elegíveis para exclusão após a fase GC.
num_unprocessed_items Indica o número de itens FILESTREAM qualificados (arquivos ou diretórios) que não foram processados para GC neste contêiner FILESTREAM. Os itens podem não ser processados por vários motivos, incluindo:

- Arquivos que precisam ser fixados porque um backup de log ou ponto de verificação não foi feito.

- Arquivos no modelo de recuperação FULL ou BULK_LOGGED.

- Há uma transação ativa de longa duração.

- O trabalho do leitor de log de replicação não foi executado. Consulte o white paper FILESTREAM Storage no SQL Server 2008 para obter mais informações.
last_collected_xact_seqno Retorna o número de sequência de log correspondente (LSN) até onde os arquivos do contêiner FILESTREAM especificado foram coletados pelo coletor de lixo.

Comentários

Executa explicitamente a tarefa de coleta de lixo FILESTREAM até a conclusão no banco de dados solicitado (e no contêiner FILESTREAM). O processo GC remove arquivos que não são mais necessários. O tempo necessário para que essa operação seja concluída depende do tamanho dos dados FILESTREAM nesse banco de dados ou contêiner e da quantidade de atividade DML que ocorreu recentemente nos dados FILESTREAM. Embora essa operação possa ser executada com o banco de dados online, isso pode afetar o desempenho do banco de dados durante sua execução devido a várias atividades de E/S feitas pelo processo GC.

Observação

Recomenda-se que esta operação seja executada apenas quando necessário e fora do horário normal de funcionamento.

É possível executar várias invocações desse procedimento armazenado simultaneamente em contêineres ou em bancos de dados separados.

Devido a operações de duas fases, o procedimento armazenado deve ser executado duas vezes para realmente excluir arquivos FILESTREAM subjacentes.

A coleta de lixo depende do truncamento de logs. Portanto, se os arquivos foram excluídos recentemente em um banco de dados usando o modelo de recuperação completa, eles serão coletados somente depois que um backup de log dessas partes do log de transações for feito e a parte do log for marcada como inativa. Em um banco de dados usando o modelo de recuperação simples, um truncamento de log ocorre depois que um CHECKPOINT foi emitido no banco de dados.

Permissões

Requer associação à função de banco de dados db_owner .

Exemplos

Os exemplos a seguir executam os contêineres GC para FILESTREAM no fsdb banco de dados.

R. Não especificar nenhum contêiner

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb';

B. Especificar um contêiner

USE fsdb;
GO
EXEC sp_filestream_force_garbage_collection @dbname = N'fsdb',
    @filename = N'FSContainer';