Domanda

Ho impostato correttamente FILESTREAM sul mio server SQL 2008; tuttavia ho notato che anche quando ho eliminato righe contenenti dati FILESTREAM, il file di dati fisici non sembra essere eliminato.

Per file fisico, intendo il file nella directory gestita di SQL Server con un uniqueidentifer come nome file non come file originale aggiunto a dbase.

Qualcuno sa se SQLServer alla fine eliminerà il file? Se ci sono molti file di grandi dimensioni rimossi dalla base di dati mi aspetterei di essere in grado di recuperare rapidamente lo spazio, tutto qui.

È stato utile?

Soluzione

I dati

?? FILESTREAM sono soggetti al controllo delle transazioni e pertanto non vengono cancellati istantaneamente.

Invece, SQL Server esegue un garbage collector che elimina i vecchi dati quando è sicuro che alla fine siano stati eliminati.

Dalla documentazione :

  

FILESTREAM garbage collection è un'attività in background che viene attivata dal processo del checkpoint del database. Un checkpoint viene eseguito automaticamente quando è stato generato un registro delle transazioni sufficiente. Per ulteriori informazioni, consultare l'argomento Documentazione in linea di SQL Server 2008 CHECKPOINT e la parte attiva del registro” ( http://msdn.microsoft.com/en-us/library/ms189573.aspx ). Dato che le operazioni sui file FILESTREAM sono minimamente registrate nel registro delle transazioni del database, potrebbe essere necessario del tempo prima che il numero di record del registro delle transazioni generati avvii un processo di checkpoint e si verifichi la garbage collection. Se questo diventa un problema, puoi forzare la garbage collection usando l'istruzione CHECKPOINT .

Altri suggerimenti

utilizzo

sp_filestream_force_garbage_collection

purtroppo funziona solo > = SQL Server 2012

ELIMINA DA tbl_XXX DECLARE @test CHECKPOINT @test = 0

Esegui questo nel tuo server SQL e puoi osservare che il file viene eliminato anche dal file system ..

È possibile impostare il numero di minuti o secondi di attesa per il garbage collector per ripulire i file dal filesystem dopo aver eseguito l'operazione di eliminazione.

Grazie

haranath

Per prima cosa devi creare un Checkpoint per Garbage Collector funziona. Dopo aver eliminato le righe puoi eseguire questo codice per eliminare tutti i file che non appartengono a nessuna riga.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top