Frage

habe ich erfolgreich FILESTREAM auf meinem SQL 2008 Server eingerichtet; jedoch habe ich bemerkt, dass, selbst wenn ich gelöscht Zeilen FILESTREAM-Daten enthalten, die physikalische Datendatei nicht gelöscht werden scheint.

Durch die physische Datei, meine ich die Datei in SQL Server des verwalteten Verzeichnis mit einem uniqueidentifer als Dateiname nicht die ursprüngliche Datei in die dbase hinzugefügt.

Wer weiß, wenn SQLServer die Datei schließlich löschen? Wenn es eine Menge von großen Dateien aus dem dbase entfernt ist würde ich erwarten, dass der Raum zurückzufordern schnell das ist alles.

War es hilfreich?

Lösung

FILESTREAM Daten unterliegen Transaktionssteuerung und daher nicht sofort gelöscht wird.

Stattdessen wird SQL Server einen Garbage Collector, der die alten Daten löscht, wenn es sicher, dass es letztlich gelöscht worden war.

Von der Dokumentation :

  

FILESTREAM Garbage Collection ist eine Hintergrundaufgabe, die von der Datenbank Checkpoint-Prozess ausgelöst wird. Ein Checkpoint wird automatisch ausgeführt, wenn genügend Transaktionsprotokoll erzeugt worden ist. Weitere Informationen finden Sie in dem SQL Server 2008-Online Thema „CHECKPOINT und den aktiven Teil des Log“ ( http://msdn.microsoft.com/en-us/library/ms189573.aspx ). Da FILESTREAM Dateioperationen minimal protokolliert werden in dem Transaktionslog der Datenbank, kann es eine Weile dauern, bis die Anzahl der Transaktionsprotokollaufzeichnungen erzeugt löst einen Checkpoint-Prozess und die Garbage Collection stattfindet. Wenn dies ein Problem ist, können Sie die Garbage Collection erzwingen, indem das CHECKPOINTstatement verwendet wird.

Andere Tipps

Verwendung

sp_filestream_force_garbage_collection

leider nur funktioniert> = SQL Server 2012

DELETE FROM tbl_XXX ERKLÄREN @Test CHECKPOINT @Test = 0

Führen Sie dies in Ihrem SQL-Server und Sie können die Datei beobachten aus dem Dateisystem gelöscht immer auch ..

Sie können die Anzahl von Minuten oder Sekunden für den Garbage Collector warten, um die Dateien vom Dateisystem nach dem Ausführen des Löschvorgangs aufzuräumen.

Danke

Haranath

Als erstes müssen Sie ein Checkpoint für die Garbage Collector Arbeit. Nachdem Sie Zeilen gelöscht können Sie diesen Code ausführen, um alle Dateien zu beseitigen, die zu einer Reihe gehören.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top