You are on page 1of 11

Introduction FILESTREAM avec SQL Server 2008

par David BARBARIN (http://mikedavem.developpez.com/) (Blog)


Date de publication : 17 septembre 2009
Dernire mise jour :

FILESTREAM est une nouvelle fonctionnalit de la version 2008 de SQL Server qui
permet de rpondre certaines lacunes des versions prcdentes concernant les donnes
volumineuses, en particulier les fichiers et documents d'entreprise. Le nouveau mode de
stockage tend la limite maximum des 2 Go, amliore les performances du moteur SQL et
introduit l'intgrit rfrentielle des donnes hberges.

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

I - Introduction..............................................................................................................................................................3
II - Type de donnes et FILESTREAM....................................................................................................................... 3
III - Cache systme windows...................................................................................................................................... 3
IV - Installation et configuration...................................................................................................................................3
V - Utilisation de FILESTREAM.................................................................................................................................. 5
VI - Ajout de donnes avec FILESTREAM................................................................................................................. 6
VII - Manipulation des donnes FILESTREAM........................................................................................................... 8
VIII - Recherche Full Text avec FILESTREAM......................................................................................................... 10
IX - Sauvegardes et restauration avec FILESTREAM.............................................................................................. 10
X - Points importants................................................................................................................................................. 10
XI - Bonnes pratiques................................................................................................................................................11
XII - Conclusion......................................................................................................................................................... 11

-2Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

I - Introduction
A l'origine les bases de donnes taient conues pour stocker des donnes discrtes. Cependant la varit des
donnes utilises dans les entreprises a fait que le besoin de consolider ces donnes dans un seul type de stockage
est devenu important. On parle ici de mutualisation de stockage. SQL Server 2008 rpond cette problmatique en
proposant une nouvelle fonctionnalit : FILESTREAM.

II - Type de donnes et FILESTREAM


Tout d'abord il est important de prciser que FILESTREAM n'est pas un type de donnes mais une proprit associe
une colonne.
Avant SQL Server 2008, les donnes non structures comme les fichiers ou les images taient stockes avec un
type de donnes tel que VARBINARY(MAX), VARCHAR(MAX) ou bien NVARCHAR(MAX). Par consquent la taille
maximum de stockage tait de 2 Go. Les fichiers au del de cette taille taient alors stocks directement sur le
systme de fichiers et un lien tait insr dans la base de donnes, ce qui pouvait poser des problmes d'intgrit
des donnes car aucun mcanisme de vrification n'existait.
A partir de SQL Server 2008 le stockage des donnes FILESTREAM se fait par l'intermdiaire d'un type de donnes
VARBINARY(MAX). Les fichiers ne sont plus stockes dans la base mais directement sur le systme de fichiers. Un
pointeur de 16 octets vers ce mme fichier est stock dans la base de donnes. Un premier avantage est que la taille
des fichiers n'est plus limite par le type de donnes VARBINARY(MAX) mais directement par le systme de fichiers
lui-mme. Un deuxime avantage est que le cache systme de Windows est utilis la place du cache des donnes
du moteur SQL limitant ainsi l'impact direct sur les performances du serveur SQL. Cela implique galement que les
performances lies FILESTREAM sont directement dpendants du sous systme disque sur lequel il rside.

III - Cache systme windows


Parlons rapidement du cache systme Windows. Celui-ci contribue l'amlioration des performances disque en
gardant en mmoire les fichiers les plus rcemment consults. Il est galement li au gestionnaire de mmoire et
possde 2 modes de fonctionnement :
- Le mode par dfaut qui consiste limiter la croissance du cache 8MB. Ce mode convient parfaitement pour
les stations de travail o seuls quelques applications et fichiers non volumineux sont en jeux (par dfaut activ sur
windows XP).
- L'autre mode qui permet au cache de s'agrandir jusqu' occuper toute la mmoire du systme. Il est possible de
limiter l'accroissement une taille maximum. Ce mode convenant plus aux serveurs dans le cas d'utilisation de
fichiers volumineux comme FILESTREAM (par dfaut activ sur Windows Server 2003).

IV - Installation et configuration
Par dfaut FILESTREAM est dsactiv lors de l'installation de SQL Server. Il est possible d'activer cette fonctionnalit
de plusieurs faons :

A l'installation classique de SQL Server


Pendant une installation silencieuse par script
Aprs l'installation de SQL Server. Dans ce cas l'activation du stockage FILESTREAM demandera un peu
plus de paramtrages.

La 1re tape consiste activer FILESTREAM par le gestionnaire de configuration de SQL Server en allant dans
les proprits du service SQL Server ou par la commande TSQL sp_filestream_configure. Il existe plusieurs niveaux
d'accs :

-3Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

Activer FILESTREAM pour l'accs TSQL : Ce niveau d'accs permet la gestion des donnes FILESTREAM
directement par le langage TSQL.
Activer FILESTREAM pour l'accs en continu aux E/S de fichier : Ce niveau d'accs permet la gestion
des donnes FILESTREAM et par TSQL et par l'API Win32 mais en local sur le serveur. Un nom partage
Windows sera galement configur.
Autoriser les clients distants avoir un accs en continu aux donnes FILESTREAM : Ce dernier
niveau d'accs permet l'accs aux fichiers par TSQL et par l'API Win32 pour les clients distants.

Activation de FILESTREAM par le gestionnaire de configuration :

... ou par la commande TSQL sp_filestream_configure :


EXEC sp_filestream_configure
@enable_level = 3,
@share_name = "MSSQLSERVER";
RECONFIGURE

Dans le cas d'une activation FILESTREAM post-installation il faut galement configurer les niveaux d'accs au niveau
de l'instance SQL Server soit par la console SSMS dans les proprits du serveur soit directement par la commande
TSQL sp_configure.

-4Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
EXEC sp_configure 'filestream_access_level', 2;
GO
RECONFIGURE
GO

Les valeurs que peut prendre l'option "filestream access level" sont :

0 : (FILESTREAM dsactive)
1 : (FILESTREAM activ pour TSQL)
2 : (FILESTREAM activ pour TSQL et Win32)

V - Utilisation de FILESTREAM
Pour utiliser FILESTREAM, il faut crer et allouer un groupe de fichiers spcial. Celui-ci peut tre cr la cration
de la base de donnes ou ajout si la base de donnes existe dj. La clause CONTAINS FILESTREAM doit tre
utilise lors de la cration du groupe de fichiers pour FILESTREAM.
CREATE DATABASE [filestream_database]
ON PRIMARY
( NAME = N'filestream_data', FILENAME = N'E:\MSSQL\DATA\filestream_data.mdf' , SIZE = 102400KB ,
MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB ),
FILEGROUP [FILESTREAM_GRP] CONTAINS FILESTREAM DEFAULT
( NAME = N'filestream_ds', FILENAME = N'E:\MSSQL\FILESTREAM' )
LOG ON
( NAME = N'filestream_log', FILENAME = N'E:\MSSQL\DATA\filestream.ldf' , SIZE = 51200KB , MAXSIZE =
2048GB , FILEGROWTH = 20480KB )
GO

Pour un groupe de fichiers FILESTREAM, FILENAME fait rfrence un chemin d'accs. Tous les dossiers
constituant le chemin doivent exister sauf le dernier. Dans le cas de l'exemple ci-dessus, le dossier FILESTREAM
ne doit pas exister.
La requte suivante permet de vrifier la cration du groupe de fichiers de stockage FILESTREAM_GRP pour la
base de donnes filestream_database :
USE filestream_database;
GO
SELECT
m.file_id,
m.type_desc,
g.name AS [filegroup_name],
m.name AS [file_name],
m.physical_name
FROM sys.master_files m
INNER JOIN sys.filegroups g
ON m.data_space_id = g.data_space_id
WHERE database_id = DB_ID();

et qui donne le rsultat suivant :

-5Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

De plus, une structure contenant un ensemble de dossiers et de fichiers est cre.

Le fichier filestream.hdr est un fichier systme important car il contient les informations d'en-ttes du stockage
FILESTREAM. Il ne doit pas tre supprim. Le dossier $FSLOG est, quant lui, l'quivalent du journal des
transactions d'une base de donnes pour FILESTREAM. Cette nouvelle fonctionnalit supporte et gre la notion de
transaction applique aux mme donnes relationnelles.

VI - Ajout de donnes avec FILESTREAM


Une fois que le stockage FILESTREAM est dfini un groupe de fichiers, il faut ensuite crer une table qui stockera
les donnes. Pour illustrer l'article une table [documents] sera cre dans laquelle divers documents seront stocks
(Documents office, images et NTEXT).
CREATE TABLE [dbo].[Documents](
[DocID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[DocNumber] [varchar](20) NULL,
[DocName] [varchar](50) NULL,
[DocDescription] [varchar](50) NOT NULL,
[DocExtension] [varchar](50) NOT NULL,
[Doc] [varbinary](max) FILESTREAM NULL
UNIQUE NONCLUSTERED ([DocID] ASC)
)
ON [PRIMARY]
FILESTREAM_ON [FILESTREAM_GRP];

Plusieurs remarques sont faire sur la cration de cette table :

Colonne [DocID] : Les donnes de cette colonne sont de type uniqueidentifier. Ceci est ncessaire pour
l'utilisation de FILESTREAM avec l'API Win32.
Colonne [DocExtension] : Cette colonne contiendra les extensions d'un document insr. Elle est utile pour la
recherche FullText (Voir plus loin dans l'article).
Colonne [Doc] : Cette colonne stockera les documents. Elle est de type VARBINARY(MAX) et possde la
proprit FILESTREAM.
Utilisation de la clause FILESTREAM_ON qui dfinit le stockage des documents sur le groupe de fichiers
ddi que l'on a cr prcdemment.

Il faut maintenant insrer des documents dans la table [Documents]. Il s'agit de 3 documents de la suite microsoft
Office .
-6Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

Document office Word 2007 avec pour contenu la phrase "Document office Word"
-- Variable de type image
DECLARE @img AS VARBINARY(MAX)
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Word.docx', SINGLE_BLOB) AS x
Insertion des documents dans la table
Document word 2007
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc1','word','Document office word','.docx', @img);

Document office Excel 2007 avec pour contenu la phrase "Document office Excel 2007"
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Excel.xlsx', SINGLE_BLOB) AS x
Insertion des documents dans la table
Document excel 2007
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc2','excel','Document office excel','.xlsx', @img);

Document office Excel 2003 avec pour contenu la phrase "Document office Excel 2003"
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Excel.xls', SINGLE_BLOB) AS x
-- Insertion des documents dans la table
-- Document excel 2003
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc3','excel 2003','Document office excel 2003','.xls', @img);

-7Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

Image jpeg :
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\image.jpg', SINGLE_BLOB) AS x
--Insertion des documents dans la table Image jpeg
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'img1','image1','Image Jpeg','.jpg', @img);

Il est galement possible de crer un document directement en utilisant la commande INSERT :


INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'text1','text','ntext type','', CAST('test type ntext' AS VARBINARY));

VII - Manipulation des donnes FILESTREAM


Pour slectionner les donnes de la table [Documents] l'aide de TSQL il suffit d'excuter une simple requte SQL :
SELECT * FROM dbo.Documents;

Voici le rsultat :

Cependant la manipulation des donnes FILESTREAM l'aide du langage TSQL est limite. Il permet de manipuler
des donnes FILESTREAM en utilisant les ordres DML classiques (INSERT, UPDATE, DELETE).
SQL Server fournit galement 2 autres mthodes utilisables directement via l'API Win32 pour la manipulation des
fichiers par une application cliente :

-8Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

PathName() : Avant d'accder au fichier une application cliente doit connatre le chemin d'accs de ce
fichier. Cette mthode retourne le chemin d'accs en tant que jeton un objet blob directement utilisable par
l'application cliente.
SELECT
DocName,
Doc.PathName() AS DocPath
FROM dbo.Documents;

donnera :

GET_FILESTREAM_TRANSACTION_CONTEXT() : L'accs aux fichiers se fait par la classe


SQLFileStream de l'API Win32. Il est possible de manipuler un fichier dans le contexte d'une
transaction. Cela peut tre utile pour lancer un ROLLBACK en cas de problme sur un fichier. Pour
pouvoir accder au systme de fichiers dans le contexte d'une transaction il faut utiliser la mthode
GET_FILESTREAM_TRANSACTION_CONTEXT(). Celle-ci retourne un jeton qui reprsente le contexte
de transaction actuel d'une session. Le jeton est utilis par l'application Win32 pour lier des oprations de
diffusion en continu de systme de fichiers FILESTREAM la transaction.

Extrait d'un code client permettant la rcupration d'un fichier avec FILESTREAM
Imports System
Imports System.IO
Imports System.Text
'Chaine de connexion la base
Dim ConStr As String
ConStr = "Data Source=SRV-SQL2008;Initial Catalog=filestream_database;Integrated Security=True"
Dim con As New SqlConnection(ConStr)
con.Open()
' Slection du document Word 2007
Dim sqlCommand As New SqlCommand()
sqlCommand.Connection = con
sqlCommand.CommandText = "SELECT Doc FROM dbo.Documents WHERE DocID = 'doc1'"
Dim buffer As Byte() = sqlCommand.ExecuteScalar()
' Utilisation de la mmoire comme magasin de stockage du fichier
Dim ms As MemoryStream = New MemoryStream(buffer)
' ... Traitement du document
'Fermeture connexion
con.Close()

-9Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

VIII - Recherche Full Text avec FILESTREAM


La recherche FULL TEXT avec SQL Server 2008 prend en charge l'indexation et la recherche des fichiers du
stockage FILESTREAM. Cette fonctionnalit est intressante car elle permet la recherche de mots cls l'intrieur
d'un document. Le but de cet article n'tant pas d'expliquer comment fonctionne la recherche FULL TEXT, on
s'attachera simplement expliquer comment effectuer une recherche. Les 2 exemples suivants illustrent l'utilisation
des mthodes FREETEXT et CONTAINS.

SELECT *
FROM dbo.Documents
WHERE FREETEXT (Doc, 'Excel')

donne le rsultat suivant :

SELECT *
FROM dbo.Documents
WHERE CONTAINS (Doc, '"FILESTREAM" AND "WORD"')

donne le rsultat suivant :

IX - Sauvegardes et restauration avec FILESTREAM


Tous les types de sauvegarde et tous les modes de rcupration utiliss avec SQL Server fonctionnent galement
pour FILESTREAM. Les donnes FILESTREAM sont sauvegardes au mme titre que les donnes relationnelles
dans les fichiers relatifs aux sauvegardes. Il en va de mme pour les oprations de restauration. Les donnes sont
restaurs la fois dans la base de donnes et sur le systme de fichiers hte.

X - Points importants

FILESTREAM ne peut pas tre utilis en mirroring, ce qui peut tre regrettable pour des environnements de
haute disponibilit.
Des topologies de rplication ou de log shipping avec FILESTREAM ncessitent l'utilisation d'une version
SQL Server 2008 pour tous les serveurs et/ou ordinateurs concerns.
Dans un environnement cluster, le groupe de fichiers de stockage pour FILESTREAM doit se trouver sur un
disque partag.

- 10 Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)

FILESTREAM ne fonctionne pas avec les snapshots de bases de donnes. L'accs aux donnes causera
une erreur dans ce cas.
L'instance SQL Server doit tre configure avec la scurit intgre Windows pour FILESTREAM si le niveau
d'accs configur autorise la manipulation des donnes via l'API Win32.

XI - Bonnes pratiques
Microsoft, dans sa documentation, prconise certaines bonnes pratiques adopter concernant la configuration et la
maintenance des volumes NTFS pour FILESTREAM. Voici les plus importantes :

Dsactiver les noms courts (ou noms 8.3) .


Dfragmenter rgulirement les volumes contenant les donnes FILESTREAM.
Utiliser de prfrence des clusters NTFS de 64Ko.
Dsactiver l'indexation des fichiers Windows.
Dsactiver l'analyse antivirale ou adopter des rgles d'exclusion sur les fichiers FILESTREAM.
Choisir un sous systme disque performant (Technologie RAID5 ou RAID 1+0 par exemple)

XII - Conclusion
SQL Server 2008 avec FILESTREAM propose de nouvelles fonctionnalits quant la gestion des donnes non
relationnelles. Cette nouvelle technologie apporte des avantages non ngligeables comme la capacit de stockage de
donnes htrognes, la gestion des fichiers directement par le cache systme Windows pour plus de performances
ou encore la garantie d'intgrit des donnes par une gestion transactionnelle de ces fichiers. FILESTREAM ouvre
donc la voie de futurs dveloppements d'applications intressants !!

- 11 Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/

You might also like