Ограничение FILESTREAM SQL Server

Я ищу атрибут FILESTREAM в SQL Server для хранения в нем файлов. Я понимаю, что он хранит файлы на жестком диске и сохраняет информацию о указателе/​​пути файла в БД. Кроме того, поддерживается последовательность транзакций в процессе.

Также существует ограничение "Данные FILESTREAM могут храниться только на локальных томах диска" для атрибута FILESTREAM.

Если я ожидаю, что мое веб-приложение будет хранить 200 000 изображений по 1-2 мб каждый, мне потребуется около 200 гб свободного места на жестком диске для хранения изображений. Поскольку FILESTREAM требует, чтобы все данные сохранялись только на локальном диске в соответствии с ограничением, было бы невозможно хранить миллионы файлов на одном жестком диске, так как требования к хранению были бы чрезвычайно большими.

Я понимаю, что это ограничение, или я что-то пропустил здесь?

Если это ограничение верно, я бы вместо этого сохранил его в db как простой blob и кластер моей БД для увеличения требований к хранению, что не представляется возможным с помощью FILESTREAM.

Поделитесь своими мыслями!

ОБНОВЛЕНО:
Еще несколько вопросов относительно FILESTREAM: -

  • Как справиться с восстановлением данных в случае повреждение контейнера данных?
  • Можно ли просто создать резервную копию базы данных без данные файловой системы? [при условии, что данные находится в SAN, которые не нужно перемещать]
  • Я хотел бы создать резервную копию или восстановить БД и просто переназначить файловую группу информация о пути [, которая отображается в SAN]. Возможно ли это?

Ответы

Ответ 1

FILESTREAM фактически не требует локального хранилища, а не сетевого хранилища SMB. ISCSI или Fibre Channel SAN отлично работают для хранения данных FILESTREAM. Вы также можете иметь несколько групп файлов файлов для каждой таблицы, что существенно разбивает ваши данные. Если вы строго ориентируетесь на SQL Server 2008, очень мало причин не использовать поток для больших двоичных данных. Существует технический документ Microsoft, описывающий разделение файловых систем здесь.

Ответ 2

Требования к тому на локальном диске

Не используйте локально в буквальном смысле слова. Хотя в действительности MSSQL должен "видеть" файловую группу (-и), связанную с данными FILESTREAM, как локальные диски, это хранилище часто предоставляется посредством NAS или других технологий хранения, которые обманывают Windows, думая, что это локальные диски NTFS (по путь iSCSI и т.д.). Это особенно актуально для корпоративных приложений с уровнем требуемого пространства.

При использовании FILESTREAM вообще...

Внимательно взвешивайте плюсы и минусы. В вашем вопросе упоминаются довольно большие (MB-размерные) образы (я предполагаю, что графические изображения, а не логические образы), что предполагает их довольно атомное использование. Для установки файлового сервера требуется управление внешними (SQL-серверами) и синхронизация, но это, по-видимому, относительно небольшая плата, чтобы сохранить вашу свободу, не столько в отношении SQL Server/Microsoft, но и для легче перемещать вещи для целей масштабирования/пропускной способности.

Ответ 3

Использование SQL Cluster не дает вам дополнительной доступности для хранения, поскольку кластеризация требует хранения SAN. Вы можете просто создать LUN или LUN для использования в качестве хранилища FILESTREAM на некластерном экземпляре.

Ответ 4

Постепенная реализация локального потока в sql server 2008

Настроить поток в sql-сервере:

  • Сначала перейдите в конфигурацию конфигурации SQL Server.
  • Щелкните правой кнопкой мыши на QL-сервере (SQLEXPRESS) и выберите свойства.
  • Выберите вкладку фильтрации и включите поток.

Выполните следующий script в SQL Server 2008:

EXEC sp_configure filestream_access_level, 2 RECONFIGURE

Создать базу данных для потока событий:

CREATE DATABASE MyFsDb 
ON
PRIMARY ( NAME = MyFsDat,
    FILENAME = 'c:\data\myfsdat.mdf'),
FILEGROUP MyFsGroup CONTAINS FILESTREAM( NAME = MyFs,
    FILENAME = 'c:\data\myfs1')
LOG ON  ( NAME = MyFsLog,
    FILENAME = 'c:\data\myfslog.ldf')
GO

Создать таблицу:

CREATE TABLE MyFsTable
(
  fId INT IDENTITY PRIMARY KEY,
  fData VARBINARY(MAX) FILESTREAM  NULL,
  fName NVARCHAR(300),
  RowGuid UNIQUEIDENTIFIER  NOT NULL  ROWGUIDCOL UNIQUE DEFAULT NEWID()
)

Процедура добавления данных в таблицу:

ALTER PROCEDURE [dbo].[uspAddFile]

@fData VARBINARY(Max),
@ fName varchar(50),

AS
BEGIN
INSERT INTO MyFsTable (fData, fName, RowGuid) VALUES (@Item, @ItemName, DEFAULT)
END

Позволяет добавить некоторые данные в таблицу из передней части с помощью С#:

Public void AddFile()
{
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionstring"].ToString();
                con = new System.Data.SqlClient.SqlConnection(connectionString);
                cmd = new System.Data.SqlClient.SqlCommand("uspAddFile", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@fData", SqlDbType.Binary).Value = GetByte(TempPath);
                cmd.Parameters.Add("@fName", SqlDbType.VarChar).Value = tempFile;
                con.Open();
                result = cmd.ExecuteNonQuery();
                con.Close();
}