Kommentar
Å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 i 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 Databasmotor för SQL Server med filsystemen NTFS eller ReFS genom att lagra varbinary(max)-BLOB-data 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-filer vara standarddata av typen varbinary(max) som lagrar data i tabeller, eller FILESTREAM-objekt av typen varbinary(max) 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.
FILSTRÖMSLAGRING
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. Standardbegränsningen på 2 GB för filstorlekar för varbinary(max) gäller inte för BLOB:ar 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-åtkomst
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.
Satsmodell
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.
Transaktionsstyrd filsystemåtkomst
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 inte ännu ha avbrutits eller genomförts. 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 filhandtag måste stängas innan transaktionen genomförs 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 blir alla öppna referenser ogiltiga om databasen eller en instans av databasmotorn stängs ned.
Transaktionshållbarhet
Med FILESTREAM säkerställer databasmotorn, när transaktionen genomförs, transaktionsbeständighet för FILESTREAM-BLOB-data som ändras via strömningsåtkomst från filsystemet.
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. Smutslä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.
För att möjliggöra partiella uppdateringar kan programmet utfärda en FS-kontroll för enheten (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) för att hämta det gamla innehållet till filen som det öppnade handtaget refererar till. 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. | Tillgänglig 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 väntar tills transaktion 1 genomförs eller avslutas, eller tills tidsgränsen för transaktionslåset löper ut. | Båda lyckas. |
| Öppna för skrivning. | Öppna för UPDATE eller DELETE. |
Transaktion 2 väntar tills transaktion 1 genomförs eller avslutar transaktionen, eller tills tidsgränsen för transaktionslåset löper ut. | Transaktion 2 blockeras tills transaktion 1 genomförs eller avslutar transaktionen, eller tills tidsgränsen för transaktionslåset löper ut. |
Ö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. | Öppningsåtgärden på transaktion 2 misslyckas med undantaget ERROR_SHARING_VIOLATION. | Båda lyckas. |
Öppna för UPDATE eller DELETE. |
Öppna för skrivning. | Öppningsåtgärden på transaktion 2 misslyckas med undantaget ERROR_SHARING_VIOLATION. | Öppningsåtgärden på transaktion 2 misslyckas med undantaget ERROR_SHARING_VIOLATION. |
Öppen för SELECT med upprepningsbar läsning. |
Öppna för läsning. | Båda lyckas. | Båda lyckas. |
Öppen för SELECT med upprepbar läsning. |
Öppna för skrivning. | Öppningsåtgärden på transaktion 2 misslyckas med undantaget ERROR_SHARING_VIOLATION. | Öppningsåtgärden på transaktion 2 misslyckas med undantaget ERROR_SHARING_VIOLATION. |
Genomskrivning från fjärrklienter
Fjärrfilsystemåtkomst till FILESTREAM-data aktiveras via SMB-protokollet (Server Message Block). Om klienten är fjärransluten lagras inga skrivoperationer i cache på 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 SQL Server-funktionen FILESTREAM kan du lagra BLOB-data av typen varbinary(max) 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 kommandot `fltmc instances` från en kommandotolk med förhöjd behörighet och kontrollera att inga filterdrivrutiner är kopplade till volymen där du försöker återställa den.
Kontrollera att FILESTREAM-katalogcontainrar inte har fler än 300 000 filer. Du kan använda informationen i katalogvyn
sys.database_filesför att ta reda på vilka kataloger i filsystemet som lagrarFILESTREAM-related-filer. Detta kan förhindras genom att ha flera containrar. (Se nästa punkt för mer information.)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 i en FILESTREAM-filgrupp, och ett allokeringsschema enligt round-robin-principen 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 utrymme för MFT genom att använda fsutil behavior set 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-aktiverad 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