Bagikan melalui


FILESTREAM (SQL Server)

FILESTREAM memungkinkan aplikasi berbasis SQL Server untuk menyimpan data yang tidak terstruktur, seperti dokumen dan gambar, pada sistem file. Aplikasi dapat memanfaatkan API streaming yang kaya dan performa sistem file dan pada saat yang sama mempertahankan konsistensi transaksional antara data yang tidak terstruktur dan data terstruktur yang sesuai.

FILESTREAM mengintegrasikan mesin database SQL Server dengan sistem file NTFS dengan menyimpan varbinary(max) data objek besar biner (BLOB) sebagai file pada sistem file. Pernyataan T-SQL dapat menyisipkan, memperbarui, mengkueri, mencari, dan mencadangkan data ALIRAN FILE. Antarmuka sistem file Win32 menyediakan akses streaming ke data.

FILESTREAM menggunakan cache sistem NT untuk penembolokan data file. Ini membantu mengurangi efek apa pun yang mungkin dimiliki data FILESTREAM pada performa Mesin Database. Kumpulan buffer SQL Server tidak digunakan; oleh karena itu, memori ini tersedia untuk pemrosesan kueri.

FILESTREAM tidak diaktifkan secara otomatis saat Anda menginstal atau memutakhirkan SQL Server. Anda harus mengaktifkan FILESTREAM dengan menggunakan Pengelola Konfigurasi SQL Server dan SQL Server Management Studio. Untuk menggunakan FILESTREAM, Anda harus membuat atau mengubah database agar berisi tipe grup file khusus. Kemudian, buat atau ubah tabel sehingga berisi varbinary(max) kolom dengan atribut FILESTREAM. Setelah menyelesaikan tugas-tugas ini, Anda dapat menggunakan Transact-SQL dan Win32 untuk mengelola data FILESTREAM.

Untuk informasi selengkapnya tentang menginstal dan menggunakan FILESTREAM, lihat daftar Tugas Terkait.

Kapan Menggunakan FILESTREAM

Dalam SQL Server, BLOB dapat menjadi data standar varbinary(max) yang menyimpan data dalam tabel, atau objek FILESTREAM varbinary(max) yang menyimpan data dalam sistem file. Ukuran dan penggunaan data menentukan apakah Anda harus menggunakan penyimpanan database atau penyimpanan sistem file. Jika kondisi berikut ini benar, Anda harus mempertimbangkan untuk menggunakan FILESTREAM:

  • Objek yang disimpan rata-rata lebih besar dari 1 MB.

  • Akses baca cepat penting.

  • Anda mengembangkan aplikasi yang menggunakan tingkat menengah untuk logika aplikasi.

Untuk objek yang lebih kecil, menyimpan varbinary(max) BLOB dalam database sering memberikan performa streaming yang lebih baik.

Penyimpanan FILESTREAM

Penyimpanan FILESTREAM diimplementasikan sebagai varbinary(max) kolom tempat data disimpan sebagai BLOB dalam sistem file. Ukuran BLOB hanya dibatasi oleh ukuran volume sistem file. Batasan standar varbinary(max) ukuran file 2 GB tidak berlaku untuk BLOB yang disimpan dalam sistem file.

Untuk menentukan bahwa kolom harus menyimpan data pada sistem file, tentukan atribut FILESTREAM pada varbinary(max) kolom. Hal ini menyebabkan Mesin Database menyimpan semua data untuk kolom tersebut pada sistem file, tetapi tidak dalam file database.

Data FILESTREAM harus disimpan dalam grup file FILESTREAM. Grup file FILESTREAM adalah grup file khusus yang berisi direktori sistem file alih-alih file itu sendiri. Direktori sistem file ini disebut kontainer data. Kontainer data adalah antarmuka antara penyimpanan Mesin Database dan penyimpanan sistem file.

Saat Anda menggunakan penyimpanan FILESTREAM, pertimbangkan hal berikut:

  • Saat tabel berisi kolom FILESTREAM, setiap baris harus memiliki ID baris unik nonnull.

  • Beberapa kontainer data dapat ditambahkan ke grup file FILESTREAM.

  • Kontainer data FILESTREAM tidak dapat ditumpuk.

  • Ketika Anda menggunakan pengklusteran failover, grup file FILESTREAM harus berada di sumber daya disk bersama.

  • Grup file FILESTREAM dapat berada pada volume terkompresi.

Manajemen Terintegrasi

Karena FILESTREAM diimplementasikan sebagai varbinary(max) kolom dan diintegrasikan langsung ke dalam Mesin Database, sebagian besar alat dan fungsi manajemen SQL Server berfungsi tanpa modifikasi untuk data FILESTREAM. Misalnya, Anda dapat menggunakan semua model pencadangan dan pemulihan dengan data FILESTREAM, dan data FILESTREAM dicadangkan dengan data terstruktur dalam database. Jika Anda tidak ingin mencadangkan data FILESTREAM dengan data relasional, Anda dapat menggunakan cadangan parsial untuk mengecualikan grup file FILESTREAM.

Keamanan Terintegrasi

Dalam SQL Server, data FILESTREAM diamankan sama seperti data lain diamankan: dengan memberikan izin di tingkat tabel atau kolom. Jika pengguna memiliki izin ke kolom FILESTREAM dalam tabel, pengguna dapat membuka file terkait.

Catatan

Enkripsi tidak didukung pada data FILESTREAM.

Hanya akun tempat akun layanan SQL Server berjalan diberikan izin NTFS ke kontainer FILESTREAM. Kami menyarankan agar tidak ada akun lain yang diberikan izin pada kontainer data.

Catatan

Login SQL tidak akan berfungsi dengan kontainer FILESTREAM. Hanya autentikasi NTFS yang akan berfungsi dengan kontainer FILESTREAM.

Mengakses Data BLOB dengan Transact-SQL dan Akses Streaming Sistem File

Setelah menyimpan data di kolom FILESTREAM, Anda dapat mengakses file dengan menggunakan transaksi Transact-SQL atau dengan menggunakan API Win32.

Akses Transact-SQL

Dengan menggunakan Transact-SQL, Anda dapat menyisipkan, memperbarui, dan menghapus data FILESTREAM:

  • Anda bisa menggunakan operasi sisipkan untuk mengisi bidang FILESTREAM dengan nilai null, nilai kosong, atau data sebaris yang relatif pendek. Namun, sejumlah besar data lebih efisien dialirkan ke dalam file yang menggunakan antarmuka Win32.

  • Saat memperbarui bidang FILESTREAM, Anda memodifikasi data BLOB yang mendasar dalam sistem file. Saat bidang FILESTREAM diatur ke NULL, data BLOB yang terkait dengan bidang akan dihapus. Anda tidak dapat menggunakan pembaruan terpotong Transact-SQL, yang diimplementasikan sebagai UPDATE**.**Write(), untuk melakukan pembaruan parsial pada data.

  • Saat Anda menghapus baris atau menghapus atau memotong tabel yang berisi data FILESTREAM, Anda menghapus data BLOB yang mendasar dalam sistem file.

Akses Streaming Sistem File

Dukungan streaming Win32 berfungsi dalam konteks transaksi SQL Server. Dalam transaksi, Anda dapat menggunakan fungsi FILESTREAM untuk mendapatkan jalur sistem file UNC logis dari file. Anda kemudian menggunakan OPENSqlFilestream API untuk mendapatkan handel file. Handel ini kemudian dapat digunakan oleh antarmuka streaming file Win32, seperti ReadFile() dan WriteFile(), untuk mengakses dan memperbarui file melalui sistem file.

Karena operasi file bersifat transaksi, Anda tidak dapat menghapus atau mengganti nama file FILESTREAM melalui sistem file.

Model Pernyataan

Sistem file FILESTREAM mengakses model pernyataan Transact-SQL dengan menggunakan file terbuka dan ditutup. Pernyataan dimulai ketika handel file dibuka dan berakhir ketika handel ditutup. Misalnya, ketika handel tulis ditutup, setiap kemungkinan pemicu AFTER yang terdaftar pada tabel diaktifkan seolah-olah pernyataan UPDATE selesai.

Namespace Penyimpanan

Dalam FILESTREAM, Mesin Database mengontrol namespace layanan sistem file fisik BLOB. Fungsi intrinsik baru, PathName, menyediakan jalur UNC logis dari BLOB yang sesuai dengan setiap sel FILESTREAM dalam tabel. Aplikasi ini menggunakan jalur logis ini untuk mendapatkan handel Win32 dan beroperasi pada data BLOB dengan menggunakan antarmuka sistem file Win32 biasa. Fungsi mengembalikan NULL jika nilai kolom FILESTREAM adalah NULL.

Akses Sistem File yang Ditransaksikan

Fungsi intrinsik baru, GET_FILESTREAM_TRANSACTION_CONTEXT(), menyediakan token yang mewakili transaksi saat ini yang terkait dengan sesi. Transaksi harus telah dimulai dan belum dibatalkan atau dilakukan. Dengan mendapatkan token, aplikasi mengikat operasi streaming sistem file FILESTREAM dengan transaksi yang dimulai. Fungsi mengembalikan NULL jika tidak ada transaksi yang dimulai secara eksplisit.

Semua handel file harus ditutup sebelum transaksi dilakukan atau dibatalkan. Jika handel dibiarkan terbuka di luar cakupan transaksi, bacaan tambahan terhadap handel akan menyebabkan kegagalan; penulisan tambahan terhadap handel akan berhasil, tetapi data aktual tidak akan ditulis ke disk. Demikian pula, jika database atau instans Mesin Database dimatikan, semua handel terbuka tidak valid.

Durabilitas Transaksi

Dengan FILESTREAM, setelah penerapan transaksi, Mesin Database memastikan durabilitas transaksi untuk data BLOB FILESTREAM yang dimodifikasi dari akses streaming sistem file.

Semantik Isolasi

Semantik isolasi diatur oleh tingkat isolasi transaksi Mesin Database. Tingkat isolasi yang diterapkan baca didukung untuk Transact-SQL dan akses sistem file. Operasi baca yang dapat diulang, dan juga isolasi yang dapat diserialisasikan dan rekam jepret, didukung. Bacaan kotor tidak didukung.

Operasi buka akses sistem file tidak menunggu kunci apa pun. Sebaliknya, operasi terbuka segera gagal jika mereka tidak dapat mengakses data karena isolasi transaksi. Panggilan API streaming gagal dengan ERROR_SHARING_VIOLATION jika operasi terbuka tidak dapat dilanjutkan karena pelanggaran isolasi.

Untuk memungkinkan pembaruan parsial dilakukan, aplikasi dapat mengeluarkan kontrol FS perangkat (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) untuk mengambil konten lama ke dalam file yang direferensikan oleh handel yang dibuka. Ini akan memicu salinan konten lama sisi server. Untuk performa aplikasi yang lebih baik dan untuk menghindari potensi waktu habis ketika Anda bekerja dengan file yang sangat besar, kami sarankan Anda menggunakan I/O asinkron.

Jika FSCTL dikeluarkan setelah handel ditulis, operasi tulis terakhir akan tetap ada, dan penulisan sebelumnya yang dibuat ke handel akan hilang.

API Sistem File dan Tingkat Isolasi yang Didukung

Ketika API sistem file tidak dapat membuka file karena pelanggaran isolasi, pengecualian ERROR_SHARING_VIOLATION dikembalikan. Pelanggaran isolasi ini terjadi ketika dua transaksi mencoba mengakses file yang sama. Hasil operasi akses tergantung pada mode tempat file dibuka dan versi SQL Server transaksi berjalan. Tabel berikut menguraikan kemungkinan hasil untuk dua transaksi yang mengakses file yang sama.

Transaksi 1 Transaksi 2 Hasil pada SQL Server 2008 Hasil pada SQL Server 2008 R2 dan versi yang lebih baru
Buka untuk dibaca. Buka untuk dibaca. Keduanya berhasil. Keduanya berhasil.
Buka untuk dibaca. Buka untuk menulis. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi operasi baca yang dilakukan dalam transaksi 1. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi operasi baca yang dilakukan dalam transaksi 1.
Buka untuk menulis. Buka untuk dibaca. Buka untuk transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION. Keduanya berhasil.
Buka untuk menulis. Buka untuk menulis. Buka untuk transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION. Buka untuk transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION.
Buka untuk dibaca. Buka untuk SELECT. Keduanya berhasil. Keduanya berhasil.
Buka untuk dibaca. Buka untuk UPDATE atau DELETE. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi operasi baca yang dilakukan dalam transaksi 1. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi operasi baca yang dilakukan dalam transaksi 1.
Buka untuk menulis. buka untuk SELECT. Transaksi 2 memblokir hingga transaksi 1 melakukan atau mengakhiri transaksi, atau waktu penguncian transaksi habis. Keduanya berhasil.
Buka untuk menulis. Buka untuk UPDATE atau DELETE. Transaksi 2 memblokir hingga transaksi 1 melakukan atau mengakhiri transaksi, atau waktu penguncian transaksi habis. Transaksi 2 memblokir hingga transaksi 1 melakukan atau mengakhiri transaksi, atau waktu penguncian transaksi habis.
Buka untuk SELECT. Buka untuk dibaca. Keduanya berhasil. Keduanya berhasil.
Buka untuk SELECT. Buka untuk menulis. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi transaksi 1. Keduanya berhasil. Operasi tulis di bawah transaksi 2 tidak memengaruhi transaksi 1.
Buka untuk UPDATE atau DELETE. Buka untuk dibaca. Operasi terbuka pada transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION. Keduanya berhasil.
Buka untuk UPDATE atau DELETE. Buka untuk menulis. Operasi terbuka pada transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION. Operasi terbuka pada transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION.
Buka untuk SELECT dengan bacaan berulang. Buka untuk dibaca. Keduanya berhasil. Keduanya berhasil.
Buka untuk SELECT dengan bacaan berulang. Buka untuk menulis. Operasi terbuka pada transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION. Operasi terbuka pada transaksi 2 gagal dengan pengecualian ERROR_SHARING_VIOLATION.

Write-Through dari Klien Jarak Jauh

Akses sistem file jarak jauh ke data FILESTREAM diaktifkan melalui protokol Blok Pesan Server (SMB). Jika klien jarak jauh, tidak ada operasi tulis yang di-cache oleh sisi klien. Operasi tulis akan selalu dikirim ke server. Data dapat di-cache di sisi server. Kami menyarankan agar aplikasi yang berjalan pada klien jarak jauh mengonsolidasikan operasi tulis kecil untuk membuat lebih sedikit operasi tulis menggunakan ukuran data yang lebih besar.

Membuat tampilan yang dipetakan memori (memori yang dipetakan I/O) dengan menggunakan handel FILESTREAM tidak didukung. Jika pemetaan memori digunakan untuk data FILESTREAM, Mesin Database tidak dapat menjamin konsistensi dan durabilitas data atau integritas database.

Tugas Terkait

Mengaktifkan dan Mengonfigurasi FILESTREAM
Membuat Database FILESTREAM-Enabled
Membuat Tabel untuk Menyimpan Data ALIRAN FILE
Mengakses Data FILESTREAM dengan Transact-SQL
Membuat Aplikasi Klien untuk Data FILESTREAM
Mengakses Data FILESTREAM dengan OpenSqlFilestream
Updates Parsial ke Data ALIRAN FILE
Hindari Konflik dengan Operasi Database di Aplikasi FILESTREAM
Memindahkan Database FILESTREAM-Enabled
Menyiapkan FILESTREAM pada Kluster Failover
Mengonfigurasi Firewall untuk Akses FILESTREAM

Konten terkait

Kompatibilitas FILESTREAM dengan Fitur SQL Server Lainnya