2010-02-15 16 views
11

Con SQL Server 2008 SP1, me he quitado la única mesa que tenía una Secuencia de archivo asociado a él, pero cada vez que intento hacer lo siguiente:SQL Server 2008: No se puede eliminar un archivo de FileStream y grupo de archivos

alter base de datos de archivos ConsumerMarketingStore eliminar CMS_JobInstanceFiles

alter database ConsumerMarketingStore eliminar grupo de archivos JobInstanceFiles

consigo la siguiente excepción:

Msg 5042, nivel 16, estado 10, línea 2 El archivo 'CMS_JobInstanceFiles' no se puede eliminar porque no está vacío. Msg 5042, nivel 16, estado 11, línea 3 El grupo de archivos 'JobInstanceFiles' no se puede eliminar porque no está vacío.

¿Cómo puedo deshacerme del archivo Filestream y del grupo de archivos? ¡Gracias!

+0

¿No debería ser esto en ServerFault.com? – mjv

Respuesta

12

Asegúrese de que la tabla se le cayó de hecho es la única mesa que está usando ese archivo 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' 

El resultado de la consulta anterior debe estar vacío. Si tenía otras tablas con columnas de Filestream y dice que dejó caer las columnas, la tabla seguirá usando el archivo Filestream. La forma de deshacerse de este uso es establecer Filestream grupo de archivos de tabla a NULL:

alter table t1 set (filestream_on = "NULL") 
+0

Eres un hombre increíble. Después de días de foros de MS, hablando con gente de MS y SO, eres el primero en proporcionar algo útil y la respuesta. Tenía una tabla que en un momento tenía una columna de archivo pero la eliminé. Por eso me encontraba con problemas. Muchas gracias. –

+0

Exactamente lo que necesitaba también, gracias. – Sam

+0

FWIW, lo usé para eliminar filestream de todas las tablas. Lanzó un error que enumeraba todas las tablas que aún tenían campos de flujo de archivos, lo que era útil para depurar campos de cadenas de archivos en desuso. –

1

tiene que ejecutar DBCC SHRINKFILE (CMS_JobInstanceFiles, EMPTYFILE)

Esta bandera voluntad el archivo como "vacío" y permitir que se dejó caer.

Por supuesto, ALTER DATABASE no menciona esto, pero DBCC SHRINKFILE hace ... obvio, ¿eh?

+0

En realidad, lo intenté, obtiene la siguiente excepción: Las propiedades TAMAÑO, MAXIMO o FILEGROWTH no se pueden especificar para el archivo de datos FILESTREAM 'CMS_JobInstanceFiles' –

+0

@James Alexander: ¿Qué comando, por favor? ¿DBCC o ALTER DATABASE? – gbn

+0

Creo que DBCC SHRINKFILE no funciona con archivos de Filestream. –

0

Después se le cae la tabla, el recolector de basura necesita un tiempo para limpiar los datos. Esa podría ser la razón de que esto suceda. Puede forzar la recolección de basura emitiendo un CHECKPOINT.

Puede verificar si los datos de FILESTREAM se limpian yendo al contenedor de datos Filestream. Si se borran los datos de FILESTREAM, generalmente tendrá éxito el ALTER DATABASE dbname REMOVE FILE. Una vez hecho, puede emitir ALTER DATABASE dbname REMOVE FILEGROUP.

+0

Jacob, AFAIK los datos no necesitan ser basura recolectada para soltar el archivo filestream. Lo que es necesario es que el archivo no esté siendo utilizado por ninguna tabla (ver mi respuesta). Además, tenga en cuenta que CHECKPOINT forzará GC solo bajo un modelo de recuperación simple y solo forzará una sola invocación de GC, que puede no recoger todos los archivos elegibles. –

0

@inam - mi situación era un poco diferente; Creé un segundo grupo de archivos y moví un índice agrupado a él. A continuación, eliminé el índice agrupado en el grupo de archivos secundario. Después de eso traté de eliminar el grupo de archivos, pero seguí recibiendo el error, el grupo de archivos no está vacío.

Vi algunas otras publicaciones que indicaban mover los datos a otro archivo dentro del mismo grupo de archivos. El problema aquí era que solo tenía un archivo en el grupo de archivos, y quería eliminar el grupo de archivos y el archivo en él.

La solución alternativa que surgió es la siguiente. He copiado todos los registros de table1 en table2 (seleccione * en table2 desde table1)

Luego eliminé table1; A partir de entonces pude eliminar el archivo de grupo2 y el archivo de datos en él.

Último renombrado table2 a table1.

Cuestiones relacionadas