Bu yazımızda sql server 2005 ile hayatımıza giren Instant File Initialization özelliğini anlatmaya çalışacağız. Kurulum esnasında bize öneri olarak sunulan bu özelliğin performans anlamında katkılarını örneklerle göreceğiz. Öncelikle bir veritabanı oluşturulduğunda, genişletildiğinde (auto growth) veya geri yüklendiğinde (restore) diskten alan talebinde bulunulur ve ilgili alan işletim sistemi tarafından kullanılmayan disk alanı ile doldurulur. Bu, disk üzerinde 0’larla doldurulması gereken bir işlem olup zaman alabilmektedir. IFI özelliği aktif olsaydı eğer sistemin belirli işlemler için alan ayırması gerektiğinde, data dosyaları için 0 ile doldurma işlemi yapılmadan istenilen alan tanımlanmış olacaktı. Böylece uzun zaman alacak işlemler kısa sürede tamamlanabilir. Ayrıca acil durumlarda kesinti süresi azaltılarak SQL Server performansında iyileştirme yapılır. Kurulum esnasında bu özelliği nasıl aktif edeceğimizi ve sonuçlarını görelim.

Görsel 1: egitim.local adında bir domaine bağlı sanal makine üzerinde testlerimi gerçekleştireceğim.

Görsel 2: Sql Server 2019 kurulumu Server Configuration sekmesine geldiğimizde “Grant Perform Volume Maintenance Task privilege to SQL Server Database Engine Service” alanını işaretlememiz IFI özelliğini aktif etmemiz için yeterlidir.
Sql Server 2016’dan sonra kurulum aşamasında IFI aktif edilebilir. Bu noktada varsayılan olarak NT Service\MSSQLSERVER seçilebildiği gibi domain kullanıcısı da Account Name bölümüne girilebilmektedir. Burada dikkat edilmesi gereken nokta egitim\administrator kullanıcısının SQL Server için yetkili bir kullanıcı olmasıdır. IFI özelliğinin aktiflik durumunu Sql Server kurulumunu yaptıktan sonra farklı yollarla kontrol edebiliriz. Bu şekilde kurulumu gerçekleştirdikten sonra aşağıdaki sorguyu SSMS üzerinden çalıştırıyoruz.
SELECT servicename, instant_file_initialization_enabled FROM sys.dm_server_services WHERE servicename like 'SQL Server (%';

Görsel 3: Sql Server IFI açık olması durumunda ‘Y’, kapalı durumda ‘N’ şeklinde değer döndürür.
Kurulum esnasında özelliği aktif etmeyi kaçırırsak eğer Windows çalıştır kısmına secpol.msc yazarak ilgili bölümden aktif edebiliriz.

Görsel 4: Local Security Policy Ekranı
Görsel 5: Sql Server yetkili kullanıcısı ‘Add User or Group’ menüsünden eklenerek aktif hale getirilebilir.
Uyarı: İlgili kısım güncellendikten sonra Sql Server Configuration Manager kısmından servis restart edilmelidir.

Görsel 6: Sql Server 2019 yüklü sistemde çalıştır kısmına SQLServerManager15.msc yazarak ulaşılabilir.
Instant File Initialization özelliği kapalı olan bir makinede, 20 GB olacak şekilde test veritabanı oluşturalım ve işlemin ne kadar süreceğini test edelim.
CREATE DATABASE [DB20GB] ON PRIMARY (NAME = N'DB20GB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB.mdf', SIZE = 20GB , FILEGROWTH = 1GB ) LOG ON (NAME= N'DB20GB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB_log.ldf', SIZE = 256MB , FILEGROWTH = 256MB )

Görsel 7: Instant File Initialization kapalı bir ortamda veritabanı oluşturma işlemi 25 saniyede tamamlandı.
set statistics time on CREATE DATABASE [DB20GB] ON PRIMARY (NAME = N'DB20GB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB.mdf', SIZE = 20GB , FILEGROWTH = 1GB ) LOG ON (NAME= N'DB20GB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB_log.ldf', SIZE = 256MB , FILEGROWTH = 256MB )

Görsel 8: Instant File Initialization özelliğini aktif hale getirdik ve 1 saniyeden az bir sürede işlem tamamlandı.
Şimdi 10 gb bir veritabanını restore edebilmek için ne kadar süre gerekecek ona bakalım. Instant File Initialization özelliğinin kapalı olduğu durumda testimize başlayalım.
RESTORE DATABASE [DB10GB_Restore] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\DB10GB.bak' WITH FILE = 1, MOVE N'DB10GB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore.mdf', MOVE N'DB10GB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore_log.ldf', NOUNLOAD, STATS = 5

Görsel 9: 10 GB veri tabanının restore işlemi 22 saniyede tamamlandı.
SET STATISTICS TIME on RESTORE DATABASE [DB10GB_Restore] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\DB10GB.bak' WITH FILE = 1, MOVE N'DB10GB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore.mdf', MOVE N'DB10GB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore_log.ldf', NOUNLOAD, STATS = 5

Görsel 10: IFI özelliği aktif olan makinede 2.2 saniyede restore işlemi tamamlandı.
Transparent Data Encryption (TDE) mevcut veritabanlarında IFI aktif olsa dahi performans artışı sağlamaz. TDE veritabanının başka bir sunucuya kopyalanmasını veya restore işlemini önlemek için kullanılır. Hangi veritabanlarında TDE mevcut görmek için aşağıdaki sorgu kullanılabilir.
SELECT db.name, db.is_encrypted, dm.encryption_state, dm.percent_complete, dm.key_algorithm, dm.key_length FROM sys.databases db LEFT OUTER JOIN sys.dm_database_encryption_keys dm ON db.database_id = dm.database_id;

Görsel 11: Transparent Data Encryption mevcut olanlar is_encypted=1
TDE özelliğini veritabanına uygulamak için aşağıdaki sorguyu çalıştırabilirsiniz.
USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD='!Verit@b@ni.01'; GO CREATE CERTIFICATE TDECert WITH SUBJECT='DB_Encryption'; GO USE DB10GB GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TDECert; GO ALTER DATABASE DB10GB SET ENCRYPTION ON; GO
İlk olarak TDE aktif durumda DB10GB veritabanını 20 GB olacak şekilde güncelleyelim. Yukarıda paylaştığımız 20 GB veritabanı oluşturma sorgusunda boyut kısmını 10 GB olarak değiştirip teste başlayabilirsiniz.
set statistics time on use [master] GO ALTER DATABASE [DB10GB] MODIFY FILE ( NAME = N'DB10GB' , SIZE = 20GB ) GO

Görsel 12: TDE özelliğinin aktif olduğu durumda growth işlemi için 9 saniye gerekti.

Görsel 13: TDE kullanılmayan durumda growth işlemi 26 ms içinde tamamlandı. IFI aktif olsa dahi istisnai durumlarda özelliğin kullanılmadığını görmüş olduk.
Peki bütün bu testler sonucunda IFI özelliğinin neden varsayılan olarak aktif olmadığını anlatmaya çalışalım. Güvenlik sebebiyle özelliğin aktif olması SQL Server tarafından bize bırakılmıştır. IFI özelliği kullanılırken disk alanı sıfırlanmaz demiştik böylece kullanılmayan veriler fiziksel olarak diskte kalabilir. Eğer bu disk sonradan başka bir kişi veya sistem tarafından kullanılırsa, bu verilere erişim sağlanabilir. Instant File Initialization aktif olması durumunda güvenlik önlemlerinin doğru bir şekilde uygulanması gerektiğini unutmayalım.
Bu yazımızda Instant File Initialization özelliğinin ne gibi farklılıklar oluşturabileceğini bazı testler üzerinden anlatmaya çalıştık. SQL Server kurulumunun best practice şeklinde tamamlanmasının ne kadar önemli olduğunu da kavramış olduk. Acil şekilde aksiyon alınması gereken durumlarda Instant File Initialization özelliği hayat kurtarıcı olabilir. Instant File Initialization özelliğinin, veritabanı dosyalarını boyutlandırırken veya oluştururken etkili olduğunu, ancak veritabanındaki verilerin silinmesi noktasında bir performans artışı sağlamayacağını da bilmeliyiz. Konuyla ilgili daha fazla bilgi için https://learn.microsoft.com/en-us/sql/relational-databases/databases/database-instant-file-initialization?view=sql-server-ver16 adresini ziyaret edebilirsiniz.
Serdar BAYRAK 18 Eylül 2023
Enes Hocam bu değerli yazı için teşekkürler. Yakın zamanda kurulum sonrası IFI açılmadığı için Restore işlemlerinde normal zamanda bitmesi gerek zamandan daha uzun zamanda bitmişti.
Secondary Makinenin Format İşlemi Sonrası Veri Tabanlarını Restore Etmeden AlwayOn'a Bağlama Adımları - VERITABANI.ORG 5 Ekim 2023
[…] SQL Server Engine kullanıcı eklenerek IFI için aktif edilir. konu hakkında detaylı bilgi için SQL SERVER – INSTANT FILE INITIALIZATION adlı makaleyi […]