Общие сведения о FILESTREAM

Большинство типов данных является неструктурированными (например, текстовые документы, изображения и видеоролики). Такие неструктурированные данные часто хранятся за пределами базы данных отдельно от структурированных данных. Подобное разделение может привести к усложнению управления данными. Либо, если данные связаны со структурированным хранилищем, могут быть ограничены возможности файловых потоков и производительность.

Хранилище FILESTREAM объединяет компонент SQL Server Database Engine с файловой системой NTFS, размещая данные больших двоичных объектов (BLOB) типа varbinary(max) в файловой системе в виде файлов. С помощью инструкций Transact-SQL можно вставлять, обновлять, запрашивать, выполнять поиск и выполнять резервное копирование данных FILESTREAM. Интерфейсы файловой системы Win32 предоставляют потоковый доступ к этим данным.

Для кэширования данных файлов в хранилище FILESTREAM используется системный кэш NT. Это позволяет снизить возможное влияние данных FILESTREAM на производительность компонента Database Engine. Буферный пул SQL Server не используется, поэтому данная память доступна для обработки запросов.

ПримечаниеПримечание

Данные FILESTREAM не шифруются, даже если включено прозрачное шифрование данных.

Пошаговое руководство по использованию хранилищ FILESTREAM см. в разделе Приступая к работе с хранилищем FILESTREAM.

Условия использования 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. Файловая группа FILESTREAM представляет собой особую файловую группу, в которой вместо самих файлов содержатся системные каталоги файлов. Данные системные каталоги файлов называются контейнерами данных. Они являются интерфейсом между хранилищем компонента Database Engine и хранилищем файловой системы. 

При использовании хранилища FILESTREAM обратите внимание на следующие аспекты:

  • если в таблице присутствует столбец FILESTREAM, каждая строка должна иметь уникальный идентификатор строки (не равен NULL);

  • вложенность контейнеров данных FILESTREAM не допускается;

  • при использовании кластера отработки отказа файловые группы FILESTREAM должны находиться в ресурсах общего диска;

  • файловые группы FILESTREAM могут размещаться на сжатых томах.

Встроенная безопасность

В SQL Server защита данных FILESTREAM осуществляется таким же образом, как и защита любых других данных: посредством предоставления разрешений на уровнях таблицы или столбца. Пользователь, у которого имеется разрешение на столбец FILESTREAM в таблице, может открыть связанные файлы.

ПримечаниеПримечание

В данных FILESTREAM не поддерживается шифрование.

Разрешения NTFS для доступа к контейнеру FILESTREAM предоставляются только той учетной записью, под которой выполняется служба SQL Server. Другим учетным записям разрешения на доступ к контейнеру данных предоставлять не рекомендуется.

Интегрированное управление

Поскольку FILESTREAM реализуется в виде столбца типа varbinary(max) и интегрируется непосредственно в компонент Database Engine, большинство функций и инструментов управления SQL Server не требуют изменения для работы с данными FILESTREAM. Так, например, с данными FILESTREAM можно использовать любые модели резервного копирования и восстановления, а резервное копирование данных FILESTREAM осуществляется при помощи структурированных данных в базе данных. Если резервное копирование данных FILESTREAM при помощи реляционных данных выполнять нежелательно, для исключения файловых групп FILESTREAM можно воспользоваться частичным резервным копированием.

Двойственная модель программирования для доступа к данным больших двоичных объектов

После сохранения данных в столбце FILESTREAM доступ к файлам можно получить, используя транзакции Transact-SQL или API-интерфейсы Win32.

Доступ с помощью Transact-SQL

Язык Transact-SQL позволяет вставлять, обновлять и удалять данные FILESTREAM: 

  • Операция вставки позволяет выполнить предварительное заполнение поля FILESTREAM значением NULL, пустым значением или встроенными данными относительно небольшого размера. Однако при работе с большими объемами данных большей эффективности потока можно добиться при помощи файла, использующего интерфейсы Win32.

  • При обновлении поля FILESTREAM происходит изменение базовых данных BLOB в файловой системе. Если в поле FILESTREAM содержится значение NULL, данные BLOB, связанные с этим полем, удаляются. Обновление фрагмента данных на языке Transact-SQL, реализованное в виде конструкции UPDATE**.**Write(), использовать для выполнения частичного обновления данных нельзя.

  • При удалении строки или удалении или усечении таблицы, содержащей данные FILESTREAM, удаляются базовые данные BLOB в файловой системе.

Потоковый доступ к файловой системе

Поддержка потоков в Win32 запускается в контексте транзакций SQL Server. В рамках транзакции функции FILESTREAM позволяют получить логический UNC-путь к файлу в файловой системе. API-интерфейс OpenSqlFilestream позволяет получить дескриптор файла. Затем этот дескриптор может быть использован функциями файловых потоков Win32, например ReadFile() и WriteFile(), для доступа и обновления файла посредством файловой системы. 

Поскольку операции над файлами являются транзакционными, удалить или переименовать файлы FILESTREAM с помощью файловой системы невозможно.

Модель инструкции

Доступ к файловой системе FILESTREAM моделирует инструкцию на языке Transact-SQL, используя операции открытия и закрытия файлов. Эта инструкция запускается при открытии дескриптора файла и завершается при закрытии этого дескриптора. Например, при закрытии обработчика записи срабатывают все возможные триггеры AFTER, зарегистрированные в таблице, как если бы была выполнена инструкция UPDATE.

Пространство имен хранилища

В хранилище FILESTREAM компонент Database Engine управляет пространством имен физической файловой системы объектов BLOB. Новая встроенная функция, PathName, предоставляет логический UNC-путь объекта BLOB, соответствующего каждой ячейке FILESTREAM в таблице. В приложении этот логический путь используется для получения дескриптора Win32 и работы с данными BLOB посредством обычных интерфейсов файловой системы Win32. Эта функция возвращает значение NULL, если значением столбца FILESTREAM является NULL.

Доступ к транзакционной файловой системе

Новая встроенная функция, GET_FILESTREAM_TRANSACTION_CONTEXT(), возвращает токен, представляющий актуальную транзакцию, с которой связан сеанс. Эта транзакция должна быть запущена, не прервана и не зафиксирована. Получение токена позволяет приложению связать потоковые операции файловой системы FILESTREAM с запущенной транзакцией. Эта функция возвращает значение NULL в случае отсутствия явно запущенной транзакции.

Прежде чем транзакция будет зафиксирована или прервана, все дескрипторы файлов должны быть закрыты. Если дескриптор остается открытым за пределами области действия транзакции, дополнительные операции чтения, применяемые к этому дескриптору, завершатся ошибкой; дополнительные операции записи, применяемые к этому дескриптору, будут выполнены успешно, но фактические данные не будут записаны на диск. Аналогичным образом, если работа базы данных или экземпляра компонента Database Engine завершается, все открытые дескрипторы становятся недопустимыми.

Надежность транзакций

При работе с FILESTREAM до момента фиксации транзакции надежность транзакций для данных FILESTREAM объектов BLOB, измененных на основе потокового доступа к файловой системе, обеспечивает компонент Database Engine.

Сквозная запись от удаленных клиентов

Удаленный доступ файловой системы к данным FILESTREAM осуществляется по протоколу SMB. Если клиент является удаленным, операции записи не кэшируются на стороне клиента. Операции записи всегда отправляются на сервер. Кэширование данных возможно на серверной стороне. В приложениях, запущенных на удаленных клиентах, рекомендуется объединять небольшие операции записи, чтобы сократить число операций записи, используя данные большего размера.

Создание представлений, отображенных в памяти (отображенных в памяти операций ввода-вывода), при помощи дескриптора FILESTREAM не поддерживается. Если для данных FILESTREAM используется отображение в памяти, компонент Database Engine не может гарантировать согласованность и надежность данных или целостность базы данных.

Драйвер FILESTREAM RsFx сертифицирован для Windows Server 2008 R2. Чтобы загрузить файл каталога и получить дополнительные сведения, откройте страницу SQL Server 2008 R2 FileStream Driver Windows Logo Certificationhttps://go.microsoft.com/fwlink/?LinkId=208828 в центре загрузки Майкрософт.