FILESTREAM (SQL Server)

Platí pro:SQL Server v systému Windows

FILESTREAM umožňuje aplikacím založeným na SQL Serveru ukládat nestrukturovaná data, jako jsou dokumenty a obrázky, v systému souborů. Aplikace můžou využívat bohatá rozhraní API streamování a výkon systému souborů a současně udržovat transakční konzistenci mezi nestrukturovanými daty a odpovídajícími strukturovanými daty.

FILESTREAM integruje databázový stroj SQL Serveru se systémem souborů NTFS nebo ReFS tak, že ukládá data velkých binárních objektů (BLOB) typu varbinary(max) jako soubory v systému souborů. Transact-SQL příkazy můžou vkládat, aktualizovat, dotazovat, vyhledávat a zálohovat data FILESTREAM. Rozhraní systému souborů Win32 poskytují přístup ke streamovaným datům.

FILESTREAM používá systémovou mezipaměť NT pro ukládání dat souborů do mezipaměti. Ukládání souborů do mezipaměti systému pomáhá snížit dopad, který data FILESTREAM mohou mít na výkon databázového stroje. Fond vyrovnávací paměti SQL Serveru se nepoužívá. proto je tato paměť k dispozici pro zpracování dotazů.

FileSTREAM není automaticky povolen při instalaci nebo upgradu SQL Serveru. FILESTREAM musíte povolit pomocí nástroje SQL Server Configuration Manager a v aplikaci SQL Server Management Studio. Chcete-li použít FILESTREAM, musíte vytvořit nebo upravit databázi tak, aby obsahovala zvláštní typ skupiny souborů. Potom vytvořte nebo upravte tabulku tak, aby obsahovala sloupec varbinary(max) s atributem FILESTREAM. Po dokončení těchto úkolů můžete pomocí Transact-SQL a Win32 spravovat data FILESTREAM.

Kdy použít FILESTREAM

V SQL Serveru můžou být objekty BLOB standardními daty varbinary(max), která ukládají data v tabulkách, nebo objekty FILESTREAM varbinary(max), které ukládají data v systému souborů. Velikost a použití dat určuje, jestli chcete použít úložiště databáze nebo úložiště systému souborů. Pokud jsou splněny následující podmínky, měli byste zvážit použití FILESTREAM:

  • Uložené objekty jsou v průměru větší než 1 MB.
  • Rychlý přístup ke čtení je důležitý.
  • Vyvíjíte aplikace, které používají střední vrstvu pro logiku aplikace.

U menších objektů často ukládání objektů BLOB typu varbinary(max) v databázi poskytuje lepší výkon při streamování.

FILESTREAM Úložiště

Úložiště FILESTREAM se implementuje jako sloupec varbinary(max), ve kterém se data ukládají jako bloby v systému souborů. Velikosti objektů BLOB jsou omezeny pouze velikostí svazku souborového systému. Standardní omezení varbinary(max) velikosti souborů o velikosti 2 GB se nevztahuje na objekty BLOB, které jsou uložené v systému souborů.

Chcete-li určit, že sloupec by měl uchovávat data v systému souborů, zadejte atribut FILESTREAM ve sloupci varbinary(max). Tento atribut způsobí, že databázový stroj uloží všechna data pro tento sloupec v systému souborů, ale ne v databázovém souboru.

Data FILESTREAM musí být uložena ve skupinách souborů FILESTREAM. FileSTREAM filegroup je speciální skupina souborů, která obsahuje adresáře systému souborů místo samotných souborů. Tyto adresáře systému souborů se nazývají datové kontejnery. Datové kontejnery jsou rozhraní mezi úložištěm databázového stroje a úložištěm systému souborů.

Při použití úložiště FILESTREAM zvažte následující:

  • Pokud tabulka obsahuje sloupec FILESTREAM, musí mít každý řádek jedinečné ID řádku, který nemá hodnotu null.
  • Do skupiny souborů FILESTREAM je možné přidat více datových kontejnerů.
  • Datové kontejnery FILESTREAM nelze vnořit.
  • Když používáte clusterování s podporou převzetí služeb při selhání, musí být skupiny souborů FILESTREAM na sdílených diskových prostředcích.
  • Skupiny souborů FILESTREAM můžou být na komprimovaných svazcích.

Integrovaná správa

Vzhledem k tomu, že fileSTREAM je implementován jako sloupec varbinary(max) a integrovaný přímo do databázového stroje, většina nástrojů a funkcí pro správu SQL Serveru funguje bez úprav pro data FILESTREAM. Můžete například použít všechny modely zálohování a obnovení s daty FILESTREAM a data FILESTREAM se zálohuje se strukturovanými daty v databázi. Pokud nechcete zálohovat data FILESTREAM s relačními daty, můžete pomocí částečné zálohy vyloučit skupiny souborů FILESTREAM.

Integrované zabezpečení

V SQL Serveru jsou data FILESTREAM zabezpečená stejně jako ostatní data zabezpečená: udělením oprávnění na úrovni tabulky nebo sloupce. Pokud má uživatel oprávnění ke sloupci FILESTREAM v tabulce, může uživatel otevřít přidružené soubory.

Poznámka:

Šifrování není podporováno u dat FILESTREAM.

Oprávnění ke kontejneru FILESTREAM má pouze účet, pod kterým běží účet služby SQL Server. Doporučujeme, aby ke kontejneru dat nebyla udělena žádná jiná oprávnění.

Poznámka:

Přihlášení SQL nebudou fungovat s kontejnery FILESTREAM. S kontejnery FILESTREAM bude fungovat pouze ověřování NTFS nebo ReFS.

Přístup k datům objektů BLOB pomocí Transact-SQL a přístupu ke streamování systému souborů

Po uložení dat ve sloupci FILESTREAM můžete k souborům přistupovat pomocí Transact-SQL transakcí nebo pomocí rozhraní API Win32.

Přístup k Transact-SQL

Pomocí jazyka Transact-SQL můžete vkládat, aktualizovat a odstraňovat data FILESTREAM:

  • Pomocí operace INSERT můžete pole FILESTREAM předvyplnit hodnotou NULL, prázdnou hodnotou nebo relativně krátkými řádkovými daty. Velké množství dat se ale efektivněji streamuje do souboru, který používá rozhraní Win32.
  • Při aktualizaci pole FILESTREAM upravíte podkladová data objektu BLOB v systému souborů. Pokud je pole FILESTREAM nastaveno na NULL, data objektu BLOB přidružená k poli se odstraní. K provádění částečných aktualizací dat nemůžete použít Transact-SQL blokovanou aktualizaci implementovanou jako UPDATE.**Write().
  • Když odstraníte řádek nebo odstraníte nebo zkrátíte tabulku obsahující data FILESTREAM, odstraníte podkladová data objektu BLOB v systému souborů.

Přístup ke streamování systému souborů

Podpora streamování Win32 funguje v kontextu transakce SQL Serveru. V rámci transakce můžete pomocí funkcí FILESTREAM získat logickou cestu systému souborů UNC souboru. Pak použijete rozhraní API OpenSqlFilestream k získání popisovače souboru. Tento popisovač pak lze použít v rozhraních Win32 pro streamování souborů, například ReadFile() a WriteFile(), pro přístup k souboru a jeho aktualizaci prostřednictvím souborového systému.

Vzhledem k tomu, že operace se soubory jsou transakční, nemůžete soubory FILESTREAM odstranit ani přejmenovat prostřednictvím systému souborů.

Výstraha

Kontejner FILESTREAM je složka spravovaná SQL Serverem. Nepřidávejte ani neodebívejte soubory ve složce FILESTREAM ručně nebo prostřednictvím jiných aplikací. Pokud to uděláte, dojde k chybám zálohování a nekonzistence. Další informace najdete v tématu MSSQLSERVER_3056, MSSQLSERVER_7908 a MSSQLSERVER_7906.

Model instrukcí

Systém souborů FILESTREAM modeluje příkaz Transact-SQL pomocí otevření a zavření souboru. Příkaz začíná při otevření popisovače souboru a končí po zavření popisovače. Například když je uzavřen popisovač pro zápis, spustí se veškerý možný AFTER trigger registrovaný pro tabulku, jako by byl dokončen příkaz UPDATE.

Jmenný prostor úložiště

V FILESTREAM řídí databázový stroj obor názvů fyzického systému souborů BLOB. Nová vnitřní funkce PathName poskytuje logickou cestu UNC objektu BLOB, která odpovídá každé buňce FILESTREAM v tabulce. Aplikace používá tuto logickou cestu k získání popisovače Win32 a k práci s daty BLOB pomocí standardních rozhraní systému souborů Win32. Funkce vrátí NULL, pokud je hodnota sloupce FILESTREAM NULL.

Přístup k transakčnímu systému souborů

Nová vnitřní funkce GET_FILESTREAM_TRANSACTION_CONTEXT poskytuje token, který představuje aktuální transakci, ke které je relace přidružena. Transakce musí být zahájena a nesmí být dosud zrušena ani potvrzena. Získáním tokenu aplikace sváže operace streamování systému souborů FILESTREAM s spuštěnou transakcí. Funkce vrátí NULL v případě, že není explicitně spuštěna transakce.

Před potvrzením nebo přerušením transakce musí být uzavřeny všechny popisovače souborů. Pokud je popisovač ponechán otevřený i po skončení rozsahu transakce, další čtení z popisovače způsobí selhání; další zápisy do popisovače proběhnou úspěšně, ale ve skutečnosti se data na disk nezapíšou. Obdobně platí, že pokud dojde k vypnutí databáze nebo instance modulu Database Engine, všechny otevřené popisovače se stanou neplatnými.

Stálost transakcí

Při potvrzení transakce technologie FILESTREAM zajišťuje Databázový stroj trvanlivost transakce pro data BLOB FILESTREAM, která jsou upravována prostřednictvím přístupu ke streamování v systému souborů.

Sémantika izolace

Sémantika izolace se řídí úrovněmi izolace transakcí databázového stroje. Úroveň izolace potvrzená čtením je podporována pro Transact-SQL a přístup k systému souborů. Podporují se opakovatelné operace čtení, serializovatelné a úrovně izolace snímků. Špinavé čtení není podporováno.

Operace otevření přístupu k systému souborů nečeká na žádné zámky. Operace otevření se místo toho okamžitě nezdaří, pokud nemají přístup k datům kvůli izolaci transakcí. Volání streamovacího rozhraní API selžou s chybou ERROR_SHARING_VIOLATION, pokud operace otevření nemůže pokračovat kvůli porušení izolace.

Aby bylo možné provádět částečné aktualizace, může aplikace odeslat řídicí kód systému souborů zařízení (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT), který načte původní obsah do souboru, na který odkazuje otevřený popisovač. Tím se aktivuje kopie starého obsahu na straně serveru. Pokud chcete dosáhnout lepšího výkonu aplikace a vyhnout se potenciálním vypršením časového limitu při práci s velmi velkými soubory, doporučujeme použít asynchronní vstupně-výstupní operace.

Pokud je FSCTL odeslán poté, co bylo do popisovače zapisováno, poslední operace zápisu se zachová a předchozí zápisy provedené do popisovače se ztratí.

Rozhraní API systému souborů a podporované úrovně izolace

Pokud rozhraní API systému souborů nemůže otevřít soubor z důvodu porušení izolace, vrátí se výjimka ERROR_SHARING_VIOLATION. K tomuto narušení izolace dochází, když se dvě transakce pokusí o přístup ke stejnému souboru. Výsledek operace přístupu závisí na režimu, ve kterém byl soubor otevřen, a verzi SQL Serveru, na které transakce běží. Následující tabulka popisuje možné výsledky pro dvě transakce, které přistupují ke stejnému souboru.

Transakce 1 Transakce 2 Výsledek na SQL Serveru 2008 (10.0.x) Výsledek na SQL Serveru 2008 R2 (10.50.x) a novějších verzích
Otevřete pro čtení. Otevřete pro čtení. Oba jsou úspěšné. Oba jsou úspěšné.
Otevřete pro čtení. Otevřeno pro zápis. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na operace čtení prováděné v transakci 1. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na operace čtení prováděné v transakci 1.
Otevřeno pro zápis. Otevřete pro čtení. Operace otevření pro transakci 2 selže s výjimkou ERROR_SHARING_VIOLATION. Oba jsou úspěšné.
Otevřeno pro zápis. Otevřeno pro zápis. Otevření pro transakci 2 selže s výjimkou ERROR_SHARING_VIOLATION. Otevření pro transakci 2 selže s výjimkou ERROR_SHARING_VIOLATION.
Otevřete pro čtení. Otevřít pro SELECT. Oba jsou úspěšné. Oba jsou úspěšné.
Otevřete pro čtení. Otevřít pro UPDATE nebo DELETE. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na operace čtení prováděné v transakci 1. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na operace čtení prováděné v transakci 1.
Otevřeno pro zápis. otevřeno pro SELECT. Transakce 2 je blokována, dokud transakce 1 nepotvrdí změny nebo neukončí transakci, případně dokud nevyprší časový limit zámku transakce. Oba jsou úspěšné.
Otevřeno pro zápis. Otevřít pro UPDATE nebo DELETE. Transakce 2 je blokována, dokud transakce 1 nepotvrdí nebo neukončí transakci nebo dokud nevyprší časový limit zámku transakce. Transakce 2 je blokována, dokud transakce 1 nepotvrdí nebo neukončí transakci nebo dokud nevyprší časový limit zámku transakce.
Otevřít pro SELECT. Otevřete pro čtení. Oba jsou úspěšné. Oba jsou úspěšné.
Otevřít pro SELECT. Otevřeno pro zápis. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na transakci 1. Oba jsou úspěšné. Operace zápisu v rámci transakce 2 nemají vliv na transakci 1.
Otevřít v UPDATE nebo DELETE. Otevřete pro čtení. Operace open u transakce 2 selže s výjimkou ERROR_SHARING_VIOLATION. Oba jsou úspěšné.
Otevřít pro UPDATE nebo DELETE. Otevřeno pro zápis. Operace otevření u transakce 2 selže s výjimkou ERROR_SHARING_VIOLATION. Operace otevření u transakce 2 selže s výjimkou ERROR_SHARING_VIOLATION.
Otevřete ho SELECT s opakovatelným čtením. Otevřete pro čtení. Oba jsou úspěšné. Oba jsou úspěšné.
Otevřete ho SELECT s opakovatelným čtením. Otevřeno pro zápis. Při otevření transakce 2 dojde k selhání s výjimkou ERROR_SHARING_VIOLATION. Operace otevření u transakce 2 selže s výjimkou ERROR_SHARING_VIOLATION.

Průběžný zápis od vzdálených klientů

Vzdálený přístup k datům FILESTREAM je povolený přes protokol SMB (Server Message Block). Pokud je klient vzdálený, nejsou na straně klienta uloženy žádné operace zápisu do mezipaměti. Operace zápisu se vždy odešlou na server. Data se dají ukládat do mezipaměti na straně serveru. Doporučujeme, aby aplikace, které běží na vzdálených klientech, konsolidovaly malé operace zápisu do operací větší velikosti. Cílem je provádět méně zápisů.

Není podporováno vytváření zobrazení mapovaných do paměti (vstupně-výstupních operací mapovaných do paměti) pomocí popisovače FILESTREAM. Pokud se pro data FILESTREAM používá mapování paměti, databázový stroj nemůže zaručit konzistenci a odolnost dat nebo integritu databáze.

Doporučení a pokyny pro zlepšení výkonu FILESTREAM

Funkce SQL Server FILESTREAM umožňuje ukládat binární data binárních velkých objektů varbinary(max) jako soubory v systému souborů. Pokud máte velký počet řádků v kontejnerech FILESTREAM, což jsou základní úložiště pro sloupce FILESTREAM i FileTables, můžete skončit se svazkem systému souborů, který obsahuje velký počet souborů. Pokud chcete dosáhnout nejlepšího výkonu při zpracování integrovaných dat z databáze a systému souborů, je důležité zajistit optimální ladění systému souborů. Tady jsou některé možnosti ladění, které jsou k dispozici z pohledu systému souborů:

  • Kontrola výšky pro ovladač filtru FILESTREAM SQL Serveru (například rsfx0100.sys). Vyhodnoťte všechny ovladače filtru načtené pro zásobník úložiště přidružený ke svazku, ve kterém funkce FILESTREAM ukládá soubory, a ujistěte se, že je ovladač rsfx umístěný v dolní části zásobníku. Ovládací program FLTMC.EXE můžete použít k vytvoření výčtu ovladačů filtru pro určitý svazek. Tady je ukázkový výstup z nástroje FLTMC: C:\Windows\System32>fltMC.exe filtry

    Název filtru Počet instancí Nadmořská výška Rámec
    Sftredir 1 406000 0
    MpFilter 9 328000 0
    luafv 1 135000 0
    FileInfo 9 45000 0
    RsFx0103 1 41001.03 0
  • Zkontrolujte, jestli má server pro soubory zakázanou vlastnost čas posledního přístupu. Tento atribut systému souborů je zachován v registru: Název klíče: Název: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem NtfsDisableLastAccessUpdate Typ: REG_DWORD Hodnota: 1

  • Zkontrolujte, zda má server zakázané pojmenování 8.3. Tento atribut systému souborů je zachován v registru: Název klíče: Název: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem NtfsDisable8dot3NameCreation Type: REG_DWORD Hodnota: 1

  • Zkontrolujte, zda adresářové kontejnery FILESTREAM nemají povolené šifrování systému souborů ani kompresi systému souborů, protože tyto funkce mohou při přístupu k těmto souborům způsobovat režii.

  • Z příkazového řádku se zvýšenými oprávněními spusťte instance fltmc a ujistěte se, že ke svazku, ve kterém se pokoušíte obnovit, nejsou připojené žádné ovladače filtru.

  • Zkontrolujte, že kontejnery adresářů FILESTREAM nemají více než 300 000 souborů. Pomocí informací z katalogového zobrazení sys.database_files můžete zjistit, ve kterých adresářích v systému souborů jsou uloženy soubory FILESTREAM-related. To může zabránit tím, že bude mít více kontejnerů. (Viz další bod, kde najdete více informací.)

  • Pouze s jednou skupinou souborů FILESTREAM se všechny datové soubory vytvoří ve stejné složce. Vytváření souborů velmi velkého počtu souborů může být ovlivněno velkými indexy NTFS, které se můžou také fragmentovat.

    • Obecně by s tím mělo pomoct více skupin souborů (aplikace používá dělení nebo má více tabulek, z nichž každá přejde do vlastní skupiny souborů).

    • V SQL Serveru 2012 (11.x) a novějších verzích můžete mít ve skupině souborů FILESTREAM více kontejnerů nebo souborů a použije se schéma střídavého přidělování. Proto se počet souborů NTFS na jeden adresář zmenší.

  • Zálohování a obnovení mohou být rychlejší při použití více kontejnerů FILESTREAM, pokud jsou tyto kontejnery uloženy na více svazcích.

    SQL Server 2012 (11.x) podporuje více kontejnerů na skupinu souborů a usnadňuje práci. Ke správě většího počtu souborů nemusí být potřeba složitá schémata dělení.

  • Pokud existuje velký počet kontejnerů FILESTREAM v instanci SQL, spuštění databází s mnoha kontejnery FILESTREAM může trvat dlouhou dobu, než je zaregistruje v ovladači filtru FILESTREAM. Rozložení do několika různých svazků pomáhá zlepšit dobu spuštění databáze.

  • Ntfs MFT může být fragmentovaný a může způsobit problémy s výkonem. Rezervovaná velikost MFT závisí na velikosti svazku, takže k tomu může dojít nebo nemusí dojít.

    • Fragmentaci MFT můžete zkontrolovat pomocí defrag /A /V C: (C: nahraďte skutečným názvem svazku).

    • Více místa MFT si můžete rezervovat pomocí nástroje fsutil behavior set mftzone 2.

    • Datové soubory FILESTREAM by měly být vyloučeny z kontroly antivirového softwaru.

      Poznámka:

      Windows Server 2016 automaticky povolí Windows Defender. Ujistěte se, že je program Windows Defender nakonfigurovaný tak, aby vyloučil soubory Filestream. Pokud to neuděláte, může to vést ke snížení výkonu operací zálohování a obnovení.

      Další informace najdete v tématu Konfigurace a ověření vyloučení pro kontroly antivirové ochrany v programu Windows Defender.