SQL Server FILESTREAM ограничение - PullRequest
       30

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

13 голосов
/ 14 сентября 2009

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

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

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

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

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

Пожалуйста, поделитесь своими мыслями!

ОБНОВЛЕНИЕ:
Еще несколько вопросов, касающихся FILESTREAM: -

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

Ответы [ 4 ]

19 голосов
/ 14 сентября 2009

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

4 голосов
/ 14 сентября 2009

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

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

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

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

2 голосов
/ 14 сентября 2009

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

1 голос
/ 27 августа 2014

Пошаговая реализация локального файлового потока в SQL Server 2008

Настройка файлового потока на сервере sql:

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

Выполнить следующий сценарий в 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

Давайте добавим некоторые данные в таблицу из внешнего интерфейса, используя C #:

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();
}
...