web-dev-qa-db-ja.com

SQL Server:FileStreamファイルを縮小する方法は?

プロジェクトでは、SQL Server 2008 R2を使用しています。 1つのテーブルにはファイルストリーム列があります。

いくつかの負荷テストを行いましたが、データベースでは最大20GBが使用されています。

いくつかの(構成テーブル)を除いて、テーブルを空にしています。しかし、私のデータベースはまだ多くのスペースを使用していました。だから私はTask -> Shrink -> Database / Filesを使用しましたが、私のデータベースはまだ16GBのようなものを使用しています。

ファイルストリームファイルがまだ多くのスペースを使用していることがわかりました。

問題は、このデータベースをバックアップして最終的な本番サーバーにエクスポートする必要があることです。バックアップを圧縮するように指示すると、3.5Goを超えるファイルが取得されます。保存とアップロードには不便です。

そして、私はもっと大きなテストを計画しているので、その空きスペースを縮小する方法を知りたいです。

私が試しているとき: enter image description here

私はこの例外を受け取ります: enter image description here

The properties SIZE, MAXSIZE, or FILEGROWTH cannot be specified for the FILESTREAM data
file 'FileStreamFile'. (Microsoft SQL Server, Error: 5509)

だから私は何をすべきですか?

このエラーのあるトピックをいくつか見つけましたが、それらはfilestream列の削除に関するものでした。

4
J4N

古いバージョンのファイルは、チェックポイントプロセス中に実行されるガラベッジ収集プロセスを介してファイルストリームから削除されます。

詳細な説明については、 http://sqlskills.com/BLOGS/PAUL/post/FILESTREAM-garbage-collection.aspx を参照してください。

つまり、すべてのフープを飛び越えて、ログバックアップ、チェックポイントを実行してから...待ってください。愚かなガベージコレクターは、1秒あたり約4または5の速度でファイルを削除するだけのようです。

2012年に新しいと思いますか? is sp_filestream_force_garbage_collection( http://msdn.Microsoft.com/en-us/library/gg492195.aspx )-まだ使用していないため、どれほど効果的かはわかりません。

3
bkr

問題は、ガベージコレクションが完了するまでスペースが解放されないことです。残念ながら、これを強制する方法はありません。

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 }
0
user2993805