Aracılığıyla paylaş


FILESTREAM (SQL Server)

Şunlar için geçerlidir:SQL Server - Yalnızca Windows

FILESTREAM, SQL Server tabanlı uygulamaların belgeler ve görüntüler gibi yapılandırılmamış verileri dosya sisteminde depolamasına olanak tanır. Uygulamalar zengin akış API'lerini ve dosya sisteminin performansını kullanabilir ve aynı zamanda yapılandırılmamış veri ile ilgili yapılandırılmış veriler arasında işlem tutarlılığını koruyabilir.

FILESTREAM, varbinary(max) ikili büyük nesne (BLOB) verilerini dosya sisteminde dosya olarak depolayarak SQL Server Veritabanı Altyapısı'nı NTFS veya ReFS dosya sistemleriyle tümleştirir. Transact-SQL deyimleri FILESTREAM verilerini ekleyebilir, güncelleştirebilir, sorgulayabilir, arayabilir ve yedekleyebilir. Win32 dosya sistemi arabirimleri verilere akış erişimi sağlar.

FILESTREAM, dosya verilerini önbelleğe almak için NT sistem önbelleğini kullanır. Dosyaları sistem önbelleğinde önbelleğe almak, FILESTREAM verilerinin Veritabanı Altyapısı performansı üzerindeki etkisini azaltmaya yardımcı olur. SQL Server arabellek havuzu kullanılmaz; bu nedenle, bu bellek sorgu işleme için kullanılabilir.

SQL Server'ı yüklediğinizde veya yükselttiğinızda FILESTREAM otomatik olarak etkinleştirilmez. SQL Server Configuration Manager ve SQL Server Management Studio kullanarak FILESTREAM'ı etkinleştirmeniz gerekir. FILESTREAM kullanmak için, veritabanını özel bir dosya grubu türü içerecek şekilde oluşturmanız veya değiştirmeniz gerekir. Ardından, FILESTREAM özniteliğine sahip bir varbinary(max) sütunu içermesi için bir tablo oluşturun veya değiştirin. Bu görevleri tamamladıktan sonra Transact-SQL ve Win32 kullanarak FILESTREAM verilerini yönetebilirsiniz.

FILESTREAM Ne Zaman Kullanılır?

SQL Server'da, BLOB'lar verileri tablolarda depolayan standart varbinary(max) veriler veya verileri dosya sisteminde depolayan FILESTREAM varbinary(max) nesneleri olabilir. Verilerin boyutu ve kullanımı, veritabanı depolama alanı mı yoksa dosya sistemi depolama alanı mı kullanmanız gerektiğini belirler. Aşağıdaki koşullar doğruysa FILESTREAM kullanmayı düşünmelisiniz:

  • Depolanmakta olan nesneler ortalama olarak 1 MB'tan büyüktür.
  • Hızlı okuma erişimi önemlidir.
  • Uygulama mantığı için orta katman kullanan uygulamalar geliştireceksiniz.

Daha küçük nesneler için varbinary(max) BLOB'ların veritabanında depolanması genellikle daha iyi akış performansı sağlar.

FILESTREAM Depolama

FILESTREAM depolama, verilerin dosya sisteminde BLOB olarak depolandığı bir varbinary(max) sütunu olarak uygulanır. BLOB'ların boyutları yalnızca dosya sisteminin birim boyutuyla sınırlıdır. 2 GB dosya boyutlarının standart varbinary(max) sınırlaması, dosya sisteminde depolanan BLOB'lar için geçerli değildir.

Bir sütunun dosya sisteminde veri depolaması gerektiğini belirtmek için , varbinary(max) sütununda FILESTREAM özniteliğini belirtin. Bu öznitelik, Veritabanı Altyapısı'nın bu sütuna ilişkin tüm verileri dosya sisteminde depolamasına neden olur, ancak veritabanı dosyasında depolamaz.

FILESTREAM verileri FILESTREAM dosya gruplarında depolanmalıdır. FILESTREAM dosya grubu, dosyaların kendileri yerine dosya sistemi dizinlerini içeren özel bir dosya grubudur. Bu dosya sistemi dizinlerine veri kapsayıcıları adı verilir. Veri kapsayıcıları, Veritabanı Altyapısı depolama alanı ile dosya sistemi depolaması arasındaki arabirimdir.

FILESTREAM depolamayı kullanırken aşağıdakileri göz önünde bulundurun:

  • Bir tablo FILESTREAM sütunu içerdiğinde, her satırın null olmayan benzersiz bir satır kimliği olmalıdır.
  • FILESTREAM dosya grubuna birden çok veri kapsayıcısı eklenebilir.
  • FILESTREAM veri kapsayıcıları iç içe yerleştirilemiyor.
  • Yük devretme kümelemesi kullanırken FILESTREAM dosya gruplarının paylaşılan disk kaynaklarında olması gerekir.
  • FILESTREAM dosya grupları sıkıştırılmış birimlerde olabilir.

Tümleşik Yönetim

FILESTREAM bir varbinary(max) sütunu olarak uygulandığından ve doğrudan Veritabanı Altyapısı ile tümleştirildiğinden, ÇOĞU SQL Server yönetim aracı ve işlevi FILESTREAM verileri için değişiklik yapmadan çalışır. Örneğin, tüm yedekleme ve kurtarma modellerini FILESTREAM verileriyle kullanabilirsiniz ve FILESTREAM verileri veritabanındaki yapılandırılmış verilerle yedeklenmiştir. FILESTREAM verilerini ilişkisel verilerle yedeklemek istemiyorsanız, FILESTREAM dosya gruplarını dışlamak için kısmi yedekleme kullanabilirsiniz.

Tümleşik Güvenlik

SQL Server'da, FILESTREAM verileri de diğer verilerin güvenliğinin sağlanması gibi güvenli hale getirilir: tablo veya sütun düzeylerinde izinler vererek. Bir kullanıcının tablodaki FILESTREAM sütununa izni varsa, kullanıcı ilişkili dosyaları açabilir.

Uyarı

ŞIFRELEME FILESTREAM verilerinde desteklenmez.

Yalnızca SQL Server hizmet hesabının çalıştığı hesaba FILESTREAM kapsayıcısı için izinler verilir. Veri kapsayıcısı üzerinde başka hiçbir hesaba izin verilmediğini öneririz.

Uyarı

SQL oturum açma işlemleri FILESTREAM kapsayıcılarıyla çalışmaz. FILESTREAM kapsayıcılarıyla yalnızca NTFS veya ReFS kimlik doğrulaması çalışır.

Transact-SQL ve Dosya Sistemi Akış Erişimi ile BLOB Verilerine Erişme

Verileri bir FILESTREAM sütununda depoladıktan sonra, Transact-SQL işlemleri veya Win32 API'lerini kullanarak dosyalara erişebilirsiniz.

erişimi Transact-SQL

Transact-SQL kullanarak FILESTREAM verilerini ekleyebilir, güncelleştirebilir ve silebilirsiniz:

  • Bir FILESTREAM alanını null değer, boş değer veya görece kısa satır içi verilerle önceden doldurmaya yönelik bir ekleme işlemi kullanabilirsiniz. Ancak, win32 arabirimleri kullanan bir dosyaya büyük miktarda veri daha verimli bir şekilde akışı yapılır.
  • FILESTREAM alanını güncelleştirdiğinizde, dosya sistemindeki temel BLOB verilerini değiştirirsiniz. FILESTREAM alanı olarak NULLayarlandığında, alanla ilişkili BLOB verileri silinir. Verilerde kısmi güncelleştirmeler gerçekleştirmek için .**Write() olarak UPDATEuygulanan Transact-SQL öbekli güncelleştirmeyi kullanamazsınız.
  • Bir satırı sildiğinizde veya FILESTREAM verileri içeren bir tabloyu sildiğinizde veya kestiğinizde, dosya sistemindeki temel BLOB verilerini silersiniz.

Dosya Sistemi Akış Erişimi

Win32 akış desteği, SQL Server işlemi bağlamında çalışır. Bir işlem içinde, bir dosyanın mantıksal UNC dosya sistemi yolunu almak için FILESTREAM işlevlerini kullanabilirsiniz. Ardından dosya tanıtıcısını almak için OpenSqlFilestream API'sini kullanırsınız. Bu tanıtıcı daha sonra Dosya sistemi yoluyla dosyaya erişmek ve dosyayı güncelleştirmek için ReadFile() ve WriteFile() gibi Win32 dosya akışı arabirimleri tarafından kullanılabilir.

Dosya işlemleri işlemsel olduğundan dosya sistemi aracılığıyla FILESTREAM dosyalarını silemez veya yeniden adlandıramazsınız.

Uyarı

FILESTREAM kapsayıcısı, SQL Server tarafından yönetilen bir klasördür. FILESTREAM klasörüne el ile veya diğer uygulamalar aracılığıyla dosya eklemeyin veya kaldırmayın. Bunu yaparsanız, bu yedekleme ve tutarsızlık hatalarına neden olur. Daha fazla bilgi için bkz. MSSQLSERVER_3056, MSSQLSERVER_7908 ve MSSQLSERVER_7906.

Deyim modeli

FILESTREAM dosya sistemi erişimi, dosya açma ve kapatma kullanarak bir Transact-SQL deyimini modeller. Deyimi, bir dosya tanıtıcısı açıldığında başlar ve tanıtıcı kapatıldığında biter. Örneğin, bir yazma tutamacı kapatıldığında, tabloya kaydedilen tüm olası AFTER tetikleyiciler bir UPDATE deyim tamamlanmış gibi tetikler.

Depolama ad alanı

FILESTREAM'da Veritabanı Altyapısı, BLOB fiziksel dosya sistemi ad alanını denetler. Yeni bir iç işlev olan PathName, tablodaki her FILESTREAM hücresine karşılık gelen BLOB'un mantıksal UNC yolunu sağlar. Uygulama, normal Win32 dosya sistemi arabirimlerini kullanarak Win32 tanıtıcısını almak ve BLOB verileri üzerinde çalışmak için bu mantıksal yolu kullanır. İşlev, FILESTREAM sütununun değeri ise NULLdöndürürNULL.

İşlem yapılan dosya sistemi erişimi

GET_FILESTREAM_TRANSACTION_CONTEXT yeni bir iç işlev, oturumun ilişkili olduğu geçerli işlemi temsil eden belirteci sağlar. İşlem başlatılmış ve henüz durdurulmamış veya işlenmemiş olmalıdır. Uygulama bir belirteç alarak FILESTREAM dosya sistemi akış işlemlerini başlatılan bir işlemle bağlar. İşlev, açıkça başlatılan bir işlem olmaması durumunda döndürür NULL .

İşlem işlenmeden veya durdurulmadan önce tüm dosya tanıtıcılarının kapatılması gerekir. Bir tanıtıcı işlem kapsamının dışında açık bırakılırsa, tanıtıcıya karşı ek okumalar hataya neden olur; tanıtıcıya yönelik ek yazma işlemleri başarılı olur, ancak gerçek veriler diske yazılamaz. Benzer şekilde, Veritabanı Altyapısı'nın veritabanı veya örneği kapatılırsa, tüm açık tanıtıcılar geçersiz kılınır.

İşlem dayanıklılığı

FILESTREAM ile, işlem işlemesi üzerine Veritabanı Altyapısı, dosya sistemi akış erişiminden değiştirilen FILESTREAM BLOB verileri için işlem dayanıklılığı sağlar.

Yalıtım semantiği

Yalıtım semantiği, Veritabanı Altyapısı işlem yalıtım düzeyleri tarafından yönetilir. Transact-SQL ve dosya sistemi erişimi için okumayla kaydedilmiş yalıtım düzeyi desteklenir. Yinelenebilir okuma işlemleri, serileştirilebilir ve anlık görüntü yalıtım düzeyleri desteklenir. Kirli okuma desteklenmez.

Dosya sistemi erişim açma işlemleri herhangi bir kilit beklemez. Bunun yerine, açık işlemler işlem yalıtımı nedeniyle verilere erişemezse hemen başarısız olur. Yalıtım ihlali nedeniyle açma işlemi devam edemiyorsa akış API'sinin çağrıları ERROR_SHARING_VIOLATION başarısız olur.

Kısmi güncelleştirmelerin yapılmasına izin vermek için uygulama, eski içeriği açılan tanıtıcının başvuracağı dosyaya getirmek için bir cihaz FS denetimi (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) verebilir. Bu, sunucu tarafı eski içerik kopyasını tetikler. Daha iyi uygulama performansı sağlamak ve çok büyük dosyalarla çalışırken olası zaman aşımlarıyla karşılaşmamak için zaman uyumsuz G/Ç kullanmanızı öneririz.

Tanıtıcıya yazıldıktan sonra FSCTL verilirse, son yazma işlemi kalıcı olur ve tanıtıcıya yapılan önceki yazma işlemleri kaybolur.

Dosya sistemi API'leri ve desteklenen yalıtım düzeyleri

Bir dosya sistemi API'sinin yalıtım ihlali nedeniyle bir dosyayı açamadığı durumlarda, ERROR_SHARING_VIOLATION özel durumu döndürülür. Bu yalıtım ihlali, iki işlem aynı dosyaya erişmeye çalıştığında oluşur. Erişim işleminin sonucu, dosyanın açıldığı moda ve işlemin üzerinde çalıştığı SQL Server sürümüne bağlıdır. Aşağıdaki tabloda, aynı dosyaya erişen iki işlemin olası sonuçları özetlenmiştir.

İşlem 1 İşlem 2 SQL Server 2008 (10.0.x) sonucu SQL Server 2008 R2 (10.50.x) ve sonraki sürümlerde sonuç
Okumak için açın. Okumak için açın. İkisi de başarılı olur. İkisi de başarılı olur.
Okumak için açın. Yazma için açın. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri, 1. işlemde gerçekleştirilen okuma işlemlerini etkilemez. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri, 1. işlemde gerçekleştirilen okuma işlemlerini etkilemez.
Yazma için açın. Okumak için açın. 2. işlem için açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor. İkisi de başarılı olur.
Yazma için açın. Yazma için açın. 2. işlem için açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor. 2. işlem için açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor.
Okumak için açın. için SELECTaçın. İkisi de başarılı olur. İkisi de başarılı olur.
Okumak için açın. veya DELETEiçin UPDATE açın. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri, 1. işlemde gerçekleştirilen okuma işlemlerini etkilemez. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri, 1. işlemde gerçekleştirilen okuma işlemlerini etkilemez.
Yazma için açın. için SELECTaçın. İşlem 1 işlemi işleyene veya sonlandırana kadar işlem 2 blokları ya da işlem kilidi zaman aşımına uğradı. İkisi de başarılı olur.
Yazma için açın. veya DELETEiçin UPDATE açın. İşlem 1 işlemi işleyene veya sonlandırana kadar işlem 2 blokları ya da işlem kilidi zaman aşımına uğradı. İşlem 1 işlemi işleyene veya sonlandırana kadar işlem 2 blokları ya da işlem kilidi zaman aşımına uğradı.
için SELECTaçın. Okumak için açın. İkisi de başarılı olur. İkisi de başarılı olur.
için SELECTaçın. Yazma için açın. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri 1. işlemi etkilemez. İkisi de başarılı olur. 2. işlem altındaki yazma işlemleri 1. işlemi etkilemez.
veya DELETEiçin UPDATE açın. Okumak için açın. 2. işlemdeki açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor. İkisi de başarılı olur.
veya DELETEiçin UPDATE açın. Yazma için açın. 2. işlemdeki açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor. 2. işlemdeki açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor.
Tekrarlanabilir okuma ile için SELECT açın. Okumak için açın. İkisi de başarılı olur. İkisi de başarılı olur.
Tekrarlanabilir okuma ile için SELECT açın. Yazma için açın. 2. işlemdeki açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor. 2. işlemdeki açma işlemi bir ERROR_SHARING_VIOLATION özel durumuyla başarısız oluyor.

Uzak istemcilerden yazma

FILESTREAM verilerine uzak dosya sistemi erişimi, Sunucu İleti Bloğu (SMB) protokolü üzerinden etkinleştirilir. İstemci uzaksa, istemci tarafında hiçbir yazma işlemi önbelleğe alınmaz. Yazma işlemleri her zaman sunucuya gönderilir. Veriler sunucu tarafında önbelleğe alınabiliyor. Uzak istemcilerde çalışan uygulamaların küçük yazma işlemlerini daha büyük boyutlu işlemlerde birleştirmesini öneririz. Amaç daha az yazma işlemi gerçekleştirmektir.

FILESTREAM tutamacını kullanarak bellek eşlenmiş görünümler (bellek eşlenmiş G/Ç) oluşturma desteklenmez. FILESTREAM verileri için bellek eşlemesi kullanılıyorsa, Veritabanı Altyapısı verilerin tutarlılığını ve dayanıklılığını veya veritabanının bütünlüğünü garanti etmez.

FILESTREAM performansını iyileştirmeye yönelik öneriler ve yönergeler

SQL Server FILESTREAM özelliği, varbinary(max) ikili büyük nesne verilerini dosya sisteminde dosya olarak depolamanıza olanak tanır. FILESTREAM kapsayıcılarında hem FILESTREAM sütunları hem de FileTable'lar için temel alınan depolama alanı olan çok sayıda satırınız olduğunda, çok sayıda dosya içeren bir dosya sistemi birimi elde edebilirsiniz. Veritabanından ve dosya sisteminden tümleşik verileri işlerken en iyi performansı elde etmek için dosya sisteminin en iyi şekilde ayarlandığından emin olmak önemlidir. Dosya sistemi perspektifinden kullanılabilen ayarlama seçeneklerinden bazıları şunlardır:

  • SQL Server FILESTREAM filtre sürücüsü için yükseklik denetimi (örneğin, rsfx0100.sys). FILESTREAM özelliğinin dosyaları depoladığı bir birimle ilişkili depolama yığını için yüklenen tüm filtre sürücülerini değerlendirin ve rsfx sürücüsünün yığının en altında bulunduğundan emin olun. Belirli bir birimin filtre sürücülerini listelemek için FLTMC.EXE denetim programını kullanabilirsiniz. FLTMC yardımcı programının örnek çıktısı aşağıda verilmiştir: C:\Windows\System32>fltMC.exe filtreler

    Filtre Adı Num Instances Yükseklik Çerçeve
    Sftredir 1 406000 0
    MpFilter 9 328000 0
    luafv 1 135000 0
    FileInfo 9 45000 0
    RsFx0103 1 41001.03 0
  • Sunucuda dosyalar için "son erişim zamanı" özelliğinin devre dışı bırakıldığını denetleyin. Bu dosya sistemi özniteliği kayıt defterinde korunur: Anahtar Adı: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Ad: NtfsDisableLastAccessUpdate Türü: REG_DWORD Değer: 1

  • Sunucuda 8.3 adlandırmanın devre dışı bırakıldığını denetleyin. Bu dosya sistemi özniteliği kayıt defterinde korunur: Anahtar Adı: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Ad: NtfsDisable8dot3NameCreation Type: REG_DWORD Değer: 1

  • BU dosyalara erişirken bir yük düzeyine neden olabileceğinden, FILESTREAM dizin kapsayıcılarının dosya sistemi şifrelemesi veya dosya sistemi sıkıştırmasının etkin olup olmadığını denetleyin.

  • Yükseltilmiş bir komut isteminden fltmc örneklerini çalıştırın ve geri yüklemeye çalıştığınız birime hiçbir filtre sürücüsünün bağlı olmadığından emin olun.

  • FILESTREAM dizin kapsayıcılarının 300.000'den fazla dosya olup olmadığını denetleyin. Dosya sistemindeki dosyaları depolayan FILESTREAM-related dizinleri bulmak için katalog görünümündeki bilgileri sys.database_files kullanabilirsiniz. Bu, birden çok kapsayıcıya sahip olmakla önlenebilir. (Daha fazla bilgi için sonraki madde işaretine bakın.)

  • Yalnızca bir FILESTREAM dosya grubuyla, tüm veri dosyaları aynı klasör altında oluşturulur. Çok fazla sayıda dosyanın oluşturulması, parçalanabilen büyük NTFS dizinlerinden etkilenebilir.

    • Birden çok dosya grubuna sahip olmak genellikle bu konuda yardımcı olmalıdır (uygulama bölümleme kullanır veya her biri kendi dosya grubuna giden birden çok tablosu vardır).

    • SQL Server 2012 (11.x) ve sonraki sürümleriyle, FILESTREAM dosya grubu altında birden çok kapsayıcınız veya dosyanız olabilir ve hepsini bir kez deneme ayırma düzeni uygulanır. Bu nedenle, dizin başına NTFS dosyası sayısı azalır.

  • Kapsayıcıları depolayarak birden çok birim kullanılıyorsa, yedekleme ve geri yükleme birden çok FILESTREAM kapsayıcısıyla daha hızlı hale gelebilir.

    SQL Server 2012 (11.x), dosya grubu başına birden çok kapsayıcıyı destekler ve işleri kolaylaştırabilir. Daha fazla sayıda dosyayı yönetmek için karmaşık bölümleme düzenleri gerekli olmayabilir.

  • SQL örneğinde çok fazla sayıda FILESTREAM kapsayıcısı olduğunda, veritabanlarını birçok FILESTREAM kapsayıcısıyla başlatmak, bunları FILESTREAM filtre sürücüsüne kaydetmek uzun sürebilir. Bunları birden çok farklı birime yaymak, veritabanı başlatma süresini iyileştirmeye yardımcı olur.

  • NTFS MFT parçalanabilir ve bu da performans sorunlarına neden olabilir. MFT ayrılmış boyutu birim boyutuna bağlıdır, bu nedenle bununla karşılaşabilir veya karşılaşmayabilirsiniz.

    • ile MFT parçalanmasını de kontrol edebilirsiniz (C: değerini gerçek birim adıyla defrag /A /V C: değiştirin).

    • fsutil behavior set mftzone 2 kullanarak daha fazla MFT alanı ayırabilirsiniz.

    • FILESTREAM veri dosyaları virüsten koruma yazılımı taramasının dışında tutulmalıdır.

      Uyarı

      Windows Server 2016, Windows Defender'a otomatik olarak olanak tanır. Windows Defender'ın Dosya Akışı dosyalarını dışlamak için yapılandırıldığından emin olun. Bunun yapılmaması, yedekleme ve geri yükleme işlemleri için performansın düşmesine neden olabilir.

      Daha fazla bilgi için bkz. Windows Defender Virüsten Koruma taramaları için dışlamaları yapılandırma ve doğrulama.