2009-09-14 20 views
12

Sto guardando l'attributo FILESTREAM in SQL Server per archiviare i file in esso. Capisco che memorizza i file sul disco rigido e memorizza le informazioni sul puntatore/percorso del file in DB. Inoltre, mantiene la coerenza transazionale nel processo.Limitazione FILESTREAM SQL Server

Sembra esserci anche una limitazione "I dati FILESTREAM possono essere memorizzati solo su volumi disco locali" per l'attributo FILESTREAM.

Se prevedo che la mia app Web memorizza 200.000 immagini di 1-2mb ciascuna, richiederei circa 200 GB di spazio su disco per archiviare le immagini. Poiché, FILESTREAM richiede che tutti i dati vengano archiviati solo su disco locale come per la limitazione, sarebbe impossibile archiviare milioni di file su un singolo disco rigido, poiché i requisiti di archiviazione sarebbero estremamente ampi.

La mia comprensione della limitazione è corretta o mi manca qualcosa qui?

Se questa limitazione è corretta, la memorizzerei invece in db come blob normale e clusteri il mio DB per aumentare i requisiti di archiviazione, cosa che non sembra possibile con FILESTREAM.

Si prega di condividere i tuoi pensieri!

aggiornamento:
qualche altra domanda riguardo FILESTREAM: -

  1. come gestire il recupero dei dati in caso di corruzione contenitore di dati?
  2. È sufficiente eseguire il backup del DB senza i dati del file system? [supponendo che i dati siano in SAN, che non devono essere spostati]
  3. Vorrei eseguire il backup o il ripristino del DB e rimappare semplicemente le informazioni sul percorso del filegroup [che mappa su SAN]. È possibile?

risposta

18

FILESTREAM in realtà non richiede l'archiviazione locale, solo l'archiviazione di rete SMB. Una SAN iSCSI o Fibre Channel funziona bene per memorizzare i dati FILESTREAM. È inoltre possibile avere più gruppi di file di flusso di file per tabella, in pratica partizionando i dati. Se si sta eseguendo rigorosamente il targeting di SQL Server 2008, c'è ben poca ragione per non utilizzare il filestream per dati binari di grandi dimensioni. C'è un whitepaper di Microsoft che descrive il partestaggio del filestream here.

+0

@Jeff: Grande post! Ha dato molta chiarezza e poche altre domande, che ho aggiornato. – pencilslate

4

Sul requisito volume del disco locale

Non prendere locale letteralmente. Mentre è davvero un requisito che MSSQL dovrebbe "vedere" il filegroup associato ai dati FILESTREAM come unità locali, questo storage viene spesso fornito tramite NAS o altre tecnologie di archiviazione che inducono Windows a pensare che si tratti di dischi NTFS locali (da modo di iSCSI e così via). Questo è particolarmente vero con le applicazioni aziendali, con il livello di spazio richiesto.

On utilizzando FILESTREAM a tutti ...

Do pesare i pro ei contro con attenzione. La tua domanda menziona immagini piuttosto grandi (dimensioni MB) (sto assumendo immagini grafiche, non immagini logiche di sorta), il che implica un uso piuttosto atomico di esse.Un'installazione di file server richiede una gestione e sincronizzazione esterna (a SQL server), ma questo sembra essere un costo relativamente piccolo da pagare per mantenere la tua libertà, non tanto nei confronti di SQL Server/Microsoft, ma anche la tua capacità di spostare le cose più facilmente per scopi di ridimensionamento/larghezza di banda.

+0

@mjv: La libertà di spostare le cose è la preoccupazione principale. Cosa accadrebbe durante la corruzione dei contenitori di dati? Possibilità di eseguire solo il backup del DB da solo e successivamente rimappare il percorso del filegroup? queste sono alcune altre domande che sono basate sulla tua spiegazione. – pencilslate

+1

@pencilslate: SQL server gestisce efficacemente i datastore FILESTREAM (FS), quindi il backup per gli archivi FS fa parte del modello di backup/recupero SQL. È possibile escludere esplicitamente le posizioni di archiviazione correlate a FS dal normale backup SQL e gestire esternamente questo backup; così facendo si tende a sconfiggere lo scopo, quindi si deve scegliere tra il backup/ripristino ridicolmente grande o la gestione manuale di piani di recupero separati ... Quindi, a meno che non ci siano vantaggi convincenti nell'integrazione dei due generi di dati, un sistema di repository completamente esterno potrebbe semplicemente essere preferibile – mjv

+1

[cont.] Con la soluzione non-FS una possibile strategia di recupero per i dati di tipo FS consiste nell'avere due repository online, in posizioni fisiche distinte. Questi repository sono aggiornati in parallelo, riducendo al minimo la necessità di frequenti backup "su nastro". Il repository secondario non serve solo come backup, ma come server di stand-by. Ciò è particolarmente interessante quando i dati memorizzati sono immagini, pdf e altri contenuti che si comprimono in modo insufficiente e pertanto è necessaria una quantità simile di spazio di archiviazione per il backup formale o l'installazione di questo mirror. – mjv

2

L'utilizzo di un cluster SQL non offre alcuna ulteriore disponibilità di archiviazione in quanto il clustering richiede l'archiviazione SAN. È possibile semplicemente creare un LUN o LUN da utilizzare come memoria FILESTREAM su un'istanza non cluster.

+0

@mrdenny: Posso solo eseguire il backup del db da solo e rimappare i LUN dopo il ripristino di db, evitando così la necessità di eseguire il backup dei dati del filesystem? – pencilslate

+0

Se si sta utilizzando FILESTREAM, quando si esegue il backup del database verrà eseguito anche il backup dei file. – mrdenny

1

implementazione passo-passo di filestream locale in SQL Server 2008

Configura filestream in SQL Server:

  1. Inizio Vai alla configurazione del server SQL gestire.
  2. Fare clic con il pulsante destro del mouse sul server QL (SQLEXPRESS) e selezionare Proprietà.
  3. Selezionare la scheda filestream e abilitare il filestream.

Esegui seguente script in SQL Server 2008:

EXEC sp_configure filestream_access_level, 2 RECONFIGURE 

CREATE DATABASE per 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 

Crea tabella:

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

procedura per aggiungere i dati in tabella:

ALTER PROCEDURE [dbo].[uspAddFile] 

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

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

aggiungiamo alcuni dati nella tabella da front-end utilizzando 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(); 
} 
Problemi correlati