Pregunta

He configurado correctamente FILESTREAM en mi servidor SQL 2008; Sin embargo, he notado que incluso cuando he eliminado filas que contienen datos FILESTREAM, el archivo de datos físicos no parece eliminarse.

Por el archivo físico, me refiero al archivo en el directorio administrado de SQLServer con un identificador único como nombre de archivo, no el archivo original agregado a la base de datos.

¿Alguien sabe si SQLServer eliminará el archivo eventualmente? Si se eliminan muchos archivos grandes de la base de datos, espero poder recuperar el espacio rápidamente, eso es todo.

¿Fue útil?

Solución

Los datos de

FILESTREAM están sujetos al control de transacciones y, por lo tanto, no se eliminan instantáneamente.

En cambio, SQL Server ejecuta un recolector de basura que purga los datos antiguos cuando está seguro de que finalmente se eliminaron.

De la documentación :

  La

FILESTREAM recolección de basura es una tarea en segundo plano que se activa mediante el proceso del punto de control de la base de datos. Un punto de control se ejecuta automáticamente cuando se ha generado suficiente registro de transacciones. Para obtener más información, consulte el tema Libros en pantalla de SQL Server 2008 " CHECKPOINT y la parte activa del registro" ( http://msdn.microsoft.com/en-us/library/ms189573.aspx ). Dado que las operaciones de archivo FILESTREAM se registran mínimamente en el registro de transacciones de la base de datos, puede pasar un tiempo antes de que el número de registros de registro de transacciones generados desencadene un proceso de punto de control y se produzca la recolección de basura. Si esto se convierte en un problema, puede forzar la recolección de basura utilizando la instrucción CHECKPOINT .

Otros consejos

utilizar

sp_filestream_force_garbage_collection

desafortunadamente esto solo funciona > = SQL Server 2012

ELIMINAR DE tbl_XXX DECLARAR @test CHECKPOINT @test = 0

Ejecuta esto en tu servidor sql y también puede observar que el archivo se elimina del sistema de archivos ...

Puede establecer el número de minutos o segundos que esperará a que el recolector de basura limpie los archivos del sistema de archivos después de realizar la operación de eliminación.

Gracias

haranath

Primero debe crear un Punto de control para Recolector de basura funciona. Después de eliminar filas, puede ejecutar este código para eliminar todos los archivos que no pertenecen a ninguna fila.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top