Назад | Перейти на главную страницу

SQL Server: как сжать файлы FileStream?

Для проекта я использую SQL Server 2008 R2. В одной таблице есть столбец файлового потока.

Я провел несколько нагрузочных тестов, и теперь в базе данных использовано ~ 20 ГБ.

У меня пустые таблицы, кроме нескольких (таблицы конфигурации). Но моя база данных по-прежнему занимала много места. Так что я использовал Task -> Shrink -> Database / Files Но моя база данных по-прежнему использует что-то вроде 16 ГБ.

Я обнаружил, что файл файлового потока все еще занимает много места.

Проблема в том, что мне нужно сделать резервную копию этой базы данных, чтобы экспортировать ее на конечный производственный сервер, и если я укажу на сжатие резервной копии, я получил файл более 3,5Go. Не удобно хранить и выгружать.

И я планирую гораздо более крупный тест, поэтому я хочу знать, как уменьшить это пустое пространство.

Когда я пытаюсь:

Я получаю это исключение:

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

Так что я должен делать?

Я нашел несколько тем с этой ошибкой, но они касались удаления столбца файлового потока.

Старые версии файлов удаляются из файлового потока с помощью процесса сбора мусора, который выполняется во время процесса контрольной точки.

видеть 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 для перебора файлов файлового потока и очистки их содержимого. (обратите внимание, что это удалит данные файлового потока из всех записей, если они вам не нужны). Это оставит файл, связанный с записью, на месте, но будет выглядеть так, как будто поле было пустым.

Вам нужно будет изменить путь к папке вашей файловой команды, но я, по сути, использовал именно ее.

$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 }