3.1.26

Заблуждения относительно хранилища FILESTREAM

Автор: Paul Randal, Misconceptions around FILESTREAM storage

Эта короткая статья вызвана вопросом, поступившим через Twitter, (перефразированный) вопрос звучит так: «Могут ли данные FILESTREAM храниться удалённо?». Это сбивало с толку многих, и ни документация BOL по FILESTREAM, ни мой технический документ по FILESTREAM (см. здесь) прямо не отвечают на этот вопрос.

Контейнер данных FILESTREAM для базы данных должен располагаться на томе NTFS в локально подключённом хранилище. Так же, как файлы данных и журнала базы данных, каталог не может находиться в общей папке UNC. Путаница возникает из-за того, что к данным FILESTREAM можно обращаться удалённо через общую папку UNC — но что касается экземпляра-хозяина, хранилище FILESTREAM должно быть локальным.

Второй вопрос, который возник некоторое время назад: могут ли контейнеры данных FILESTREAM совместно использовать один и тот же каталог или быть вложенными. Ответы: отчасти да и отчасти нет... Давайте посмотрим.

Я создам первую базу данных с контейнером данных FILESTREAM:

CREATE DATABASE FileStreamTestDB1 ON PRIMARY
    (NAME = FileStreamTestDB1_data, FILENAME = N'C:\SQLskills\FSTestDB1_data.mdf'),
FILEGROUP FileStreamFileGroup CONTAINS FILESTREAM
    (NAME = FileStreamTestDB1Documents, FILENAME = N'C:\SQLskills\FSDC\Documents')
LOG ON
    (NAME = FileStreamTestDB1_log, FILENAME = N'C:\SQLskills\FSTestDB1_log.ldf');
GO
    

А теперь попробуем создать другую базу данных с тем же родительским каталогом:

CREATE DATABASE FileStreamTestDB2 ON PRIMARY
    (NAME = FileStreamTestDB2_data, FILENAME = N'C:\SQLskills\FSTestDB2_data.mdf'),
FILEGROUP FileStreamFileGroup CONTAINS FILESTREAM
    (NAME = FileStreamTestDB2Documents, FILENAME = N'C:\SQLskills\FSDC\Documents2')
LOG ON
    (NAME = FileStreamTestDB2_log, FILENAME = N'C:\SQLskills\FSTestDB2_log.ldf');
GO
    

Это работает нормально. Вы не можете использовать для другой базы данных тот же каталог, что и для первой (т.е. N'C:\SQLskills\FSDC\Documents'), но два контейнера данных FILESTREAM могут иметь один и тот же родительский каталог.

А теперь попробуем создать вложенный:

CREATE DATABASE FileStreamTestDB3 ON PRIMARY
    (NAME = FileStreamTestDB3_data, FILENAME = N'C:\SQLskills\FSTestDB3_data.mdf'),
FILEGROUP FileStreamFileGroup CONTAINS FILESTREAM
    (NAME = FileStreamTestDB3Documents, FILENAME = N'C:\SQLskills\FSDC\Documents\Documents3')
LOG ON
    (NAME = FileStreamTestDB3_log, FILENAME = N'C:\SQLskills\FSTestDB3_log.ldf');
GO
    
Msg 5136, Level 16, State 2, Line 1
The path specified by 'C:\SQLskills\FSDC\Documents\Documents3' cannot be used for a FILESTREAM container since it is contained in another FILESTREAM container.
Msg 1802, Level 16, State 2, Line 1
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
    

Не работает, как и ожидалось, так как это описано в BOL здесь.



Комментариев нет:

Отправить комментарий