FILESTREAMファイルが行の削除後に残される
-
06-07-2019 - |
質問
SQL 2008サーバーでFILESTREAMを正常にセットアップしました。ただし、FILESTREAMデータを含む行を削除しても、物理データファイルが削除されないように見えることに気付きました。
物理ファイルとは、dbaseに追加された元のファイルではなく、ファイル名としてuniqueidentiferを持つSQLServerの管理ディレクトリ内のファイルを意味します。
SQLServerが最終的にファイルを削除するかどうかは誰にもわかりませんか? dbaseから大量の大きなファイルが削除された場合、スペースをすぐに回収できると期待しています。
解決
FILESTREAM
データはトランザクション制御の対象であるため、すぐには削除されません。
代わりに、 SQL Server
はガベージコレクターを実行し、古いデータが最終的に削除されたことが確実になったときにパージします。
documentation から:
FILESTREAM
ガベージコレクションは、データベースチェックポイントプロセスによってトリガーされるバックグラウンドタスクです。十分なトランザクションログが生成されると、チェックポイントが自動的に実行されます。詳細については、 SQL Server 2008 Books Online のトピック“CHECKPOINT
およびログのアクティブな部分を参照してください。 ( http://msdn.microsoft.com/en-us/library/ms189573。 aspx )。FILESTREAM
ファイル操作がデータベースのトランザクションログに最小限記録されるため、生成されたトランザクションログレコードの数がチェックポイントプロセスをトリガーし、ガベージコレクションが発生するまでに時間がかかる場合があります。これが問題になる場合は、CHECKPOINT
ステートメントを使用してガベージコレクションを強制できます。
他のヒント
使用
sp_filestream_force_garbage_collection
残念ながら、これは機能します> = SQL Server 2012
tbl_XXXからの削除DECLARE @test CHECKPOINT @test = 0
SQLサーバーでこれを実行します また、ファイルシステムからファイルが削除されるのを確認できます。
削除操作の実行後、ガベージコレクターがファイルシステムからファイルをクリーンアップするまで待機する分数または秒数を設定できます。
ありがとう
ハラナス
まず、
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