2009-09-14 2 views
12

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

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

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

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

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

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

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

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

ответ

18

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

+0

@Jeff: Великий пост! Он дал много ясности и еще несколько вопросов, которые я обновил. – pencilslate

4

По требованию местного объема диска

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

Об использовании FILESTREAM на всех ...

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

+0

@mjv: свобода передвигаться вокруг - главная проблема. Что произойдет при повреждении контейнера данных? Возможность просто резервировать базу данных самостоятельно и позже переназначить путь файловой группы? это несколько вопросов, которые поддерживаются на основе ваших объяснений. – pencilslate

+1

@pencilslate: SQL-сервер эффективно управляет хранилищем данных FILESTREAM (FS), поэтому резервная копия для хранилищ FS является частью модели резервного копирования/восстановления SQL. Можно явно исключить связанные с FS места хранения из обычной резервной копии SQL и управлять этой резервной копией извне; это делает так, чтобы победить цель, поэтому нужно выбирать между смехотворно большим резервным копированием/восстановлением или ручным управлением отдельными планами восстановления ... Итак, если нет особых преимуществ для интеграции двух жанров данных, полностью внешняя система репозитория может просто предпочтительнее. – mjv

+1

[продолжение] В решении, не относящемся к FS, возможной стратегией восстановления для данных типа FS является наличие двух онлайновых репозиториев в разных физических местах. Эти репозитории обновляются параллельно, что сводит к минимуму необходимость в частом резервном копировании на ленту. Вторичный репозиторий не только служит резервным, но и резервным сервером. Это особенно интересно, когда хранящиеся данные представляют собой изображения, pdf-файлы и другой контент, которые плохо сжимаются, поэтому для формального резервного копирования или настройки этого зеркала требуется одинаковый объем памяти. – mjv

2

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

+0

@mrdenny: Могу ли я просто создать резервную копию только db и переназначить LUN после восстановления db, тем самым избегая необходимости резервного копирования данных файловой системы? – pencilslate

+0

Если вы используете FILESTREAM, то при резервном копировании базы данных файлы также будут скопированы. – mrdenny

1

Шаг за шагом реализации местного FileStream В SQL Server 2008

Настройка FileStream в SQL Server:

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

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

EXEC sp_configure filestream_access_level, 2 RECONFIGURE 

Создание базы данных для FileStream:

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(); 
} 
Смежные вопросы