对于一个项目,我正在使用SQL Server 2008 R2。 一个表有一个文件stream列。
我做了一些负载testing,现在数据库有20GB的使用。
我有空表,除了几个(configuration表)。 但是我的数据库还在使用很多空间。 所以我使用Task -> Shrink -> Database / Files
但我的数据库仍然使用像16GB的东西。
我发现它的文件stream文件仍然使用了很多空间。
问题是我需要备份这个数据库将其导出到最终的生产服务器上,如果我指出压缩备份的事件,我得到一个超过3.5Go的文件。 不方便存储和上传。
而且我正在计划更大的testing,所以我想知道如何缩小这个空间。
当我尝试时:
我得到这个例外:
The properties SIZE, MAXSIZE, or FILEGROWTH cannot be specified for the FILESTREAM data file 'FileStreamFile'. (Microsoft SQL Server, Error: 5509)
所以我该怎么做?
我发现这个错误的几个主题,但他们是关于删除filestream列。
旧版本的文件通过在检查点过程中运行的garabage收集过程从文件stream中移除。
请参阅http://sqlskills.com/BLOGS/PAUL/post/FILESTREAM-garbage-collection.aspx以获取完整说明。
所以 – 你跳过所有的环节,运行日志备份,检查点,然后你……等等,因为愚蠢的垃圾收集器似乎只是以每秒4或5的速度删除文件。
在2012年新的,我想? 是sp_filestream_force_garbage_collection( http://msdn.microsoft.com/en-us/library/gg492195.aspx ) – 但我没有使用它,所以我不能说它是多么有效。
我使用了powershell脚本遍历文件stream文件并清空它们的内容。 (注意,只要你不需要它,这将删除所有logging中的文件stream数据)
你将需要改变你的filesteam文件夹的path,但这实际上是我用过的。
$files = Get-ChildItem -Path "C:\MSSQL\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\MyDbRestore_9.MyDbRestore_Filestream" -Recurse -File -Exclude "*.hdr" ForEach ($file in $files) { Clear-Content $file.FullName }