Delayed Durability Nedir
Delayed Durability SQL Server 2014 ile gelen bir özelliktir. Gelişmiş ilişkisel veritabanlarının ortak özelliği olan Durability’yi esneten bir özelliktir. “SQL Server ACID Kuralları” isimli makaleyi okumak isteyebilirsiniz.
SQL Server Default olarak şu şekilde çalışır:
Veri ldf dosyasına yazılmadan(log flush) data dosyalarına yazılma işlemi(page flushing) gerçekleşmez. Bu mekanizma SQL Server WAL(Write Ahead Log) olarak karşımıza çıkar. “Database Checkpoint Nedir” isimli makalede detayları bulabilirsiniz.
Bu doğrultuda veri ldf dosyasına yazılmadan kullanıcıya işleminiz tamamlandı bilgisi de iletilmez. Böylelikle herhangi bir crash anında, sql server veriyi log dosyasından recover edebilir. Bu şekilde verinizin kaybolmayacağı garanti altına alınmış olur.
Delayed Durability ile veritabanı seviyesinde, commit işlemi seviyesinde ve atomic block seviyesinde bu işlemi esnetebiliyoruz. Yani log dosyasına yazılmadan kullanıcıya işleminin tamamlandığı bilgisi iletiliyor.
NOT : Eğer veritabanı, transaction ya da atomic block seviyesinde transaction’larınızı aşağıdaki şekillerde delayed durable hale getirirseniz performansınız artmasıyla beraber veri kaybı riskiniz ortaya çıkar. Örneğin bir crash anında veriler log dosyasına yazılmadan kullanıcıyla succesful bilgisi iletildi diyelim. Veritabanı açılırken log dosyasından recovery olurken bu bilgi log dosyasında olmadığı için kullanıcıya succesful bilgisi iletilmesine rağmen aslında veritabanında ilgili kayıt olmayacaktır. Bu kısmı anlamadıysanız sizi yine “Database Checkpoint Nedir” isimli makaleye yönlendireceğim.
Aşağıdaki script yardımıyla veritabanı seviyesinde delayed durability seçeneklerini set edebiliyoruz.
ALTER DATABASE VeritabaniAdiniz SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
Gördüğünüz gibi DISABLED, ALLOWED ve FORCED seçenekleri mevcut.
DISABLED, default davranış şeklidir. Yani Delayed Durability’yi veritabanı seviyesinde set ettiyseniz aşağıdaki script yardımıyla tekrar default davranış şekline döndürebilirsiniz.
ALTER DATABASE VeritabaniAdiniz SET DELAYED_DURABILITY=DISABLED
ALLOWED, durability’nin belirtilen veritabanı içersindeki transaction’larda belirlenmesine izin verildiği anlamına gelir.
Transaction seviyesinde aşağıdaki gibi transaction’ı delayed durable hale getirebilirsiniz.
BEGIN TRANSACTION SELECT 1; COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON)
In Memory OLTP’deki Natively Compiled Stored Procedure’lerde atomic block seviyesinde aşağıdaki gibi delayed durable hale getirebilirsiniz. Natively Compiled Stored Procedure hakkında detaylı bilgi almak için “Natively Compiled Stored Procedure Nedir ve Nasıl Kullanılır?” isimli makaleyi okumanızı öneririm.
USE [Test] GO CREATE PROCEDURE NativelyCompiledSPOrnek WITH NATIVE_COMPILATION, EXECUTE AS OWNER, SCHEMABINDING AS BEGIN ATOMIC WITH ( DELAYED_DURABILITY = ON, TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English' … ) END --EXEC NativelyCompiledSPOrnek
FORCED, veritabanı içersindeki tüm transaction’ların delayed durable şekline çalışmasına zorlanmış demektir.
ALTER DATABASE VeritabaniAdiniz SET DELAYED_DURABILITY=FORCED