2009-09-14 50 views
12

Estoy buscando el atributo FILESTREAM en SQL Server para almacenar archivos en él. Entiendo que almacena los archivos en el disco duro y almacena la información del puntero del archivo/ruta en DB. Además, mantiene la coherencia transaccional en el proceso.Límite de SQL Server FILESTREAM

También parece haber una limitación "Los datos de FILESTREAM se pueden almacenar solo en volúmenes de discos locales" para el atributo FILESTREAM.

Si anticipo que mi aplicación web almacenará 200,000 imágenes de 1 a 300 m cada una, necesitaría alrededor de 200 gb de espacio en el disco duro para almacenar las imágenes. Dado que FILESTREAM requiere que todos los datos se almacenen solo en el disco local según la limitación, sería imposible almacenar millones de archivos en un solo disco duro, ya que los requisitos de almacenamiento serían extremadamente grandes.

¿Mi comprensión de la limitación es correcta o me falta algo aquí?

Si esta limitación es correcta, en cambio la almacenaría en db como blob simple y agruparía mi DB para aumentar los requisitos de almacenamiento, lo que no parece posible con FILESTREAM.

Por favor, ¡comparta sus ideas!

Actualizado:
pocos más preguntas acerca de FILESTREAM: -

  1. cómo manejar la recuperación de datos en caso de corrupción contenedor de datos?
  2. ¿Podemos simplemente hacer una copia de seguridad de la base de datos sin los datos del sistema de archivos? [Datos asumiendo está en SAN, que no necesitan ser movidos]
  3. me gustaría una copia de seguridad o restaurar el PP y simplemente volver a asignar el grupo de archivos información de la ruta [que los mapas de SAN]. ¿Esto es posible?

Respuesta

18

FILESTREAM en realidad no requiere almacenamiento local, simplemente no el almacenamiento en red SMB. Una SAN iSCSI o Fibre Channel funciona bien para almacenar datos de FILESTREAM. También puede tener múltiples grupos de archivos filestream por tabla, esencialmente particionando sus datos. Si se dirige estrictamente al servidor sql 2008, hay muy pocas razones para no utilizar filestream para grandes datos binarios. Hay un documento técnico de Microsoft que describe la partición de filestream here.

+0

@ Jeff: gran post! Ha dado mucha claridad y algunas preguntas más, que he actualizado. – pencilslate

4

En cuanto al requisito local de volumen de disco

No tome locales a literalmente. Si bien es un requisito que MSSQL "vea" los grupos de archivos asociados con los datos de FILESTREAM como unidades locales, este almacenamiento a menudo se proporciona a través de NAS u otras tecnologías de almacenamiento que engañan a Windows haciéndole creer que son discos NTFS locales (por camino de iSCSI y tal). Esto es particularmente cierto con aplicaciones empresariales, con el nivel de espacio requerido que mencione.

Sobre el uso de FILESTREAM en absoluto ...

pesan los pros y los contras cuidadosamente. Su pregunta menciona imágenes bastante grandes (tamaño MB) (estoy asumiendo imágenes gráficas, no imágenes de tipo lógico), lo que implica un uso bastante atómico de ellas.Una configuración de servidor de archivos requeriría una administración y sincronización externas (a SQL Server), pero esto parece ser un costo relativamente pequeño para mantener su libertad, no tanto frente a SQL Server/Microsoft, sino también su capacidad para mueve las cosas más fácilmente para propósitos de escala/ancho de banda.

+0

@mjv: la libertad de mover cosas es la principal preocupación. ¿Qué pasaría durante la corrupción del contenedor de datos? ¿Posibilidad de hacer solo una copia de seguridad de la base de datos y luego reasignar la ruta del grupo de archivos? estas son unas pocas preguntas más que se basaron en su explicación. – pencilslate

+1

@pencilslate: SQL Server está administrando efectivamente el almacén de datos FILESTREAM (FS), por lo que la copia de seguridad para las tiendas FS es parte del modelo de copia de seguridad/recuperación de SQL. Se pueden excluir explícitamente las ubicaciones de almacenamiento relacionadas con FS de la copia de seguridad de SQL normal y administrar esta copia de seguridad de forma externa; hacerlo tiende a frustrar el propósito, por lo que uno tiene que elegir entre una copia de seguridad/restauración ridículamente grande o la administración manual de planes de recuperación separados ... Entonces, a menos que haya beneficios convincentes para integrar los dos géneros de datos, un sistema de repositorio completamente externo puede ser preferible – mjv

+1

[cont.] Con la solución no FS, una posible estrategia de recuperación para los datos de tipo FS es tener dos repositorios en línea, en distintas ubicaciones físicas. Estos repositorios se actualizan en paralelo, lo que minimiza la necesidad de una copia de seguridad de "cinta" frecuente. El repositorio secundario no solo sirve como copia de seguridad, sino como servidor de reserva. Esto es particularmente interesante cuando los datos almacenados son imágenes, pdfs y otros contenidos que se comprimen mal, y por lo tanto, se requiere una cantidad similar de almacenamiento para la copia de seguridad formal o esta configuración espejo. – mjv

2

El uso de un clúster SQL no ofrece ninguna disponibilidad de almacenamiento adicional, ya que la agrupación en clúster requiere almacenamiento en SAN. Simplemente puede crear un LUN o LUN para usar como almacenamiento FILESTREAM en una instancia no agrupada también.

+0

@mrdenny: ¿Puedo hacer solo una copia de seguridad de la base de datos y reasignar los LUN después de la restauración de db, evitando así la necesidad de hacer una copia de seguridad de los datos del sistema de archivos? – pencilslate

+0

Si está utilizando FILESTREAM, entonces cuando haga una copia de seguridad de la base de datos también se realizarán copias de seguridad de los archivos. – mrdenny

1

implementación paso a paso de filestream local en el servidor SQL 2008

Configurar filestream en el servidor SQL:

  1. Primera Ir a la configuración del servidor SQL manejar.
  2. Haga clic con el botón derecho en el servidor QL (SQLEXPRESS) y seleccione propiedades.
  3. Seleccione la pestaña filestream y active filestream.

Ejecutar siguiente secuencia de comandos en el servidor SQL 2008:

EXEC sp_configure filestream_access_level, 2 RECONFIGURE 

Crear base de datos para 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 

crear tabla:

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

Procedimiento para agregar datos en la tabla:

ALTER PROCEDURE [dbo].[uspAddFile] 

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

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

vamos a añadir algunos datos en la tabla de la parte delantera con 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(); 
} 
Cuestiones relacionadas