File Stream Nedir
File Stream yapısı, varbinary(MAX) BLOB nesneleri(doküman, resim, video vb.) sunucu üzerindeki NTFS File system üzerinde veritabanı ile bütünleşik yapıda tutar. File system üzerinde file stream dosyaları oluşturur ve bu dosyaları veritabanının bir parçası yapar. Blob nesneleri NTFS file system’de file stream yapıda tutmak yerine, tabloda varbinary(MAX) veri tipini kullanarak veritabanının içine de gömebiliriz. Eğer dosyalarınız genel olarak 1 MB’tan küçükse veritabanı üzerinde tutmanız performansı arttıracaktır. Bununla beraber BLOB verilerin boyutu büyük olduğu için veritabanı yönetimini zorlaştıracaktır.(Backup, DBCC CHECKDB,Restore vb.)
BLOB nesneleri File Stream kullanarak file system üzerinde tuttuğumuzda sanki veritabanının içindeymiş gibi tsql ile insert, update ve delete yapabiliyoruz. Ayrıca full backup aldığımız zaman, file stream verinin de backup’ını almış oluyoruz.
File Stream yapısının ne olduğunu daha açık bir şekilde anlatmak için FileStream kullanan bir veritabanı oluşturalım.
Öncelikle instance seviyesinde File Stream’i enable etmemiz gerekir. SQL Server Configuration Manager’ı açarak SQL Server Services kısmına geliyoruz ve sağ tarafta file stream’i enable etmek istediğimiz instance üzerinde sağ tıklayarak properties diyoruz.
Açılan ekranda FILESTREAM tab’ına geliyoruz ve Enable FILESTREAM for Transact-SQL access seçeneğini seçerek ok diyoruz.
Enable FILESTREAM for Transact-SQL access seçeneği file stream veriye transact sql erişimi için izin verdiğimiz anlamına geliyor.
Enable FILESTREAM for file I/O access seçeneği ise filestream için bir şeyi değiştirmez. Bu özelliği aktifleştirdiğinizde File Table’lara Windows üzerinden bir share gibi erişebilirsiniz. “File Table Nedir ve File Stream’den Farkları Neler” isimli makaleyi okumanızı öneririm.
Allow remote clients access to FILESTREAM data seçeneği ise file stream verisine uzak bilgisayarlardan erişim için izin vermemizi sağlıyor. Bu seçeneği de aktif etmenizi güvenlik gereği önermiyorum.
Daha sonra aşağıdaki script yardımıyla sp_configure üzerinden filestream’i açıyoruz. Sp_configure üzerinden yapılabilecek diğer işlemler için “sp_configure(SQL Server’da Server Seviyesinde Konfigurasyonlar)” isimli makalemi okumak isteyebilirsiniz.
EXEC sys.sp_configure N'filestream access level', N'1' GO RECONFIGURE WITH OVERRIDE GO
Aynı işlemi instance üzerinde sağ tıklayarak properties dedikten sonra Advanced sekmesinden FILESTREAM Access Level’den Transact-SQL access enabled seçeneğini seçerek de gerçekleştirebiliriz.
Bu işlemler bittikten sonra SQL Server Configuration Manager üzerinden SQL Server’ı restart etmemiz gerekiyor.
“SQL Server Configuration Manager Ayarları” isimli makalemde Configuration Manager üzerinden yapılabilecek diğer işlemleri görebilirsiniz.
FileStream kullanan bir veritabanı oluşturmak:
SSMS üzerinde Instance’ın altında Databases sekmesinde sağ tıklayarak aşağıdaki gibi New Database… diyoruz.
Öncelikle FileStream içermeden normal bir veritabanını aşağıdaki gibi oluşturalım. Veritabanı oluşturmak basit bir iş gibi gözükebilir fakat büyük sistemler için default değerlerle veritabanı oluşturursanız sonrasında başınız çok ağrıyacaktır. Bu yüzden “Veritabanı Oluşturmak Deyip Geçmeyin!” isimli makalemi okumanızı tavsiye ediyorum.
Veritabanını oluşturduktan sonra SSMS üzerinde veritabanına sağ tıklayarak properties diyoruz ve Filegroups sekmesinden aşağıda gördüğünüz gibi Add Filegroup diyerek filegroup’a bir isim veriyoruz. Ben FILESTREAMGROUP ismini verdim.
File Stream için bir filegroup oluşturduktan sonra veritabanına SSMS üzerinden tekrar sağ tıklıyoruz ve properties diyoruz.
Daha sonra aşağıdaki ekrandan Add diyerek Logical Name’ bir isim veriyoruz. Ben FileStreamVeri ismini verdim.
File Type kısmından FILESTREAM Data seçeneğini seçiyoruz.
Filegroups kısmından da, daha önce oluşturduğumuz FILESTREAMGROUP filegroup’unu seçiyoruz.
Path kısmındanda File Stream verinin konumlanacağı diski ve klasörü seçerek ok diyoruz.
Bu oluşturduğum veritabanının create script’ini almak için aşağıdaki gibi veritabanı üzerinde sağ tıklayarak Script Database as-> Create to->New query editor diyebilirsiniz.
Veritabanının create script’i aşağıdaki gibidir:
USE [master] GO CREATE DATABASE [FileStreamDB] CONTAINMENT = NONE ON PRIMARY ( NAME = N'FileStreamDB', FILENAME = N'C:\MSSQL\FileStreamDB.mdf' , SIZE = 262144KB , MAXSIZE = UNLIMITED, FILEGROWTH = 262144KB ), FILEGROUP [FILESTREAMGROUP] CONTAINS FILESTREAM DEFAULT ( NAME = N'FileStreamVeri', FILENAME = N'C:\MSSQL\FileStreamVeri' , MAXSIZE = UNLIMITED) LOG ON ( NAME = N'FileStreamDB_log', FILENAME = N'C:\MSSQL\FileStreamDB_log.ldf' , SIZE = 262144KB , MAXSIZE = 2048GB , FILEGROWTH = 262144KB ) GO ALTER DATABASE [FileStreamDB] SET COMPATIBILITY_LEVEL = 120 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [FileStreamDB].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [FileStreamDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [FileStreamDB] SET ANSI_NULLS OFF GO ALTER DATABASE [FileStreamDB] SET ANSI_PADDING OFF GO ALTER DATABASE [FileStreamDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [FileStreamDB] SET ARITHABORT OFF GO ALTER DATABASE [FileStreamDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [FileStreamDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [FileStreamDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [FileStreamDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [FileStreamDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [FileStreamDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [FileStreamDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [FileStreamDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [FileStreamDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [FileStreamDB] SET DISABLE_BROKER GO ALTER DATABASE [FileStreamDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [FileStreamDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [FileStreamDB] SET TRUSTWORTHY OFF GO ALTER DATABASE [FileStreamDB] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [FileStreamDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [FileStreamDB] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [FileStreamDB] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [FileStreamDB] SET RECOVERY FULL GO ALTER DATABASE [FileStreamDB] SET MULTI_USER GO ALTER DATABASE [FileStreamDB] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [FileStreamDB] SET DB_CHAINING OFF GO ALTER DATABASE [FileStreamDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [FileStreamDB] SET TARGET_RECOVERY_TIME = 0 SECONDS GO ALTER DATABASE [FileStreamDB] SET DELAYED_DURABILITY = DISABLED GO ALTER DATABASE [FileStreamDB] SET READ_WRITE GO
Veritabanını oluşturduktan sonra sıra file stream veri içeren tablo oluşturmaya geldi.
Aşağıdaki script yardımıyla tabloyu oluşturuyoruz.
USE FileStreamDB GO CREATE TABLE FileStreamOrnekTablo ( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE, [DocumanAdi] varchar(500), [DokumanDetay] VARBINARY(MAX) FILESTREAM NULL ) GO
Eğer tabloda uniqueidentifier tipinde bir kolon ROWGUIDCOL ve NOT NULL olarak bulunmassa tablo oluştururken aşağıdaki gibi hata alırsınız.
Msg 5505, Level 16, State 1, Line 1
A table that has FILESTREAM columns must have a nonnull unique column with the ROWGUIDCOL property.
FileStream veri içeren bir veritabanının backup ve restore işlemini normal backup restore işlemleri gibi yapabiliriz.
FileStream veri içeren bir veritabanının detach ve attach işlemlerini yapmak için “FileStream Veri İçeren Veritabanının Detach ve Attach Edilmesi” isimli makalemden faydalanabilirsiniz.