Поделиться через


FILESTREAM (SQL Server)

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

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

FILESTREAM использует системный кэш NT для кэширования данных файлов. Это помогает уменьшить любое влияние данных FILESTREAM на производительность ядра СУБД. Пул буферов SQL Server не используется; Таким образом, эта память доступна для обработки запросов.

FILESTREAM не включен автоматически при установке или обновлении SQL Server. Необходимо включить FILESTREAM с помощью диспетчера конфигурации SQL Server и SQL Server Management Studio. Чтобы использовать FILESTREAM, необходимо создать или изменить базу данных, чтобы она содержала специальный тип файловой группы. Затем создайте или измените таблицу, чтобы она содержала varbinary(max) столбец с атрибутом FILESTREAM. После выполнения этих задач можно использовать Transact-SQL и Win32 для управления данными FILESTREAM.

Дополнительные сведения об установке и использовании FILESTREAM см. в списке связанных задач.

Когда следует использовать FILESTREAM

В SQL Server BLOB-объекты могут быть стандартными varbinary(max) данными, которые хранят данные в таблицах или объектах FILESTREAM varbinary(max) , которые хранят данные в файловой системе. Размер и использование данных определяет, следует ли использовать хранилище базы данных или файловую систему. Если выполняются следующие условия, следует рассмотреть возможность использования FILESTREAM:

  • Объекты, которые хранятся, в среднем больше 1 МБ.

  • Быстрый доступ к чтению важен.

  • Вы разрабатываете приложения, использующие средний уровень для логики приложения.

Для небольших объектов хранение varbinary(max) BLOB-объектов в базе данных часто обеспечивает более высокую производительность потоковой передачи.

Хранилище FILESTREAM

Хранилище FILESTREAM реализуется в виде столбца varbinary(max), в котором данные хранятся в виде BLOB-объектов в файловой системе. Размеры BLOB-объектов ограничены только размером тома файловой системы. Стандартное varbinary(max) ограничение размером 2 ГБ файлов не применяется к BLOB-объектам, хранящимся в файловой системе.

Чтобы указать, что столбец должен хранить данные в файловой системе, укажите атрибут FILESTREAM в столбце varbinary(max) . Это приводит к тому, что ядро СУБД хранит все данные для этого столбца в файловой системе, но не в файле базы данных.

Данные FILESTREAM должны храниться в файловых группах FILESTREAM. Файловая группа FILESTREAM — это специальная файловая группа, содержащая каталоги файловой системы, а не сами файлы. Эти каталоги файловой системы называются контейнерами данных. Контейнеры данных — это интерфейс между хранилищем ядра СУБД и хранилищем файловой системы.

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

  • Если таблица содержит столбец FILESTREAM, каждая строка должна иметь уникальный ненулевой идентификатор строки.

  • В файловую группу FILESTREAM можно добавить несколько контейнеров данных.

  • Контейнеры данных FILESTREAM не могут быть вложены.

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

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

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

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

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

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

Замечание

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

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

Замечание

Логины SQL не будут работать с контейнерами FILESTREAM. Только аутентификация NTFS может работать с контейнерами FILESTREAM.

Доступ к данным BLOB с помощью Transact-SQL и потокового доступа к файловой системе

После хранения данных в столбце 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 ядро СУБД управляет пространством имен физической файловой системы BLOB. Новая встроенная функция PathName предоставляет логический UNC-путь BLOB, соответствующий каждой ячейке FILESTREAM в таблице. Приложение использует этот логический путь для получения дескриптора Win32 и работы с данными BLOB с помощью обычных интерфейсов файловой системы Win32. Функция возвращает значение NULL, если значение столбца FILESTREAM равно NULL.

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

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

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

Устойчивость транзакций

При завершении транзакции ядро СУБД обеспечивает сохранность транзакции для данных FILESTREAM в формате BLOB, измененных через потоковый доступ файловой системы.

Семантика изоляции

Семантика изоляции регулируется уровнями изоляции транзакций ядра СУБД. Уровень изоляции с фиксацией на чтение поддерживается для Transact-SQL и доступа к файловой системе. Поддерживаются операции с уровнями изоляции, такими как изоляция повторяемого чтения, сериализуемая изоляция и моментальная изоляция. Грязное считывание не поддерживается.

Операции открытия доступа к файловой системе не ожидают блокировок. Вместо этого открытые операции завершаются немедленно, если они не могут получить доступ к данным из-за изоляции транзакций. Вызовы API потоковой передачи завершаются сбоем ERROR_SHARING_VIOLATION если открытая операция не может продолжаться из-за нарушения изоляции.

Чтобы разрешить выполнение частичных обновлений, приложение может выдавать команду управления файловой системой устройства (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT), чтобы извлечь старое содержимое в файл, соответствующий открытому дескриптору. Это приведет к активации копии старого содержимого на стороне сервера. Для повышения производительности приложений и предотвращения потенциальных временных выходов при работе с очень большими файлами рекомендуется использовать асинхронный ввод-вывод.

Если FSCTL выдается после записи в дескриптор, последняя операция записи сохранится, а предыдущие записи, сделанные в дескриптор, будут утеряны.

API файловой системы и поддерживаемые уровни изоляции

Если API файловой системы не может открыть файл из-за нарушения изоляции, возвращается ERROR_SHARING_VIOLATION исключение. Это нарушение изоляции возникает, когда две транзакции пытаются получить доступ к одному файлу. Результат операции доступа зависит от режима открытия файла и версии SQL Server, на которой выполняется транзакция. В следующей таблице описаны возможные результаты для двух транзакций, обращаюющихся к одному файлу.

Проводка 1 Транзакция 2 Итог работы на SQL Server 2008 Результат SQL Server 2008 R2 и более поздних версий
Откройте для чтения. Откройте для чтения. Оба добились успеха. Оба справляются успешно.
Откройте для чтения. Открыто для записи. Оба преуспевают. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. Оба преуспели. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1.
Открыт для записи. Откройте для чтения. Попытка открытия транзакции 2 приводит к исключению ERROR_SHARING_VIOLATION. Оба добились успеха.
Открыто для записи. Открыть для записи Открытие транзакции 2 не удается с исключением ERROR_SHARING_VIOLATION. Неудачное открытие транзакции 2 завершается исключением ERROR_SHARING_VIOLATION.
Откройте для чтения. Открыто для выбора. Оба достигают успеха. Оба успешно справились.
Откройте для чтения. Откройте для UPDATE или DELETE. Оба добились успеха. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. Оба добились успеха. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1.
Открыто для записи. открыто для SELECT. Транзакция 2 блокируется до тех пор, пока транзакция 1 не зафиксирует или завершит транзакцию, или время ожидания блокировки транзакции. Оба преуспели.
Открыто для записи. Откройте для UPDATE или DELETE. Транзакция 2 блокируется до тех пор, пока транзакция 1 не зафиксирует или завершит транзакцию, или время ожидания блокировки транзакции. Транзакция 2 блокируется до тех пор, пока транзакция 1 не зафиксируется или не завершится, либо не истечет время ожидания блокировки.
Доступно для выбора Откройте для чтения. Обе стороны достигнули успеха. Оба добились успеха.
Доступно для SELECT. Открыть для записи. Оба успешно справляются. Операции записи в транзакции 2 не влияют на транзакцию 1. Оба успешно удаются. Операции записи в транзакции 2 не влияют на транзакцию 1.
Откройте для обновления или удаления. Откройте для чтения. Операция открытия транзакции 2 завершается ошибкой с исключением ERROR_SHARING_VIOLATION. Оба справились.
Откройте для UPDATE или DELETE. Открыто для записи. Операция открытия транзакции 2 завершается ошибкой с исключением ERROR_SHARING_VIOLATION. Операция открытия транзакции 2 терпит неудачу из-за исключения ERROR_SHARING_VIOLATION.
Откройте для SELECT с повторяемым чтением. Откройте для чтения. Обоим удалось. Оба успешны.
Доступно для SELECT с повторяющимся чтением. Открыть для записи. Операция открытия транзакции 2 завершается неудачей с исключением ERROR_SHARING_VIOLATION. Операция открытия транзакции 2 неудачно завершилась исключением ERROR_SHARING_VIOLATION.

Write-Through от клиентов, находящихся на удаленных серверах

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

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

Связанные задачи

Включение и настройка FILESTREAM
Создание базы данных FILESTREAM-Enabled
Создание таблицы для хранения данных FILESTREAM
Доступ к данным FILESTREAM с помощью Transact-SQL
Создание клиентских приложений для данных FILESTREAM
Доступ к данным FILESTREAM с OpenSqlFilestream
Создание частичных обновлений для данных FILESTREAM
Избегайте конфликтов с операциями базы данных в приложениях FILESTREAM
Перемещение базы данных FILESTREAM-Enabled
Настройка FILESTREAM в отказоустойчивом кластере
Настройка брандмауэра для доступа FILESTREAM

Связанные материалы

Совместимость FILESTREAM с другими функциями SQL Server