Большинство типов данных является неструктурированными (например, текстовые документы, изображения и видеоролики). Такие неструктурированные данные часто хранятся за пределами базы данных отдельно от структурированных данных. Подобное разделение может привести к усложнению управления данными. Либо, если данные связаны со структурированным хранилищем, могут быть ограничены возможности файловых потоков и производительность.
Хранилище FILESTREAM объединяет компонент SQL Server Database Engine с файловой системой NTFS, размещая данные больших двоичных объектов (BLOB) типа varbinary(max) в файловой системе в виде файлов. С помощью инструкций Transact-SQL можно вставлять, обновлять, запрашивать, выполнять поиск и выполнять резервное копирование данных FILESTREAM. Интерфейсы файловой системы Win32 предоставляют потоковый доступ к этим данным.
Для кэширования данных файлов в хранилище FILESTREAM используется системный кэш NT. Это позволяет снизить возможное влияние данных FILESTREAM на производительность компонента Database Engine. Буферный пул SQL Server не используется, поэтому данная память доступна для обработки запросов.
Что вас может подтолкнуть к использованию FILESTREAM
В SQL Server большие двоичные объекты (BLOB) могут представлять собой данные стандартного типа varbinary(max), данные которых хранятся в таблице, либо объекты FILESTREAM типа varbinary(max), данные которых хранятся в файловой системе. Выбор в качестве хранилища базы данных или файловой системы определяется размером и назначением данных. Объекты FILESTREAM следует использовать в следующих случаях:
- средний размер сохраняемых объектов превышает 1 МБ;
- важен быстрый доступ для чтения;
- в разрабатываемых приложениях для логики приложений используется средний уровень.
При работе с объектами меньшего размера сохранение больших двоичных объектов (BLOB) типа varbinary(max) в базе данных часто позволяет добиться лучшей производительности потоков.
Хранение данных в FileStream
Хранилище FILESTREAM реализовано в виде столбца типа varbinary(max), данные которого хранятся в файловой системе как большие двоичные объекты (BLOB). Размеры объектов BLOB ограничены только размером тома файловой системы. Стандартное ограничение типа varbinary(max), согласно которому размер файла не должен превышать 2 ГБ, не применяется к объектам BLOB, сохраняемым в файловой системе.
Чтобы указать необходимость сохранения данных столбца в файловой системе, укажите атрибут FILESTREAM для столбца varbinary(max). В результате компонент Database Engine будет сохранять все данные этого столбца в файловой системе, а не в файле базы данных.
Данные FILESTREAM должны сохраняться в файловых группах FILESTREAM, которая представляет собой особую файловую группу, в которой вместо самих файлов содержатся системные каталоги файлов. Данные системные каталоги файлов называются контейнерами данных. Они являются интерфейсом между хранилищем компонента Database Engine и хранилищем файловой системы.
При использовании хранилища FILESTREAM обратите внимание на следующие аспекты:
- если в таблице присутствует столбец FILESTREAM, каждая строка должна иметь уникальный идентификатор строки (не равен NULL);
- вложенность контейнеров данных FILESTREAM не допускается;
- при использовании кластера отработки отказа файловые группы FILESTREAM должны находиться в ресурсах общего диска;
- файловые группы FILESTREAM могут размещаться на сжатых томах.
Активация FILESTREAM
Активация FILESTREAM происходит в двух точках:
- В SQL Server Configuration Manager в свойствах SQL Server;
- В SQL Server Management Studio (SSMS).
Для того, чтобы FILESTREAM заработал необходимо произвести действия в обоих точках. Такая защита сделана специально, чтобы не позволить Windows или SQL Server администратору выполнить действия по включению FILESTREAM без взаимного согласования.
Активация в SQL Server Configuration Manager:
- В SQL Server Configuration Manager в свойствах SQL Server выберите закладку FILESTREAM.
- Выберите "Enable FILESTREAM for Transact-SQL access".
Если вы не хотите иметь доступ к данным FILESTREAM из локальной Windows системы (специального Win32 API), то на этом можно действия прекратить и перейти к настройке в SSMS, если же вы хотите получать доступ к этим данным используя Windows API, то вам необходимо продолжить настройки.
- Выберите "Enable FILESTREAM for file I/O streaming access."
- Введите имя общей папки в поле "Windows Share Name" box. Через эту папку будут перенаправляться запросы к файлам FILESTREAM. Об этом мы поговорим далее.
- Если вы хотите разрешить доступ к этим файлам не только с локального сервера, но и с удаленных клиентских компьютеров, то выберите пунк "Allow remote clients to have streaming access to FILESTREAM data."
Примечание:
- Если это кластер выполните эти действия на всех узлах кластера.
- Имя, введенное в "Windows Share Name", должно быть одинаково на всех узлах кластера
- В данном случае я использовал имя SQL2014_FileStream
Далее переходим к настройкам в SSMS
- Для отключения FILESTREAM выполните - EXEC sp_configure 'filestream_access_level', 0; RECONFIGURE
- Для включения FILESTREAM и разрешения доступа к нему через Transact-SQL - выполните EXEC sp_configure 'filestream_access_level', 1; RECONFIGURE
- Для включения FILESTREAM и разрешения доступа к нему через Transact-SQL и Win32 - выполните - EXEC sp_configure 'filestream_access_level', 2; RECONFIGURE
Выполним команду EXEC sp_configure 'filestream_access_level', 2; RECONFIGURE в SSMS и посмотрим, что произошло в ОС. Для этого из командной строки ОС выполним команду FLTMC.EXE.
Как видим в Windows появился новый фильтр с именем RsFx0300. Этот фильтр монтируется в Windows на "высоте" 4100х и перехватывает обращения клиентов Win32 API к файлам FILESTREAM (как это происходит будет показано далее). Это фильтр представляет собой мини-фильтр драйвер (minifilter driver). Обратите также внимание, что он устанавливается сразу же после Wof-драйвера представляющего собой "Windows Overlay File System Filter Driver".
Информация для установки этого минидрайвера взята из файла "C:\Program Files\Microsoft SQL Server\120\Shared\RsFxInstall\RsFx0300.inf", установка файла произведена в ""C:\WINDOWS\system32\Drivers\RsFx0300.sys", а информация об установке драйвера находится HKLM\System\CurrentControlSet\Services\RsFx0300.
Выполните "NET SHARE" в командной строке Windows, и вы должны увидеть
Share name Resource Remark
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL2014_FileStream \\?\GLOBALROOT\Device\RsFx0300\<localmachine>\SQL2014_FileStream SQL Server FILESTREAM share
Имя SQL2014_FileStream это имя общего ресурса, которое вы ввели в "Windows Share Name"
Попробуйте подсоединиться \\localhost\SQL2014_FileStream у вас это должно получиться, но папка должна быть пуста. Она всегда пуста поскольку это виртуальная точка соединения для Win32 API клиентов (C#, VB)
Общее имя "\localhost\SQL2014_FileStream" регистрируется в HKLM\System\CurrentControlSet\Services\LanManServer\Shares
Как было описано выше RsFx0300 это имя фильтра (драйвера), который монтируется в стек Windows и будет перехватывать обращения клиентов работающих через Win32 API и обращающихся к файлам по имени полученном функцией .PathName(...).
Как видно из описания настроек и конфигурации, несмотря на то, что создается общая папка, разработчики не предполагали общего доступа к файлам FILESTREAM через оболочку Windows как к стандартным файлам. Если вам нужна такая возможность вы должны вместо FILESTREAM использовать файловые таблицы (File Table).
Мы произвели все подготовительные мероприятия для развертывания системы FILESTREAM.
Дальнейшее рассмотрение этой темы мы продолжим в наших следующих статьях.
Александр Каленик, Senior Premier Field Engineer (PFE), MSFT (Russia)