FILESTREAM — единственное решение, которое обеспечивает согласованность транзакций со структурированными и неструктурированными данными, а также интегрированное управление, безопасность, низкие затраты и превосходную производительность при потоковой передаче.
Это достигается путем хранения структурированных данных в файлах базы данных,
а неструктурированных данных больших двоичных объектов в файловой системе при сохранении согласованности транзакций между двумя хранилищами. Дополнительные данные об архитектуре FILESTREAM приведены в разделе «Общие сведения о FILESTREAM» ниже в этом техническом документе.
Общие сведения о FILESTREAM
Функция FILESTREAM впервые появилась в SQL Server 2008. Она позволяет хранить структурированные данные в базе данных, а связанные неструктурированные данные
(т. е. большие двоичные объекты) — непосредственно в файловой системе NTFS. Это дает возможность обращаться к данным больших двоичных объектов через высокопроизводительные API потоковой передачи Win32®, не расплачиваясь снижением производительности при доступе
к данным через SQL Server.
FILESTREAM постоянно поддерживает согласованность транзакций между структурированными
и неструктурированными данными, обеспечивая даже восстановление данных FILESTREAM на момент времени с использованием резервных копий журналов. Согласованность обеспечивается автоматически программой SQL Server и не требует пользовательской логики в приложении.
В механизме FILESTREAM это достигается путем ведения эквивалента журнала транзакций
базы данных, требования которого к управлению во многом такие же (более подробно это описано далее в разделе «Настройка сборки мусора FILESTREAM»). Сочетание журнала транзакций
базы данных с журналом транзакций FILESTREAM позволяет правильно восстановить данные FILESTREAM и структурированные данные с точки зрения транзакций.
FILESTREAM является не принципиально новым типом данных, а атрибутом хранилища существующего типа varbinary (max). FILESTREAM в основном работает так же, как и тип данных varbinary (max). Он изменяет способ хранения данных больших двоичных объектов, которые хранятся в файловой системе, а не в файлах данных SQL Server. Поскольку FILESTREAM реализуется в виде столбца типа varbinary (max) и интегрируется непосредственно в ядро СУБД, то большинство функций и средств управления без изменений работают с данными FILESTREAM.
Необходимо отметить, что работа стандартного типа данных varbinary (max) совершенно не изменится в SQL Server 2008, включая установленный предельный размер 2 ГБ. Добавление атрибута FILESTREAM практически снимает со столбца varbinary (max) ограничение по размеру (в действительности размер ограничен базовым томом NTFS).
Данные FILESTREAM хранятся в файловой системе в наборе каталогов NTFS, которые называются контейнерами данных и соответствуют специальным файловым группам в базе данных. Транзакционным доступом к данным FILESTREAM управляют SQL Server и драйвер фильтра файловой системы, который устанавливается в процессе активации FILESTREAM на уровне Windows. Использование драйвера фильтра файловой системы также обеспечивает удаленный доступ к данным FILESTREAM в формате UNC. SQL Server поддерживает в своем роде ссылки из строк таблицы на файлы FILESTREAM, связанные с ними. Это означает, что удаление или переименование файлов FILESTREAM непосредственно в файловой системе приведет
к повреждению базы данных.
Для использования FILESTREAM требуется несколько изменений схемы для таблиц данных
(в первую очередь это потребует, чтобы каждая строка имела уникальный идентификатор).
Кроме того, налагается ряд ограничений при объединении с другими компонентами (например,
нет возможности шифровать данные FILESTREAM). Все это подробно описано ниже в разделе «Настройка SQL Server для работы с FILESTREAM».
Данные FILESTREAM можно получать и обрабатывать двумя способами: через стандартную программную модель Transact-SQL либо через потоковые API Win32. Оба механизма полностью совместимы с транзакциями и поддерживают большинство операций DML, в том числе операции вставки, обновления, удаления и выборки. Данные FILESTREAM также поддерживаются
при выполнении таких операций обслуживания, как резервное копирование, восстановление
и проверка целостности. Важное исключение — невозможность частичного обновления данных FILESTREAM. Любое обновление значения данных FILESTREAM приводит к созданию новой копии файла данных FILESTREAM. Старый файл будет асинхронно удален, как описано ниже в разделе «Настройка сборки мусора FILESTREAM».
Доступ к данным больших двоичных объектов с использованием двойственной модели программирования
После сохранения данных в столбце FILESTREAM доступ к ним возможен через транзакции Transact-SQL или через Win32 API. В этом разделе содержатся некоторые общие сведения
о моделях программирования и их использовании.
Доступ через Transact-SQL
С помощью Transact-SQL данные FILESTREAM можно вставлять, обновлять и удалять следующим образом.
· Поля FILESTREAM можно заранее заполнить с помощью операции вставки (с пустым значением или малым значением, отличным от NULL). Однако интерфейсы Win32 более эффективны для потоковой передачи больших объемов данных.
· При обновлении данных FILESTREAM происходит изменение базовых данных больших двоичных объектов в файловой системе. Если в поле FILESTREAM содержится значение NULL, то данные больших двоичных объектов, связанные с этим полем, удаляются. Пофрагментное обновление данных на Transact-SQL, реализованное как метод UPDATE. Write(), нельзя использовать для частичного обновления данных FILESTREAM.
· При удалении строки, содержащей данные FILESTREAM, а также при удалении или усечении таблицы, содержащей данные FILESTREAM, базовые данные больших двоичных объектов в файловой системе также будут удалены. Физическое удаление файлов FILESTREAM выполняется как асинхронный фоновый процесс, как описано далее
в техническом документе «Настройка сборки мусора FILESTREAM».
Дополнительные сведения и примеры использования Transact-SQL для доступа к данным FILESTREAM см. в разделе электронной документации по SQL Server 2008 «Управление данными FILESTREAM на языке Transact-SQL» (http://msdn. microsoft. com/ru-ru/library/cc645962.aspx).
Потоковый доступ Win32
Чтобы разрешить доступ к данным FILESTREAM из транзакции через файловую систему, новая встроенная функция GET_FILESTREAM_TRANSACTION_CONTEXT () возвращает токен текущей транзакции, с которой связан сеанс. Эта транзакция должна быть начата, но еще не зафиксирована и не откачена. Получение токена позволяет приложению связать потоковые операции файловой системы FILESTREAM с запущенной транзакцией. Эта функция возвращает значение NULL, если явно начатая транзакция отсутствует. Токен нужно получить до обращения к файлам FILESTREAM.
В FILESTREAM ядро СУБД управляет пространством имен физической файловой системы больших двоичных объектов. Новая встроенная функция PathName предоставляет логический UNC-путь объекта больших двоичных объектов, соответствующего каждому из полей FILESTREAM в таблице. В приложении этот логический путь используется для получения дескриптора Win32
и работы с данными больших двоичных объектов через обычные интерфейсы файловой системы Win32. Эта функция возвращает значение NULL, если значением столбца FILESTREAM является NULL. Это подчеркивает тот факт, что файл FILESTREAM необходимо заранее создать, прежде чем к нему можно получить доступ на уровне Win32. Как это сделать, было описано выше.
Поддержка потоков в Win32 работает в контексте транзакции SQL Server. После того как получен токен транзакции и путь, интерфейс OpenSqlFilestream Win32 API используется для получения дескриптора файла Win32. Кроме того, можно использовать управляемый интерфейс SqlFileStream API. Затем этот дескриптор можно передавать при вызове методов интерфейсов потоков Win32, например ReadFile() и WriteFile(), для доступа и обновления файла средствами файловой системы. Учтите, что файлы FILESTREAM нельзя удалять напрямую. Их также нельзя переименовывать
в файловой системе. В противном случае будет потеряна согласованность на уровне ссылок между файловой системой и базой данных (т. е. база данных по сути дела будет повреждена).
Доступ к файловой системе FILESTREAM моделирует инструкцию Transact-SQL, вызывая операции открытия и закрытия файлов. Эта инструкция запускается при открытии дескриптора файла и завершается при закрытии этого дескриптора. Например, при закрытии обработчика записи срабатывают все возможные триггеры AFTER, зарегистрированные в таблице, как если
бы была выполнена инструкция UPDATE.
Дополнительные сведения и примеры использования API-интерфейсов Win32 для доступа
к данным FILESTREAM см. в разделе электронной документации по SQL Server 2008 «Управление данными FILESTREAM с помощью Win32» (http://msdn. /ru-ru/library/cc645940.aspx).
Семантика транзакций
Прежде чем транзакция будет зафиксирована или откачена, все дескрипторы файлов должны быть закрыты. Если дескриптор остался открытым при фиксации транзакции, то фиксация завершится ошибкой, а все дальнейшие операции чтения и записи с этим дескриптором, как
и следует ожидать, приведут к сбою. Затем необходимо откатить эту транзакцию. Аналогичным образом при завершении работы базы данных или экземпляра ядра СУБД все открытые дескрипторы станут недействительными.
Если файл FILESTREAM открыт для выполнения записи, то создается новый файл нулевой
длины и все измененное значение данных FILESTREAM записывается в него. Старый файл
будет асинхронно удален, как описано в разделе «Настройка сборки мусора FILESTREAM»
далее в техническом документе.
При работе с FILESTREAM ядро СУБД обеспечивает надежность транзакций при фиксации для данных FILESTREAM больших двоичных объектов, измененных на основе потокового доступа
к файловой системе. Это выполняется с помощью упомянутого выше журнала FILESTREAM
и явного сброса содержимого файла FILESTREAM на диск.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


