Megosztás a következőn keresztül:


FILESTREAM (SQL Server)

A következőkre vonatkozik:SQL Server – csak Windows

A FILESTREAM lehetővé teszi, hogy az SQL Server-alapú alkalmazások strukturálatlan adatokat, például dokumentumokat és képeket tároljanak a fájlrendszerben. Az alkalmazások használhatják a gazdag streamelési API-kat és a fájlrendszer teljesítményét, ugyanakkor fenntarthatják a tranzakciós konzisztenciát a strukturálatlan adatok és a megfelelő strukturált adatok között.

A FILESTREAM integrálja az SQL Server adatbázismotort EGY NTFS vagy ReFS fájlrendszerrel a varbinary(max) bináris nagyméretű objektum (BLOB) adatainak fájlként való tárolásával a fájlrendszeren. Transact-SQL utasítások beszúrhatnak, frissíthetnek, lekérdezhetnek, kereshetnek és biztonsági másolatot készíthetnek a FILESTREAM-adatokról. A Win32 fájlrendszer felületei streamelési hozzáférést biztosítanak az adatokhoz.

A FILESTREAM az NT-rendszer gyorsítótárát használja a fájladatok gyorsítótárazására. A fájlok gyorsítótárban való gyorsítótárazása segít csökkenteni a FILESTREAM-adatoknak az adatbázismotor teljesítményére gyakorolt hatását. Az SQL Server pufferkészlete nincs használatban; ezért ez a memória elérhető a lekérdezések feldolgozásához.

Az SQL Server telepítésekor vagy frissítésekkor a FILESTREAM nem lesz automatikusan engedélyezve. Engedélyeznie kell a FILESTREAM szolgáltatást az SQL Server Configuration Manager és az SQL Server Management Studio használatával. A FILESTREAM használatához létre kell hoznia vagy módosítania kell egy adatbázist, hogy egy speciális fájlcsoporttípust tartalmazzon. Ezután hozzon létre vagy módosítsa a táblázatot úgy, hogy az tartalmaz egy varbinary(max) oszlopot a FILESTREAM attribútummal. A feladatok elvégzése után Transact-SQL és Win32 használatával kezelheti a FILESTREAM-adatokat.

Mikor érdemes használni a FILESTREAM-et?

Az SQL Serverben a BLOB-k lehetnek standard varbinary(max) adatok, amelyek táblákban tárolják az adatokat, vagy a fájlrendszerben tárolt FILESTREAM varbinary(max) objektumok. Az adatok mérete és használata határozza meg, hogy adatbázis- vagy fájlrendszertárolót kell-e használnia. Ha a következő feltételek teljesülnek, érdemes megfontolni a FILESTREAM használatát:

  • A tárolt objektumok átlagosan 1 MB-nál nagyobbak.
  • Fontos a gyors olvasási hozzáférés.
  • Olyan alkalmazásokat fejleszt, amelyek egy középső réteget használnak az alkalmazáslogikához.

Kisebb objektumok esetén a varbinary(max) BLOB-k tárolása az adatbázisban gyakran jobb streamelési teljesítményt biztosít.

FILESTREAM Storage

A FILESTREAM storage varbinary(max) oszlopként van implementálva, amelyben az adatok BLOB-ként lesznek tárolva a fájlrendszerben. A BLOB-k méretét csak a fájlrendszer kötetmérete korlátozza. A 2 GB-os fájlméretek standard varbinary(max) korlátozása nem vonatkozik a fájlrendszerben tárolt BLOB-okra.

Ha meg szeretné adni, hogy egy oszlop adatokat tároljon a fájlrendszerben, adja meg a FILESTREAM attribútumot egy varbinary(max) oszlopban. Ez az attribútum azt eredményezi, hogy az adatbázismotor az adott oszlop összes adatát a fájlrendszerben tárolja, az adatbázisfájlban azonban nem.

A FILESTREAM-adatokat FILESTREAM-fájlcsoportokban kell tárolni. A FILESTREAM-fájlcsoport egy speciális fájlcsoport, amely a fájlok helyett fájlrendszerkönyvtárakat tartalmaz. Ezeket a fájlrendszerkönyvtárakat adattárolóknak nevezzük. Az adattárolók az adatbázismotor tárolói és a fájlrendszer-tárolók közötti interfészek.

A FILESTREAM Storage használata esetén vegye figyelembe az alábbiakat:

  • Ha egy tábla FILESTREAM oszlopot tartalmaz, minden sornak nem null értékű egyedi sorazonosítóval kell rendelkeznie.
  • Több adattároló is hozzáadható egy FILESTREAM-fájlcsoporthoz.
  • A FILESTREAM-adattárolók nem ágyazhatók be.
  • Feladatátvételi fürtszolgáltatás használatakor a FILESTREAM fájlcsoportoknak megosztott lemezerőforrásokon kell lenniük.
  • A FILESTREAM-fájlcsoportok tömörített köteteken is lehetnek.

Integrált felügyelet

Mivel a FILESTREAM varbinary(max) oszlopként van implementálva, és közvetlenül az adatbázismotorba van integrálva, a legtöbb SQL Server felügyeleti eszköz és függvény módosítás nélkül működik a FILESTREAM-adatok esetében. Használhatja például az összes biztonsági mentési és helyreállítási modellt a FILESTREAM-adatokkal, a FILESTREAM-adatokat pedig az adatbázis strukturált adataival. Ha nem szeretne relációs adatokkal biztonsági másolatot készíteni a FILESTREAM-adatokról, részleges biztonsági mentéssel kizárhatja a FILESTREAM-fájlcsoportokat.

Integrált biztonság

Az SQL Serverben a FILESTREAM-adatok ugyanúgy védettek, mint a többi adat: a tábla- vagy oszlopszintek engedélyeinek biztosításával. Ha egy felhasználó rendelkezik engedéllyel egy tábla FILESTREAM oszlopához, a felhasználó megnyithatja a társított fájlokat.

Megjegyzés:

A TITKOSÍTÁS a FILESTREAM-adatokon nem támogatott.

Csak az a fiók kap engedélyt a FILESTREAM-tárolóhoz, amely alatt az SQL Server szolgáltatásfiók fut. Azt javasoljuk, hogy az adattárolóhoz más fiók ne kapjon engedélyeket.

Megjegyzés:

Az SQL-bejelentkezések nem működnek a FILESTREAM-tárolókkal. Csak AZ NTFS vagy a ReFS-hitelesítés működik a FILESTREAM-tárolókkal.

BLOB-adatok elérése Transact-SQL és fájlrendszeres streamelési hozzáféréssel

Miután egy FILESTREAM oszlopban tárolt adatokat, Transact-SQL tranzakciók vagy Win32 API-k használatával érheti el a fájlokat.

Transact-SQL Access

A Transact-SQL használatával FÁJLSTREAM-adatokat szúrhat be, frissíthet és törölhet:

  • Beszúrási művelettel előre feltölthet egy FILESTREAM mezőt null értékkel, üres értékkel vagy viszonylag rövid beágyazott adatokkal. Nagy mennyiségű adat azonban hatékonyabban streamelhető egy Win32-interfészeket használó fájlba.
  • A FILESTREAM mező frissítésekor módosítja a fájlrendszer mögöttes BLOB-adatait. A FILESTREAM mező beállításakor NULLa mezőhöz társított BLOB-adatok törlődnek. A .**Write() néven UPDATEimplementált Transact-SQL darabolt frissítés nem használható az adatok részleges frissítéséhez.
  • Ha töröl egy sort, vagy töröl vagy csonkít egy FILESTREAM-adatokat tartalmazó táblát, törli a mögöttes BLOB-adatokat a fájlrendszerben.

Fájlrendszer streamelési hozzáférése

A Win32 streamelési támogatása egy SQL Server-tranzakció kontextusában működik. A tranzakción belül a FILESTREAM függvények használatával lekérjük a fájl logikai UNC fájlrendszerének elérési útját. Ezután az OpenSqlFilestream API-val szerezhet be egy fájlleírót. Ezt a leírót ezután a Win32 fájlstreamelési felületei, például a ReadFile() és a WriteFile() használhatják a fájl fájlrendszeren keresztüli eléréséhez és frissítéséhez.

Mivel a fájlműveletek tranzakciósak, nem törölhet vagy nevezhet át FILESTREAM-fájlokat a fájlrendszeren keresztül.

Figyelmeztetés

A FILESTREAM-tároló az SQL Server által felügyelt mappa. Ne vegyen fel vagy távolítson el fájlokat a FILESTREAM mappában manuálisan vagy más alkalmazásokon keresztül. Ha így tesz, ez biztonsági mentési és inkonzisztencia-hibákat eredményez. További információ: MSSQLSERVER_3056, MSSQLSERVER_7908 és MSSQLSERVER_7906.

Utasításmodell

A FILESTREAM fájlrendszer hozzáférése Transact-SQL utasítást modell a fájlmegnyitás és -bezárás használatával. Az utasítás egy fájlleíró megnyitásakor kezdődik, és a leíró bezárásakor ér véget. Ha például egy írási leíró bezárul, a táblában regisztrált bármely lehetséges AFTER eseményindító úgy aktiválódik, mintha egy UPDATE utasítás befejeződött volna.

Tárnévtér

A FILESTREAM-ben az adatbázismotor vezérli a BLOB fizikai fájlrendszer-névterét. Egy új belső függvény, a PathName a blob logikai UNC elérési útját adja meg, amely megfelel a tábla összes FILESTREAM-cellájának. Az alkalmazás ezt a logikai útvonalat használja a Win32-leíró beszerzéséhez és a BLOB-adatokon való működéshez rendszeres Win32 fájlrendszer-interfészek használatával. A függvény akkor ad NULL vissza értéket, ha a FILESTREAM oszlop értéke .NULL

Átjátszott fájlrendszer-hozzáférés

Egy új belső függvény, a GET_FILESTREAM_TRANSACTION_CONTEXT biztosítja azt a jogkivonatot, amely a munkamenethez társított aktuális tranzakciót jelöli. A tranzakciót el kellett indítani, és még nem kellett megszakítania vagy véglegesítenie. Egy jogkivonat beszerzésével az alkalmazás egy elindított tranzakcióhoz köti a FILESTREAM fájlrendszer streamelési műveleteit. A függvény nem explicit módon indított tranzakció esetén ad vissza NULL .

A tranzakció véglegesítése vagy megszakítása előtt minden fájlleírót le kell zárni. Ha egy leíró nyitva marad a tranzakció hatóköre mellett, a leíróra vonatkozó további beolvasások hibát okoznak; a leírón végzett további írások sikeresek, de a tényleges adatok nem lesznek lemezre írva. Hasonlóképpen, ha az adatbázis vagy az adatbázismotor példánya leáll, az összes nyitott leíró érvénytelen lesz.

Tranzakciós tartósság

A FILESTREAM használatával a tranzakció véglegesítésekor az adatbázismotor biztosítja a fájlrendszer streamelési hozzáféréséből módosított FILESTREAM BLOB-adatok tranzakciós tartósságát.

Elkülönítési szemantikák

Az elkülönítési szemantikát az adatbázismotor tranzakcióelkülönítési szintjei szabályozzák. Az írásvédett elkülönítési szint támogatott a Transact-SQL és a fájlrendszerhez való hozzáféréshez. Az ismétlődő olvasási műveletek, a szerializálható és a pillanatkép-elkülönítési szintek támogatottak. A piszkos olvasás nem támogatott.

A fájlrendszer hozzáférési műveletei nem várnak zárolásra. Ehelyett a nyitott műveletek azonnal meghiúsulnak, ha tranzakcióelkülönítés miatt nem férnek hozzá az adatokhoz. A streamelési API-hívások meghiúsulnak ERROR_SHARING_VIOLATION, ha a nyitott művelet nem folytatható az elkülönítés megsértése miatt.

A részleges frissítések engedélyezéséhez az alkalmazás kiadhat egy eszköz FS-vezérlőt (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) a régi tartalom beolvasásához a megnyitott leíró által hivatkozott fájlba. Ez elindít egy kiszolgálóoldali régi tartalompéldányt. A jobb alkalmazásteljesítmény érdekében és annak érdekében, hogy a nagy méretű fájlok használatakor ne fusson időtúllépés, javasoljuk, hogy aszinkron I/O-t használjon.

Ha az FSCTL kiadása a leíró írása után történik, az utolsó írási művelet megmarad, és a fogópontra írt korábbi írások elvesznek.

Fájlrendszer API-k és támogatott elkülönítési szintek

Ha a fájlrendszer API-k elkülönítési szabálysértés miatt nem tudnak megnyitni egy fájlt, a rendszer ERROR_SHARING_VIOLATION kivételt ad vissza. Ez az elkülönítési szabálysértés akkor fordul elő, ha két tranzakció megpróbálja elérni ugyanazt a fájlt. A hozzáférési művelet eredménye attól függ, hogy a fájl milyen módban lett megnyitva, és hogy az SQL Server melyik verziójában fut a tranzakció. Az alábbi táblázat az ugyanazon fájlhoz hozzáférő két tranzakció lehetséges eredményeit ismerteti.

1. tranzakció 2. tranzakció Eredmény az SQL Server 2008-on (10.0.x) Az SQL Server 2008 R2 (10.50.x) és újabb verzióinak eredménye
Megnyitás olvasásra. Megnyitás olvasásra. Mindkettő sikeres. Mindkettő sikeres.
Megnyitás olvasásra. Megnyitás íráshoz. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióban végrehajtott olvasási műveletekre. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióban végrehajtott olvasási műveletekre.
Megnyitás íráshoz. Megnyitás olvasásra. A 2. tranzakció megnyitása ERROR_SHARING_VIOLATION kivétellel meghiúsul. Mindkettő sikeres.
Megnyitás íráshoz. Megnyitás íráshoz. A 2. tranzakció megnyitása ERROR_SHARING_VIOLATION kivétellel meghiúsul. A 2. tranzakció megnyitása ERROR_SHARING_VIOLATION kivétellel meghiúsul.
Megnyitás olvasásra. Megnyitás a következőhöz SELECT: . Mindkettő sikeres. Mindkettő sikeres.
Megnyitás olvasásra. Megnyitás vagy UPDATEDELETE. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióban végrehajtott olvasási műveletekre. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióban végrehajtott olvasási műveletekre.
Megnyitás íráshoz. open for SELECT. A 2. tranzakció letiltja, amíg az 1. tranzakció véglegesíti vagy befejezi a tranzakciót, vagy a tranzakció zárolása túllépi az időkorlátot. Mindkettő sikeres.
Megnyitás íráshoz. Megnyitás vagy UPDATEDELETE. A 2. tranzakció letiltja, amíg az 1. tranzakció véglegesíti vagy befejezi a tranzakciót, vagy a tranzakció zárolása túllépi az időkorlátot. A 2. tranzakció letiltja, amíg az 1. tranzakció véglegesíti vagy befejezi a tranzakciót, vagy a tranzakció zárolása túllépi az időkorlátot.
Megnyitás a következőhöz SELECT: . Megnyitás olvasásra. Mindkettő sikeres. Mindkettő sikeres.
Megnyitás a következőhöz SELECT: . Megnyitás íráshoz. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióra. Mindkettő sikeres. A 2. tranzakcióban végzett írási műveletek nincsenek hatással az 1. tranzakcióra.
Megnyitás vagy UPDATEDELETE. Megnyitás olvasásra. A 2. tranzakció nyitott művelete ERROR_SHARING_VIOLATION kivétellel meghiúsul. Mindkettő sikeres.
Megnyitás vagy UPDATEDELETE. Megnyitás íráshoz. A 2. tranzakció nyitott művelete ERROR_SHARING_VIOLATION kivétellel meghiúsul. A 2. tranzakció nyitott művelete ERROR_SHARING_VIOLATION kivétellel meghiúsul.
Megnyitható ismételhető SELECT olvasással. Megnyitás olvasásra. Mindkettő sikeres. Mindkettő sikeres.
Megnyitható ismételhető SELECT olvasással. Megnyitás íráshoz. A 2. tranzakció nyitott művelete ERROR_SHARING_VIOLATION kivétellel meghiúsul. A 2. tranzakció nyitott művelete ERROR_SHARING_VIOLATION kivétellel meghiúsul.

Írás távoli ügyfelekről

A fájlrendszer távoli hozzáférése a FILESTREAM-adatokhoz a Kiszolgálói üzenetblokk (SMB) protokollon keresztül engedélyezve van. Ha az ügyfél távoli, az ügyféloldal nem gyorsítótárazza az írási műveleteket. Az írási műveleteket a rendszer mindig elküldi a kiszolgálónak. Az adatok a kiszolgáló oldalán gyorsítótárazhatók. Javasoljuk, hogy a távoli ügyfeleken futó alkalmazások a kis írási műveleteket nagyobb méretű műveletekbe egyesítsék. A cél az, hogy kevesebb írást hajtsunk végre.

A memórialeképezett nézetek (memórialeképezett I/O) FILESTREAM-leíróval történő létrehozása nem támogatott. Ha memórialeképezést használ a FILESTREAM-adatokhoz, az adatbázismotor nem tudja garantálni az adatok konzisztenciáját és tartósságát, illetve az adatbázis integritását.

Javaslatok és irányelvek a FILESTREAM teljesítményének javításához

Az SQL Server FILESTREAM funkciója lehetővé teszi a varbinary(max) bináris nagy objektumadatok fájlként való tárolását a fájlrendszerben. Ha a FILESTREAM-tárolókban nagy számú sor található, amelyek a FILESTREAM-oszlopok és a FileTables alapjául szolgáló tárolók, a végén egy nagy számú fájlt tartalmazó fájlrendszerkötetet hozhat létre. Az adatbázisból és a fájlrendszerből származó integrált adatok feldolgozásakor a legjobb teljesítmény érdekében fontos biztosítani a fájlrendszer optimális hangolását. A fájlrendszer szempontjából az alábbi hangolási lehetőségek közül választhat:

  • Az SQL Server FILESTREAM szűrőillesztő magasságának ellenőrzése (például rsfx0100.sys). Értékelje ki az összes olyan szűrőillesztőt, amely egy kötethez van hozzárendelve, amelyben a FILESTREAM szolgáltatás tárolja a fájlokat, és győződjön meg arról, hogy az rsfx-illesztő a verem alján található. A FLTMC.EXE vezérlőprogram segítségével számba vehet egy adott kötet szűrőillesztőinek számbavételét. Íme egy mintakimenet az FLTMC segédprogramból: C:\Windows\System32>fltMC.exe szűrők

    Szűrő neve Számpéldányok Magasság Keret
    Sftredir 1 406000 0
    MpFilter 9 328000 0
    luafv 1 135000 0
    FileInfo 9 45000 0
    RsFx0103 1 41001.03 0
  • Ellenőrizze, hogy a kiszolgálón le van-e tiltva az "utolsó hozzáférési idő" tulajdonság a fájlokhoz. Ez a fájlrendszerattribútum a beállításjegyzékben van fenntartva: Kulcsnév: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Név: NtfsDisableLastAccessUpdate Típus: REG_DWORD Érték: 1

  • Ellenőrizze, hogy a kiszolgáló 8.3-ás elnevezése le van-e tiltva. Ez a fájlrendszer-attribútum a beállításjegyzékben van fenntartva: Kulcsnév: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Név: NtfsDisable8dot3NameCreation Típus: REG_DWORD Érték: 1

  • Ellenőrizze, hogy a FILESTREAM címtártárolókban nincs-e engedélyezve a fájlrendszer titkosítása vagy a fájlrendszer tömörítése, mivel ezek a fájlok elérésekor többletterhelést okozhatnak.

  • Egy rendszergazda jogú parancssorból futtassa az fltmc-példányokat, és győződjön meg arról, hogy nincsenek szűrőillesztők ahhoz a kötethez csatolva, ahol a visszaállítást megkísérli.

  • Ellenőrizze, hogy a FILESTREAM könyvtártárolók nem rendelkeznek-e 300 000-nél több fájllal. A katalógusnézetből származó sys.database_files információk segítségével megtudhatja, hogy mely könyvtárak találhatók a fájlrendszerbeli fájlokban FILESTREAM-related . Ez több tárolóval is megelőzhető. (További információkért tekintse meg a következő listajeles elemet.)

  • Egyetlen FILESTREAM-fájlcsoport esetén az összes adatfájl ugyanabban a mappában jön létre. A nagyon nagy számú fájl létrehozását nagy NTFS-indexek befolyásolhatják, amelyek töredezetté is válhatnak.

    • Ehhez általában több fájlcsoport használata segíthet (az alkalmazás particionálást használ, vagy több táblával rendelkezik, amelyek mindegyike saját fájlcsoportba kerül).

    • Az SQL Server 2012 (11.x) és újabb verzióival több tárolóval vagy fájllal is rendelkezhet egy FILESTREAM-fájlcsoportban, és a rendszer ciklikus időszeleteléses foglalási sémát alkalmaz. Ezért a könyvtáronkénti NTFS-fájlok száma csökken.

  • A biztonsági mentés és a visszaállítás több FILESTREAM-tárolóval is gyorsabb lehet, ha több kötet tárolja a tárolókat.

    Az SQL Server 2012 (11.x) fájlcsoportonként több tárolót támogat, és megkönnyítheti a dolgát. A nagyobb számú fájl kezeléséhez nincs szükség bonyolult particionálási sémákra.

  • Ha egy SQL-példányban nagyon sok FILESTREAM-tároló található, a sok FILESTREAM-tárolóval rendelkező adatbázisok indítása hosszú időt vehet igénybe, amíg regisztrálja őket a FILESTREAM szűrőillesztőben. Az adatbázisok több különböző kötetben való terjesztése segít az adatbázis indítási idejének javításában.

  • Előfordulhat, hogy az NTFS MFT töredezetté válik, és teljesítményproblémákat okozhat. A fenntartott MFT mérete a kötet méretétől függ, ezért előfordulhat, hogy ez nem jelenik meg.

    • Ellenőrizheti az MFT töredezettségét (a C: módosítást defrag /A /V C: a tényleges kötetnévre).

    • Több MFT-helyet lefoglalhat a fsutil behavior set mftzone 2 használatával.

    • A FILESTREAM-adatfájlokat ki kell zárni a víruskereső szoftverek vizsgálatából.

      Megjegyzés:

      A Windows Server 2016 automatikusan engedélyezi a Windows Defendert. Győződjön meg arról, hogy a Windows Defender úgy van konfigurálva, hogy kizárja a Filestream-fájlokat. Ennek elmulasztása a biztonsági mentési és visszaállítási műveletek teljesítménycsökkenését eredményezheti.

      További információ: Kizárások konfigurálása és ellenőrzése a Windows Defender víruskereső vizsgálatához.