对于一个项目,我使用的是 SQL Server 2008 R2。一个表有一个文件流列。
我做了一些负载测试,现在数据库已使用约 20GB。
我有空表,除了几个(配置表)。但我的数据库仍然占用大量空间。所以我使用了Task -> Shrink -> Database / Files
但我的数据库仍然占用了大约 16GB 的空间。
我发现文件流文件仍然占用了大量空间。
问题是我需要备份这个数据库,以便将其导出到最终的生产服务器上,即使我指示压缩备份,我得到的文件也超过 3.5G。不方便存储和上传。
我正在计划进行更大规模的测试,所以我想知道如何缩小那个空白空间。
当我尝试时:
我收到此异常:
The properties SIZE, MAXSIZE, or FILEGROWTH cannot be specified for the FILESTREAM data
file 'FileStreamFile'. (Microsoft SQL Server, Error: 5509)
所以我该怎么做?
我发现了几个出现此错误的主题,但它们是关于删除文件流列的。
答案1
文件的旧版本通过检查点过程中运行的垃圾收集过程从文件流中删除。
看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) - 但我没有用过它所以我不能说它有多有效。
答案2
问题是,垃圾收集完成之前空间不会释放。不幸的是,没有办法强制执行此操作。
我使用 powershell 脚本遍历文件流文件并清空其内容。(请注意,只要您不需要,这将从所有记录中删除文件流数据)。这将保留与记录关联的文件,但看起来该字段为空。
您将需要更改 filesteam 文件夹的路径,但这基本上是我所使用的。
$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 }