Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server в Windows
FILESTREAM позволяет приложениям на основе SQL Server хранить неструктурированные данные, такие как документы и изображения, в файловой системе. Приложения могут использовать расширенные API потоковой передачи и производительность файловой системы и одновременно поддерживать согласованность транзакций между неструктурированными данными и соответствующими структурированными данными.
FILESTREAM интегрирует ядро СУБД SQL Server с файловой системой NTFS или ReFS, сохраняя данные больших двоичных объектов (BLOB) типа varbinary(max) в виде файлов в файловой системе. Инструкции 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
В SQL Server большие двоичные объекты могут представлять собой либо стандартные данные varbinary(max), которые хранятся в таблицах, либо объекты FILESTREAM varbinary(max), которые хранятся в файловой системе. Выбор в качестве хранилища базы данных или файловой системы определяется размером и назначением данных. Если выполняются следующие условия, следует рассмотреть возможность использования FILESTREAM:
- средний размер сохраняемых объектов превышает 1 МБ;
- важен быстрый доступ для чтения;
- Вы разрабатываете приложения, использующие средний уровень для логики приложения.
Для объектов меньшего размера хранение BLOB-объектов типа varbinary(max) в базе данных часто обеспечивает более высокую производительность потоковой передачи.
Хранилище FILESTREAM
Хранилище FILESTREAM реализовано как столбец типа varbinary(max), данные которого хранятся в файловой системе как BLOB-объекты. Размеры объектов BLOB ограничены только размером тома файловой системы. Стандартное ограничение varbinary(max) размером 2 ГБ файлов не применяется к BLOB-объектам, хранящимся в файловой системе.
Чтобы указать необходимость сохранения данных столбца в файловой системе, укажите атрибут FILESTREAM для столбца varbinary(max) . Этот атрибут приводит к тому, что ядро СУБД хранить все данные для этого столбца в файловой системе, но не в файле базы данных.
Данные FILESTREAM должны сохраняться в файловых группах FILESTREAM. Файловая группа FILESTREAM представляет собой особую файловую группу, в которой вместо самих файлов содержатся системные каталоги файлов. Данные системные каталоги файлов называются контейнерами данных. Контейнеры данных служат интерфейсом между хранилищем ядро СУБД и хранилищем файловой системы.
При использовании хранилища FILESTREAM обратите внимание на следующие аспекты:
- Если таблица содержит столбец FILESTREAM, каждая строка должна иметь уникальный идентификатор строки, который не должен иметь значение NULL.
- в файловую группу FILESTREAM можно добавить несколько контейнеров данных;
- Контейнеры данных FILESTREAM нельзя вкладывать друг в друга.
- При использовании отказоустойчивой кластеризации файловые группы FILESTREAM должны находиться на общих дисках.
- файловые группы FILESTREAM могут размещаться на сжатых томах.
Интегрированное управление
Так как FILESTREAM реализуется как столбец varbinary(max) и интегрирован непосредственно в ядро СУБД, большинство средств управления и функций SQL Server работают без изменений для данных FILESTREAM. Так, например, с данными FILESTREAM можно использовать любые модели резервного копирования и восстановления, а резервное копирование данных FILESTREAM осуществляется при помощи структурированных данных в базе данных. Если вы не хотите создавать резервные копии данных FILESTREAM с реляционными данными, можно использовать частичное резервное копирование для исключения файловых групп FILESTREAM.
Встроенные функции безопасности
В SQL Server данные FILESTREAM защищены так же, как и другие данные: предоставляя разрешения на уровне таблицы или столбца. Пользователь, у которого имеется разрешение на столбец FILESTREAM в таблице, может открыть связанные файлы.
Примечание.
Шифрование не поддерживается для данных FILESTREAM.
Только учетной записи, под которой выполняется служба SQL Server, предоставляются разрешения на доступ к контейнеру FILESTREAM. Мы рекомендуем не предоставлять никакой другой учетной записи разрешения на контейнер данных.
Примечание.
Учетные записи SQL Server не поддерживаются для контейнеров FILESTREAM. Для контейнеров FILESTREAM поддерживается только аутентификация NTFS или ReFS.
Доступ к данным BLOB с помощью Transact-SQL и потокового доступа через файловую систему
После хранения данных в столбце FILESTREAM вы можете получить доступ к файлам с помощью транзакций Transact-SQL или с помощью API Win32.
Доступ с помощью Transact-SQL
С помощью Transact-SQL можно вставлять, обновлять и удалять данные FILESTREAM:
- С помощью операции INSERT можно предварительно заполнить поле 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 — это папка, управляемая SQL Server. Не добавляйте или не удаляйте файлы в папке FILESTREAM вручную или с помощью других приложений. Если вы это сделаете, это приведёт к ошибкам резервного копирования и несоответствиям. Дополнительные сведения см. в MSSQLSERVER_3056, MSSQLSERVER_7908 и MSSQLSERVER_7906.
Модель инструкций
Доступ к файловой системе 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-данных FILESTREAM, изменяемых через потоковый доступ файловой системы.
Семантика изоляции
Семантика изоляции определяется уровнями изоляции транзакций ядра СУБД. Уровень изоляции с фиксацией на чтение поддерживается для доступа к Transact-SQL и файловой системе. Поддерживаются уровни изоляции повторяемого чтения, сериализации и снимка. Грязное чтение не поддерживается.
Операции открытия доступа к файловой системе не ждут никаких блокировок. Вместо этого открытые операции завершаются немедленно, если они не могут получить доступ к данным из-за изоляции транзакций. Вызовы API потоковой передачи завершаются ошибкой ERROR_SHARING_VIOLATION если открытая операция не может продолжаться из-за нарушения изоляции.
Чтобы обеспечить возможность частичных обновлений, приложение может отправить управляющий FSCTL-запрос к файловой системе устройства (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT), чтобы загрузить предыдущее содержимое в файл, на который указывает открытый дескриптор. Это активирует копию старого содержимого на стороне сервера. Для повышения производительности приложений и предотвращения возникновения потенциальных времени ожидания при работе с очень большими файлами рекомендуется использовать асинхронный ввод-вывод.
Если FSCTL отправляется после того, как в дескриптор уже были записаны данные, сохранятся результаты последней операции записи, а предыдущие записи, выполненные через этот дескриптор, будут утрачены.
API файловой системы и поддерживаемые уровни изоляции
Если API файловой системы не может открыть файл из-за нарушения изоляции, возвращается ERROR_SHARING_VIOLATION исключение. Это нарушение изоляции возникает в том случае, когда две транзакции пытаются получить доступ к одному и тому же файлу. Результат операции доступа зависит от режима открытия файла и версии SQL Server, на которой выполняется транзакция. В следующей таблице приведены возможные результаты для двух транзакций, которые обращаются к одному файлу.
| Транзакция 1 | Транзакция 2 | Результат в SQL Server 2008 (10.0.x) | Результат в SQL Server 2008 R2 (10.50.x) и более поздних версиях |
|---|---|---|---|
| Открыта для чтения. | Открыта для чтения. | Обе завершаются успешно. | Обе завершаются успешно. |
| Открыта для чтения. | Открыта для записи. | Обе завершаются успешно. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. | Обе завершаются успешно. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. |
| Открыта для записи. | Открыта для чтения. | Открытие для транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. | Обе завершаются успешно. |
| Открыта для записи. | Открыта для записи. | Операция открытия для транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. | Открытие для транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. |
| Открыта для чтения. | Открыть для SELECT. |
Обе завершаются успешно. | Обе завершаются успешно. |
| Открыта для чтения. | Открыть для UPDATE или DELETE. |
Обе завершаются успешно. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. | Обе завершаются успешно. Операции записи в транзакции 2 не влияют на операции чтения, выполняемые в транзакции 1. |
| Открыта для записи. | открыт для SELECT. |
Транзакция 2 блокируется, пока транзакция 1 не будет зафиксирована или завершена или пока не истечет время ожидания блокировки транзакции. | Обе завершаются успешно. |
| Открыта для записи. | Открыть для UPDATE или DELETE. |
Транзакция 2 блокируется, пока транзакция 1 не будет зафиксирована или завершена или пока не истечет время ожидания блокировки транзакции. | Транзакция 2 блокируется, пока транзакция 1 не будет зафиксирована или завершена или пока не истечет время ожидания блокировки транзакции. |
Открыть для SELECT. |
Открыта для чтения. | Обе завершаются успешно. | Обе завершаются успешно. |
Открыть для SELECT. |
Открыта для записи. | Обе завершаются успешно. Операции записи в транзакции 2 не влияют на транзакцию 1. | Обе завершаются успешно. Операции записи в транзакции 2 не влияют на транзакцию 1. |
Открыть для UPDATE или DELETE. |
Открыта для чтения. | Операция открытия транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. | Обе завершаются успешно. |
Открыть для UPDATE или DELETE. |
Открыта для записи. | Операция открытия транзакции 2 завершается сбоем с исключением ERROR_SHARING_VIOLATION. | Операция открытия для транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. |
Открывается для SELECT повторяемого чтения. |
Открыта для чтения. | Обе завершаются успешно. | Обе завершаются успешно. |
Открывается для SELECT повторяемого чтения. |
Открыта для записи. | Операция открытия для транзакции 2 завершается сбоем с исключением ERROR_SHARING_VIOLATION. | Операция открытия для транзакции 2 завершается с исключением ERROR_SHARING_VIOLATION. |
Запись с удаленных клиентов
Удаленный доступ файловой системы к данным FILESTREAM осуществляется по протоколу SMB. Если клиент является удаленным, операции записи не кэшируются на стороне клиента. Операции записи всегда отправляются на сервер. Кэширование данных возможно на серверной стороне. Рекомендуется, чтобы приложения, работающие на удаленных клиентах, консолидируют небольшие операции записи в операции большего размера. Цель состоит в том, чтобы выполнять меньше операций записи.
Создание сопоставленных представлений памяти (сопоставленных операций ввода-вывода памяти) с помощью дескриптора FILESTREAM не поддерживается. Если сопоставление памяти используется для данных FILESTREAM, ядро СУБД не может гарантировать согласованность и устойчивость данных или целостность базы данных.
Рекомендации по повышению производительности FILESTREAM
Функция SQL Server FILESTREAM позволяет хранить двоичные данные двоичного объекта varbinary(max) в виде файлов в файловой системе. При наличии большого количества строк в контейнерах FILESTREAM, которые являются базовым хранилищем для столбцов FILESTREAM и FileTable, можно создать том файловой системы, содержащий большое количество файлов. Чтобы обеспечить оптимальную производительность при обработке интегрированных данных из базы данных и файловой системы, важно обеспечить оптимальную настройку файловой системы. Ниже приведены некоторые доступные параметры настройки файловой системы.
Проверка высоты драйвера фильтра FILESTREAM SQL Server (например,
rsfx0100.sys). Оцените все драйверы фильтров, загруженные для стека хранилища, связанного с томом, в котором компонент FILESTREAM хранит файлы, и убедитесь, что драйвер RsFx находится в нижней части стека. Для перечисления драйверов фильтров для определенного тома можно использовать программу управления FLTMC.EXE. Ниже приведен пример выходных данных из служебной программы FLTMC:C:\Windows\System32>fltMC.exeфильтрыИмя фильтра Число экземпляров Высота над уровнем моря Кадр Sftredir 1 406000 0 MpFilter 9 328000 0 luafv 1 135000 0 FileInfo 9 45 000 0 RsFx0103 1 41001.03 0 Убедитесь, что для этих файлов свойство "Время последнего доступа" отключено на сервере. Этот атрибут файловой системы сохраняется в реестре: имя ключа:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemNtfsDisableLastAccessUpdate Type: REG_DWORD Значение: 1Убедитесь, что на сервере отключено создание имен в формате 8.3. Этот атрибут файловой системы поддерживается в реестре: имя ключа:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemИмя: NtfsDisable8dot3NameCreation Type: REG_DWORD Значение: 1Убедитесь, что контейнеры каталогов FILESTREAM не имеют шифрования файловой системы или сжатия файловой системы, так как они могут привести к уровню накладных расходов при доступе к этим файлам.
В командной строке с повышенными привилегиями запустите экземпляры FLTMC и убедитесь, что к тому, на котором вы пытаетесь выполнить восстановление, не подключены драйверы фильтров.
Убедитесь, что контейнеры каталогов FILESTREAM не имеют более 300 000 файлов. Сведения из представления каталога
sys.database_filesможно использовать, чтобы выяснить, какие каталоги в файловой системе содержат файлыFILESTREAM-related. Такую ситуацию можно предотвратить с помощью нескольких контейнеров. (Дополнительные сведения см. в следующем пункте маркированного списка.)При наличии только одной файловой группы FILESTREAM все файлы данных создаются в одной и той же папке. На создание очень большого количества файлов могут влиять индексы NTFS большого размера, которые также могут фрагментироваться.
Использование нескольких файловых групп обычно помогает решить эту проблему (приложение использует секционирование или содержит несколько таблиц, каждая из которых находится в собственной файловой группе).
Начиная с SQL Server 2012 (11.x) и более поздних версий, в файловой группе FILESTREAM может быть несколько контейнеров или файлов, и к ним будет применяться схема циклического распределения. Таким образом, количество файлов NTFS в каждом каталоге меньше.
Резервное копирование и восстановление могут выполняться быстрее при использовании нескольких контейнеров FILESTREAM, если используются несколько томов, на которых хранятся эти контейнеры.
SQL Server 2012 (11.x) поддерживает несколько контейнеров для каждой файловой группы и упрощает работу. Для управления большим количеством файлов не требуется сложных схем секционирования.
Если в экземпляре SQL существует очень большое количество контейнеров FILESTREAM, запуск баз данных с большим количеством контейнеров FILESTREAM может занять много времени, чтобы зарегистрировать их в драйвере фильтра FILESTREAM. Распространение их в нескольких разных томах помогает улучшить время запуска базы данных.
MFT NTFS может стать фрагментирован и может вызвать проблемы с производительностью. Зарезервированный размер MFT зависит от размера тома, поэтому вы можете или не столкнуться с этим.
Можно проверить фрагментацию MFT с помощью
defrag /A /V C:(измените C: на фактическое имя тома).Можно зарезервировать дополнительное пространство MFT с помощью команды fsutil behavior set mftzone 2.
Файлы данных FILESTREAM должны быть исключены из проверки антивирусным ПО.
Примечание.
Windows Server 2016 автоматически включает Защитник Windows. Убедитесь, что Защитник Windows настроен для исключения файлов FILESTREAM. Невыполнение этого действия может привести к снижению производительности операций резервного копирования и восстановления.
Дополнительные сведения см. в разделе Настройка и проверка исключений для проверок антивирусной программой "Защитник Windows".
Связанные задачи
- Включение и настройка FILESTREAM
- Создание базы данных с поддержкой FILESTREAM
- Создание таблицы для хранения данных FILESTREAM
- Доступ к данным FILESTREAM с помощью Transact-SQL
- Создание клиентских приложений для данных FILESTREAM
- Доступ к данным FILESTREAM с OpenSqlFilestream
- Создание частичных обновлений данных FILESTREAM
- Избегайте конфликтов с операциями базы данных в приложениях FILESTREAM
- Перемещение базы данных с поддержкой FILESTREAM
- Настройка FILESTREAM в отказоустойчивом кластере
- Настройка брандмауэра для доступа к FILESTREAM