Hard disk with data file blocks allocated at once next to a database and a stopwatch, representing SQL Server Instant File Initialization

SQL Server Instant File Initialization (IFI): Nedir, Nasıl Açılır, Nasıl Doğrulanır?

Instant File Initialization’ın SQL Server’da veri dosyası oluşturma, büyütme ve restore sürelerini nasıl kısalttığı, neyi kapsamadığı, güvenlik ödünleşimi ve GPO tuzağına düşmeden nasıl açılıp doğrulanacağı.

Eylül 15, 2021

SQL Server yeni bir veri dosyası oluşturduğunda ya da mevcut bir dosyayı büyüttüğünde, varsayılan olarak ayırdığı alanın tamamını önce sıfırlarla doldurur. Birkaç megabaytlık bir büyümede bu fark edilmez. Ancak yüzlerce gigabaytlık bir restore’da, gece yarısı tetiklenen büyük bir autogrowth’ta ya da kesinti sırasında yeniden oluşturulan bir veritabanında, sunucu dakikalarca yalnızca diske sıfır yazar ve bu sürede iş beklemede kalır.

Instant File Initialization (IFI, anında dosya başlatma) bu sıfırlama adımını veri dosyaları için ortadan kaldıran Windows özelliğidir. Bu rehberde IFI’ın tam olarak neyi hızlandırdığını, neyi hızlandırmadığını, güvenlik tarafındaki ödünleşimi, nasıl açılacağını ve gerçekten çalıştığının nasıl doğrulanacağını anlatıyoruz.

SQL Server Performans Danışmanlığı

Restore ve dosya büyümeleri neden bu kadar uzun sürüyor?

Aryasoft; Instant File Initialization, autogrowth, disk yerleşimi ve servis hesabı haklarını birlikte inceler, restore sürelerinizi ve RTO hedefinizi ölçülebilir şekilde kısaltır.

Destek Alın

Instant File Initialization Nedir?

Windows, bir dosyaya yeni alan ayırırken o alanda daha önce silinmiş verilerin kalıntıları bulunabilir. SQL Server bu kalıntıların okunmasını önlemek için, varsayılan olarak yeni ayrılan alanı sıfırlarla doldurur. Bu işleme zeroing denir ve süresi doğrudan dosya boyutuna ve diskin yazma hızına bağlıdır.

SQL Server servis hesabı Windows’taki Perform volume maintenance tasks hakkına (SE_MANAGE_VOLUME_NAME ayrıcalığına) sahip olduğunda, SQL Server veri dosyaları için bu adımı atlar. Alan anında ayrılır, eski disk içeriğinin üzerine ancak yeni veri yazıldıkça yazılır.

Basit bir hesap farkı gösterir: saniyede 500 MB yazabilen bir depolamada 100 GB’lık bir veri dosyasını sıfırlamak yaklaşık 200 saniye, 1 TB’lık bir dosyayı sıfırlamak ise yarım saatten fazla sürer. IFI açıkken bu süre birkaç saniyeye iner.

IFI Hangi İşlemleri Hızlandırır?

Sıfırlama, veri dosyaları için şu işlemlerde devreye girer ve IFI hepsinde fark yaratır:

  • Veritabanı oluşturma: Büyük bir başlangıç boyutuyla oluşturulan veritabanları anında hazır olur.
  • Mevcut veritabanına dosya ekleme: Yeni bir veri dosyası ya da filegroup eklemek beklemeye yol açmaz.
  • Dosya büyütme: Hem elle yapılan büyütmeler hem de autogrowth olayları. Autogrowth’u tetikleyen oturum, büyüme bitene kadar bekler; IFI olmadan büyük bir büyüme adımı, uygulama tarafında ani zaman aşımları olarak görünür.
  • Restore: SQL Server veriyi kopyalamaya başlamadan önce hedef dosyaları oluşturur. IFI olmadan büyük bir veritabanının restore’u, tek bir sayfa veri okunmadan önce uzun bir sıfırlama aşamasıyla başlar. Bu, felaket anında RTO’nuzu doğrudan uzatır.
  • TempDB: TempDB her servis başlangıcında yeniden oluşturulur. Büyük ön boyutlandırılmış TempDB veri dosyaları IFI ile çok daha hızlı hazır olur.

IFI’ın Hızlandırmadıkları

  • Transaction log dosyaları: Log dosyaları SQL Server’ın log yapısı gereği sıfırlanmak zorundadır. Log dosyası oluşturma, büyütme ve restore sırasında log dosyasının oluşturulması IFI’dan yararlanmaz.
  • TDE ile şifrelenmiş veritabanları: Transparent Data Encryption açık olan bir veritabanında veri dosyaları da IFI’dan yararlanamaz.
  • Yavaş sorgular: IFI günlük sorgu performansını değiştirmez; yalnızca dosya ayırma anındaki bekleme süresini ortadan kaldırır.

Not

SQL Server 2022 ve sonrasında, 64 MB’a kadar olan transaction log büyümeleri de anında başlatmadan yararlanabilir. Yeni veritabanlarında log autogrowth varsayılanı da 64 MB’tır. Daha büyük log büyümeleri hâlâ sıfırlanır; bu yüzden log dosyasını baştan doğru boyutlandırmak ve büyüme adımını bilinçli seçmek önemini korur. Ayrıntılar için autogrowth rehberimize bakabilirsiniz.

Güvenlik Ödünleşimi

IFI açıkken yeni ayrılan alan sıfırlanmadığı için, diskte daha önce silinmiş içerik, o bölgeye yeni veri yazılana kadar veri dosyasının içinde fiziksel olarak durmaya devam eder. Teoride, veri dosyasına doğrudan erişebilen biri bu kalıntıları okuyabilir.

Pratikte risk şu koşullarla sınırlanır:

  • Veri dosyalarının bulunduğu klasörlere yalnızca SQL Server servis hesabı ve yöneticiler erişebilmelidir.
  • Detach edilmiş veri dosyaları ve yedek dosyaları da kısıtlayıcı izinlerle saklanmalıdır.
  • Sunucu, fiziksel ve mantıksal olarak güvenli bir ortamda olmalıdır.

Bu koşullar sağlandığında performans kazancı riske ağır basar ve IFI üretim sunucuları için önerilen standart ayardır. Yüksek güvenlik gereksinimi olan ve silinmiş içeriğin ifşasının kabul edilemez olduğu ortamlarda IFI kapalı bırakılabilir ya da TDE kullanılabilir. Dosya ve klasör izinlerinin genel çerçevesi için SQL Server güvenlik sıkılaştırma rehberimize göz atabilirsiniz.

IFI Açık mı? Nasıl Kontrol Edilir?

Güncel sürümlerde (SQL Server 2016 SP1 ve sonrası) en kolay yol, servis bilgisini döndüren DMV’dir:

SELECT servicename,
       service_account,
       instant_file_initialization_enabled   -- Y = açık, N = kapalı
FROM sys.dm_server_services
WHERE servicename LIKE N'SQL Server (%';

SQL Server aynı bilgiyi her başlangıçta error log’a da yazar:

EXEC sys.xp_readerrorlog 0, 1, N'Database Instant File Initialization';

Sonuçta “Database Instant File Initialization: enabled” ya da “disabled” satırını görürsünüz.

Instant File Initialization Nasıl Açılır?

Kurulum sırasında

SQL Server 2016 ve sonrasında kurulum sihirbazının Server Configuration adımında Grant Perform Volume Maintenance Task privilege to SQL Server Database Engine Service seçeneği bulunur. Yeni kurulumlarda bu kutuyu işaretlemek en temiz yoldur. Komut satırından kurulumda aynı işi /SQLSVCINSTANTFILEINIT="True" parametresi yapar.

Mevcut bir sunucuda

1. Servis hesabını bulun. Yukarıdaki DMV sorgusunun service_account sütunu ya da SQL Server Configuration Manager’daki SQL Server Services ekranının Log On As sütunu, Database Engine servisinin hangi hesapla çalıştığını gösterir. Sanal hesapla kurulmuş varsayılan bir instance için bu NT Service\MSSQLSERVER, adlandırılmış bir instance için NT Service\MSSQL$InstanceAdı olur.

SQL Server Configuration Manager'da SQL Server Services ekranı ve Log On As sütunundaki servis hesabı

2. Hakkı verin.

  1. secpol.msc (Local Security Policy) ya da gpedit.msc konsolunu yönetici olarak açın.
  2. Computer Configuration › Windows Settings › Security Settings › Local Policies › User Rights Assignment yoluna gidin.
  3. Perform volume maintenance tasks ilkesini açın ve Add User or Group ile 1. adımdaki servis hesabını ekleyin. Sanal hesap için konumun yerel bilgisayar olduğundan emin olun.

Local Group Policy Editor'da Perform volume maintenance tasks hakkına SQL Server servis hesabının eklenmesi

3. SQL Server servisini yeniden başlatın. Ayrıcalık servis başladığında okunur. Yeniden başlatmayı bakım penceresine planlayın; Always On Availability Group ya da failover cluster ortamında hakkı her düğümde verin ve düğümleri sırayla yeniden başlatın.

Uyarı

Perform volume maintenance tasks hakkı bir domain Group Policy’sinde tanımlıysa, bir sonraki ilke yenilemesinde domain ilkesi yerel ayarın üzerine yazar ve yaptığınız değişiklik sessizce kaybolur. Domain ortamlarında gpresult /h rapor.html ile bu hakkı bir GPO’nun yönetip yönetmediğini kontrol edin ve servis hesabını o GPO’ya ekletin. Sunucu başka bir OU’ya taşındığında ya da migration ile yenisi kurulduğunda da aynı kontrolü yapın.

Hakkı komut satırından kontrol etmek

# Yerel güvenlik ilkesini dışa aktarıp ayrıcalığı arayın
secedit /export /cfg "$env:TEMP\secpol.cfg" /areas USER_RIGHTS | Out-Null
Select-String -Path "$env:TEMP\secpol.cfg" -Pattern 'SeManageVolumePrivilege'

Çıktıda hesaplar SID olarak listelenir (sanal servis hesapları için *S-1-5-80-... biçiminde). Servis hesabını doğrudan değil de yerel Administrators grubu üzerinden yetkilendirmek de IFI’ı açar, ancak servis hesabını yönetici yapmak en az yetki ilkesine aykırıdır; hakkı doğrudan servis hesabına verin.

Gerçekten Çalıştığını Test Etmek

DMV “Y” dese bile, sıfırlamanın gerçekten atlandığını görmek isterseniz trace flag 3004 ve 3605 ile dosya sıfırlama mesajlarını error log’a yazdırabilirsiniz. Bu testi üretimde değil, test ya da bakım ortamında yapın:

DBCC TRACEON (3004, 3605, -1);   -- sıfırlama işlemlerini error log'a yaz

CREATE DATABASE IFI_Test
ON (NAME = IFI_Test_data, FILENAME = N'D:\SQLData\IFI_Test.mdf', SIZE = 1GB)
LOG ON (NAME = IFI_Test_log, FILENAME = N'L:\SQLLog\IFI_Test.ldf', SIZE = 64MB);

EXEC sys.xp_readerrorlog 0, 1, N'Zeroing';

DBCC TRACEOFF (3004, 3605, -1);
DROP DATABASE IFI_Test;

IFI açıksa error log’da yalnızca .ldf dosyası için “Zeroing …” satırı görürsünüz. .mdf için de bir satır görüyorsanız IFI çalışmıyordur: servis hesabını, yeniden başlatmayı ve GPO’yu kontrol edin. Dosya yollarını kendi ortamınıza göre değiştirmeyi unutmayın.

Sanal Makineler ve Bulut

IFI, sanal makinelerde de fiziksel sunuculardaki gibi çalışır ve aynı kazancı sağlar; depolamanın paylaşımlı ve görece yavaş olduğu ortamlarda kazanç daha da belirgindir. Microsoft’un Azure sanal makinelerinde SQL Server için yayımladığı en iyi uygulamalar kontrol listesi de veri dosyaları için IFI’ın açılmasını önerir. Azure SQL Database ve Azure SQL Managed Instance’ta bu ayar platform tarafından yönetilir.

Instant File Initialization Kontrol Listesi

  • sys.dm_server_services içinde instant_file_initialization_enabled = 'Y'.
  • Hak, servis hesabına doğrudan verilmiş; servis hesabı yerel yönetici değil.
  • Domain ortamında hak, sunucunun OU’sunu yöneten GPO’da tanımlı.
  • Always On ve cluster ortamlarında her düğüm kontrol edilmiş.
  • Veri, log ve yedek klasörlerinin izinleri kısıtlı.
  • Log dosyaları baştan doğru boyutlandırılmış, log büyüme adımı bilinçli seçilmiş.
  • Yeni sunucu kurulum kontrol listesinde IFI seçeneği yer alıyor.
SQL Server’ın veri dosyalarını oluştururken ya da büyütürken ayrılan alanı sıfırlarla doldurma adımını atlamasını sağlayan Windows özelliğidir. Servis hesabına Perform volume maintenance tasks hakkı verildiğinde etkinleşir.
Genel olarak hayır; transaction log dosyaları her zaman sıfırlanır. SQL Server 2022 ve sonrasında 64 MB’a kadar olan log büyümeleri bu kuraldan muaftır.
Evet. Ayrıcalık servis başlangıcında okunduğu için SQL Server servisinin yeniden başlatılması gerekir.
SELECT servicename, instant_file_initialization_enabled FROM sys.dm_server_services sorgusunu çalıştırın. Y açık, N kapalı demektir. Error log’daki “Database Instant File Initialization” satırı da aynı bilgiyi verir.
Hayır. Transparent Data Encryption açık olan veritabanlarında veri dosyaları da IFI’dan yararlanamaz ve sıfırlanır.

SQL Server Performans Danışmanlığı

Restore ve büyüme sürelerini kısaltın

Aryasoft’un kıdemli DBA ekibi; Instant File Initialization, Lock Pages in Memory, autogrowth ve disk yerleşimini her düğümde doğru ilkeyle yapılandırır, sonucu yeniden başlatma sonrasında doğrular.

4.7/5