Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server – endast Windows
FILESTREAM gör det möjligt för SQL Server-baserade program att lagra ostrukturerade data, till exempel dokument och bilder, i filsystemet. Program kan använda de omfattande strömmande API:erna och prestandan i filsystemet och samtidigt upprätthålla transaktionskonsekvens mellan ostrukturerade data och motsvarande strukturerade data.
FILESTREAM integrerar SQL Server Database Engine med ett NTFS- eller ReFS-filsystem genom att lagra blob-data (varbinary(max) binära stora objekt (BLOB) som filer i filsystemet. Transact-SQL-instruktioner kan infoga, uppdatera, fråga, söka efter och säkerhetskopiera FILESTREAM-data. Win32-filsystemgränssnitt ger direktuppspelningsåtkomst till data.
FILESTREAM använder NT-systemcachen för cachelagring av fildata. Genom att cachelagra filer i systemcacheminnet kan du minska den inverkan som FILESTREAM-data kan ha på database engine-prestanda. SQL Server-buffertpoolen används inte. Därför är det här minnet tillgängligt för frågebearbetning.
FILESTREAM aktiveras inte automatiskt när du installerar eller uppgraderar SQL Server. Du måste aktivera FILESTREAM med hjälp av SQL Server Configuration Manager och SQL Server Management Studio. Om du vill använda FILESTREAM måste du skapa eller ändra en databas så att den innehåller en särskild typ av filgrupp. Skapa eller ändra sedan en tabell så att den innehåller en kolumn med varbinary(max) med attributet FILESTREAM. När du har slutfört dessa uppgifter kan du använda Transact-SQL och Win32 för att hantera FILESTREAM-data.
När du ska använda FILESTREAM
I SQL Server kan BLOB:er vara standardvarbinary(max) -data som lagrar data i tabeller eller FILESTREAM-varbinary (max) objekt som lagrar data i filsystemet. Storleken och användningen av data avgör om du ska använda databaslagring eller filsystemslagring. Om följande villkor är uppfyllda bör du överväga att använda FILESTREAM:
- Objekt som lagras är i genomsnitt större än 1 MB.
- Snabb läsåtkomst är viktigt.
- Du utvecklar program som använder en mellannivå för programlogik.
För mindre objekt ger lagring av varbinary(max) BLOB:er i databasen ofta bättre prestanda för strömning.
FILESTREAM Storage
FILESTREAM-lagring implementeras som en kolumn med varbinary(max) där data lagras som BLOB i filsystemet. Storleken på BLOB:erna begränsas endast av filsystemets volymstorlek. Standardavvikelsen (max) för filstorlekar på 2 GB gäller inte för BLOB:er som lagras i filsystemet.
Om du vill ange att en kolumn ska lagra data i filsystemet anger du attributet FILESTREAM i kolumnen varbinary(max). Det här attributet gör att databasmotorn lagrar alla data för kolumnen i filsystemet, men inte i databasfilen.
FILESTREAM-data måste lagras i FILESTREAM-filgrupper. En FILESTREAM-filgrupp är en särskild filgrupp som innehåller filsystemkataloger i stället för själva filerna. Dessa filsystemkataloger kallas för datacontainrar. Datacontainrar är gränssnittet mellan Database Engine Storage och filsystemlagring.
Tänk på följande när du använder FILESTREAM-lagring:
- När en tabell innehåller en FILESTREAM-kolumn måste varje rad ha ett unikt rad-ID som inte är null.
- Flera datacontainrar kan läggas till i en FILESTREAM-filgrupp.
- FILESTREAM-datacontainrar kan inte kapslas.
- När du använder redundanskluster måste FILESTREAM-filgrupperna finnas på delade diskresurser.
- FILESTREAM-filgrupper kan finnas på komprimerade volymer.
Integrerad hantering
Eftersom FILESTREAM implementeras som en kolumn med varbinary(max) och integreras direkt i databasmotorn fungerar de flesta SQL Server-hanteringsverktyg och -funktioner utan ändringar för FILESTREAM-data. Du kan till exempel använda alla säkerhetskopierings- och återställningsmodeller med FILESTREAM-data och FILESTREAM-data säkerhetskopieras med strukturerade data i databasen. Om du inte vill säkerhetskopiera FILESTREAM-data med relationsdata kan du använda en partiell säkerhetskopia för att exkludera FILESTREAM-filgrupper.
Integrerad säkerhet
I SQL Server skyddas FILESTREAM-data precis som andra data skyddas: genom att ge behörigheter på tabell- eller kolumnnivå. Om en användare har behörighet till kolumnen FILESTREAM i en tabell kan användaren öppna de associerade filerna.
Anmärkning
Kryptering stöds inte på FILESTREAM-data.
Endast det konto under vilket SQL Server-tjänstkontot körs beviljas behörigheter till FILESTREAM-containern. Vi rekommenderar att inget annat konto beviljas behörigheter för datacontainern.
Anmärkning
SQL-inloggningar fungerar inte med FILESTREAM-containrar. Endast NTFS- eller ReFS-autentisering fungerar med FILESTREAM-containrar.
Åtkomst till BLOB-data med Transact-SQL- och filsystemströmningsåtkomst
När du har lagrat data i en FILESTREAM-kolumn kan du komma åt filerna med hjälp av Transact-SQL transaktioner eller med hjälp av Win32-API:er.
Transact-SQL Access
Genom att använda Transact-SQL kan du infoga, uppdatera och ta bort FILESTREAM-data:
- Du kan använda en infogningsåtgärd för att fylla i ett FILESTREAM-fält med ett null-värde, ett tomt värde eller relativt korta infogade data. En stor mängd data strömmas dock mer effektivt till en fil som använder Win32-gränssnitt.
- När du uppdaterar ett FILESTREAM-fält ändrar du underliggande BLOB-data i filsystemet. När ett FILESTREAM-fält har angetts till
NULLtas blobdata som är associerade med fältet bort. Du kan inte använda en Transact-SQL segmenterad uppdatering, implementerad somUPDATE.**Write(), för att utföra partiella uppdateringar av data. - När du tar bort en rad eller tar bort eller trunkerar en tabell som innehåller FILESTREAM-data tar du bort underliggande BLOB-data i filsystemet.
Direktuppspelningsåtkomst för filsystem
Stöd för Win32-strömning fungerar i kontexten för en SQL Server-transaktion. I en transaktion kan du använda FILESTREAM-funktioner för att hämta en logisk UNC-filsystemsökväg för en fil. Sedan använder du OpenSqlFilestream-API:et för att hämta ett filhandtag. Det här handtaget kan sedan användas av Win32-filströmningsgränssnitt, till exempel ReadFile() och WriteFile(), för att komma åt och uppdatera filen via filsystemet.
Eftersom filåtgärder är transaktionella kan du inte ta bort eller byta namn på FILESTREAM-filer via filsystemet.
Varning
FILESTREAM-containern är en mapp som hanteras av SQL Server. Lägg inte till eller ta bort filer i mappen FILESTREAM manuellt eller via andra program. Om du gör det resulterar detta i säkerhetskopierings- och inkonsekvensfel. Mer information finns i MSSQLSERVER_3056, MSSQLSERVER_7908 och MSSQLSERVER_7906.
Instruktionsmodell
FILESTREAM-filsystemets åtkomst modellerar en Transact-SQL-instruktion med hjälp av filöppning och stängning. Instruktionen startar när ett filhandtag öppnas och slutar när handtaget stängs. När till exempel ett skrivhandtag stängs utlöses alla möjliga AFTER utlösare som är registrerade i tabellen som om en UPDATE instruktion har slutförts.
Lagringsnamnområde
I FILESTREAM styr databasmotorn blobens namnområde för det fysiska filsystemet. En ny inbyggd funktion, PathName, tillhandahåller den logiska UNC-sökvägen för blobben som motsvarar varje FILESTREAM-cell i tabellen. Programmet använder den här logiska sökvägen för att hämta Win32-handtaget och arbeta med BLOB-data med hjälp av vanliga Win32-filsystemgränssnitt. Funktionen returnerar NULL om värdet för kolumnen FILESTREAM är NULL.
Transacted file system access
En ny inbyggd funktion, GET_FILESTREAM_TRANSACTION_CONTEXT, tillhandahåller den token som representerar den aktuella transaktionen som sessionen är associerad med. Transaktionen måste ha startats och har ännu inte avbrutits eller checkats in. Genom att hämta en token binder programmet filestream-filsystemets strömningsåtgärder med en startad transaktion. Funktionen returnerar NULL om det inte finns någon uttryckligen startad transaktion.
Alla filreferenser måste stängas innan transaktionen checkas in eller avbryts. Om ett handtag lämnas öppet utanför transaktionsomfånget orsakar ytterligare läsningar mot handtaget ett fel. ytterligare skrivningar mot handtaget lyckas, men faktiska data skrivs inte till disken. På samma sätt, om databasen eller instansen av databasmotorn stängs av, ogiltigförklaras alla öppna referenser.
Transaktionshållbarhet
Med FILESTREAM säkerställer databasmotorn vid transaktionsincheckning transaktionshållbarheten för FILESTREAM BLOB-data som ändras från filsystemets direktuppspelningsåtkomst.
Isoleringssemantik
Isoleringssemantiken styrs av transaktionsisoleringsnivåer för databasmotorn. Skrivskyddad isoleringsnivå stöds för Transact-SQL och filsystemåtkomst. Upprepningsbara läsåtgärder, serialiserbara och ögonblicksbildisoleringsnivåer stöds. Felaktig läsning stöds inte.
Öppna åtgärder för filsystemåtkomst väntar inte på några lås. I stället misslyckas de öppna åtgärderna omedelbart om de inte kan komma åt data på grund av transaktionsisolering. API-anrop för direktuppspelning misslyckas med ERROR_SHARING_VIOLATION om den öppna åtgärden inte kan fortsätta på grund av isoleringsöverträdelse.
Om du vill tillåta att partiella uppdateringar görs kan programmet utfärda en FS-enhetskontroll (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) för att hämta det gamla innehållet till filen som referensen för det öppnade handtaget. Detta utlöser en gammal innehållskopia på serversidan. För bättre programprestanda och för att undvika att stöta på potentiella timeout-fel när du arbetar med mycket stora filer rekommenderar vi att du använder asynkron I/O.
Om FSCTL utfärdas efter att handtaget har skrivits till sparas den senaste skrivåtgärden och tidigare skrivningar som gjordes i handtaget går förlorade.
API:er för filsystem och isoleringsnivåer som stöds
När ett filsystem-API inte kan öppna en fil på grund av en isoleringsöverträdelse returneras ett ERROR_SHARING_VIOLATION undantag. Den här isoleringsöverträdelsen inträffar när två transaktioner försöker komma åt samma fil. Resultatet av åtkomståtgärden beror på vilket läge filen öppnades i och vilken version av SQL Server som transaktionen körs på. I följande tabell beskrivs möjliga resultat för två transaktioner som har åtkomst till samma fil.
| Transaktion 1 | Transaktion 2 | Utfall på SQL Server 2008 (10.0.x) | Utfall på SQL Server 2008 R2 (10.50.x) och senare versioner |
|---|---|---|---|
| Öppna för läsning. | Öppna för läsning. | Båda lyckas. | Båda lyckas. |
| Öppna för läsning. | Öppna för skrivning. | Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte läsåtgärder som utförs i transaktion 1. | Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte läsåtgärder som utförs i transaktion 1. |
| Öppna för skrivning. | Öppna för läsning. | Det går inte att öppna för transaktion 2 med ett ERROR_SHARING_VIOLATION undantag. | Båda lyckas. |
| Öppna för skrivning. | Öppna för skrivning. | Det går inte att öppna för transaktion 2 med ett ERROR_SHARING_VIOLATION undantag. | Det går inte att öppna för transaktion 2 med ett ERROR_SHARING_VIOLATION undantag. |
| Öppna för läsning. | Öppen för SELECT. |
Båda lyckas. | Båda lyckas. |
| Öppna för läsning. | Öppna för UPDATE eller DELETE. |
Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte läsåtgärder som utförs i transaktion 1. | Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte läsåtgärder som utförs i transaktion 1. |
| Öppna för skrivning. | öppen för SELECT. |
Transaktion 2 blockerar tills transaktion 1 checkar in eller avslutar transaktionen, eller så överskrids tidsgränsen för transaktionslåset. | Båda lyckas. |
| Öppna för skrivning. | Öppna för UPDATE eller DELETE. |
Transaktion 2 blockerar tills transaktion 1 checkar in eller avslutar transaktionen, eller så överskrids tidsgränsen för transaktionslåset. | Transaktion 2 blockerar tills transaktion 1 checkar in eller avslutar transaktionen, eller så överskrids tidsgränsen för transaktionslåset. |
Öppen för SELECT. |
Öppna för läsning. | Båda lyckas. | Båda lyckas. |
Öppen för SELECT. |
Öppna för skrivning. | Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte transaktion 1. | Båda lyckas. Skrivåtgärder under transaktion 2 påverkar inte transaktion 1. |
Öppna för UPDATE eller DELETE. |
Öppna för läsning. | Den öppna åtgärden för transaktion 2 misslyckas med ett ERROR_SHARING_VIOLATION undantag. | Båda lyckas. |
Öppna för UPDATE eller DELETE. |
Öppna för skrivning. | Den öppna åtgärden för transaktion 2 misslyckas med ett ERROR_SHARING_VIOLATION undantag. | Den öppna åtgärden för transaktion 2 misslyckas med ett ERROR_SHARING_VIOLATION undantag. |
Öppen för SELECT med repeterbar läsning. |
Öppna för läsning. | Båda lyckas. | Båda lyckas. |
Öppen för SELECT med repeterbar läsning. |
Öppna för skrivning. | Den öppna åtgärden för transaktion 2 misslyckas med ett ERROR_SHARING_VIOLATION undantag. | Den öppna åtgärden för transaktion 2 misslyckas med ett ERROR_SHARING_VIOLATION undantag. |
Genomskrivning från fjärrklienter
Fjärrfilsystemåtkomst till FILESTREAM-data aktiveras via SMB-protokollet (Server Message Block). Om klienten är fjärransluten cachelagras inga skrivåtgärder av klientsidan. Skrivåtgärderna skickas alltid till servern. Data kan cachelagras på serversidan. Vi rekommenderar att program som körs på fjärrklienter konsoliderar små skrivåtgärder till större storleksåtgärder. Målet är att utföra färre skrivningar.
Det går inte att skapa minnesmappade vyer (minnesmappad I/O) med hjälp av ett FILESTREAM-handtag. Om minnesmappning används för FILESTREAM-data kan databasmotorn inte garantera konsekvens och hållbarhet för data eller databasens integritet.
Rekommendationer och riktlinjer för att förbättra FILESTREAM-prestanda
Med funktionen SQL Server FILESTREAM kan du lagra binär(max) binära stora objektdata som filer i filsystemet. När du har ett stort antal rader i FILESTREAM-containrar, som är den underliggande lagringen för både FILESTREAM-kolumner och FileTables, kan du få en filsystemvolym som innehåller ett stort antal filer. För att uppnå bästa prestanda vid bearbetning av integrerade data från databasen och filsystemet är det viktigt att se till att filsystemet justeras optimalt. Följande är några av de justeringsalternativ som är tillgängliga ur ett filsystemperspektiv:
Höjdkontroll för SQL Server FILESTREAM-filterdrivrutinen (till exempel
rsfx0100.sys). Utvärdera alla filterdrivrutiner som läses in för lagringsstacken som är associerad med en volym där FILESTREAM-funktionen lagrar filer och se till att rsfx-drivrutinen finns längst ned i stacken. Du kan använda FLTMC.EXE kontrollprogrammet för att räkna upp filterdrivrutinerna för en viss volym. Här är ett exempel på utdata från FLTMC-verktyget:C:\Windows\System32>fltMC.exefilterFilternamn Antal instanser Höjd Ram Sftredir 1 406000 0 MpFilter 9 328000 0 luafv 1 135000 0 FileInfo 9 45000 0 RsFx0103 1 41001.03 0 Kontrollera att servern har egenskapen "senaste åtkomsttid" inaktiverad för filerna. Det här filsystemattributet underhålls i registret: Nyckelnamn:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemNamn: NtfsDisableLastAccessUpdate-typ: REG_DWORD Värde: 1Kontrollera att 8.3-namngivning har inaktiverats på servern. Det här filsystemattributet underhålls i registret: Nyckelnamn:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemNamn: NtfsDisable8dot3NameSkapa typ: REG_DWORD Värde: 1Kontrollera att FILESTREAM-katalogcontainrarna inte har filsystemkryptering eller filsystemkomprimering aktiverat, eftersom dessa kan medföra en nivå av omkostnader vid åtkomst till dessa filer.
Kör fltmc-instanser från en upphöjd kommandotolk och se till att inga filterdrivrutiner är anslutna till volymen där du försöker återställa.
Kontrollera att FILESTREAM-katalogcontainrar inte har fler än 300 000 filer. Du kan använda informationen från
sys.database_fileskatalogvyn för att ta reda på vilka kataloger i filsystemets lagringsfilerFILESTREAM-related. Detta kan förhindras genom att ha flera containrar. (Mer information finns i nästa punktobjekt.)Med endast en FILESTREAM-filgrupp skapas alla datafiler under samma mapp. Filskapande av ett mycket stort antal filer kan påverkas av stora NTFS-index, som också kan bli fragmenterade.
Att ha flera filgrupper bör i allmänhet hjälpa till med detta (programmet använder partitionering eller har flera tabeller, var och en går till sin egen filgrupp).
Med SQL Server 2012 (11.x) och senare versioner kan du ha flera containrar eller filer under en FILESTREAM-filgrupp, och ett allokeringsschema för resursallokering tillämpas. Därför blir antalet NTFS-filer per katalog mindre.
Säkerhetskopiering och återställning kan gå snabbare med flera FILESTREAM-containrar om flera volymer som lagrar containrar används.
SQL Server 2012 (11.x) stöder flera containrar per filgrupp och kan göra det enklare. Det kan inte behövas några komplicerade partitioneringsscheman för att hantera ett större antal filer.
När det finns ett mycket stort antal FILESTREAM-containrar i en SQL-instans kan det ta lång tid att starta databaserna med många FILESTREAM-containrar i FILESTREAM-filterdrivrutinen. Att sprida dem i flera olika volymer hjälper till att förbättra databasens starttid.
NTFS MFT kan bli fragmenterad och det kan orsaka prestandaproblem. Den reserverade MFT-storleken beror på volymstorleken, så du kanske eller kanske inte stöter på detta.
Du kan kontrollera MFT-fragmenteringen med
defrag /A /V C:(ändra C: till det faktiska volymnamnet).Du kan reservera mer MFT-utrymme med hjälp av fsutil-beteendeuppsättningen mftzone 2.
FILESTREAM-datafiler bör undantas från genomsökning av antivirusprogram.
Anmärkning
Windows Server 2016 aktiverar automatiskt Windows Defender. Kontrollera att Windows Defender är konfigurerat för att undanta Filestream-filer. Om du inte gör det kan prestandan för säkerhetskopierings- och återställningsåtgärder försämras.
Mer information finns i Konfigurera och validera undantag för Windows Defender Antivirus-genomsökningar.
Relaterade uppgifter
- Aktivera och konfigurera FILESTREAM-
- Skapa en FILESTREAM-Enabled-databas
- Skapa en tabell för lagring av FILESTREAM-data
- Få åtkomst till FILESTREAM-data med Transact-SQL
- Skapa klientprogram för FILESTREAM-data
- Komma åt FILESTREAM-data med OpenSqlFilestream
- Göra partiella uppdateringar av FILESTREAM-data
- Undvik konflikter med databasåtgärder i FILESTREAM-program
- Flytta en FILESTREAM-aktiverad databas
- Konfigurera FILESTREAM på ett redundanskluster
- Konfigurera en brandvägg för FILESTREAM-åtkomst