Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
SQL Server işlem taahhütleri, tamamen dayanıklı (SQL Server varsayılanı) veya gecikmeli dayanıklı (lazy commit olarak da bilinir) olabilir.
Tam dayanıklı işlem işlemeleri zaman uyumlu olur ve bir işlemeyi başarılı olarak bildirir ve yalnızca işlemin günlük kayıtları diske yazıldıktan sonra denetimi istemciye döndürür. Gecikmeli dayanıklı işlem işlemeleri zaman uyumsuz olup işlemin günlük kayıtları diske yazılmadan önce bir işlemeyi başarılı olarak bildirir. Bir işlemin dayanıklı olması için işlem günlüğü girdilerinin diske yazılması gerekir. İşlem günlüğü girişleri diske boşaltıldığında gecikmiş dayanıklı işlemler dayanıklı hale gelir.
Bu makalede ertelenen dayanıklı işlemler ayrıntılı olarak ele alınmaktadır.
Tam ve Gecikmeli İşlem Dayanıklılığı
Hem tam hem de gecikmeli işlem dayanıklılığının avantajları ve dezavantajları vardır. Bir uygulama, tam ve gecikmeli kalıcı işlemlerin bir karışımına sahip olabilir. İş gereksinimlerinizi ve her birinin bu gereksinimlere nasıl uyduğunu dikkatle dikkate almanız gerekir.
Tam işlem dayanıklılığı
Tam dayanıklı işlemler, denetimi istemciye döndürmeden önce işlem günlüğünü diske yazar. Aşağıdaki durumlarda her zaman tamamen dayanıklı işlemler kullanmalısınız:
Sisteminiz herhangi bir veri kaybına izin veremez. Verilerinizin bir kısmını ne zaman kaybedebileceğiniz hakkında bilgi için Verileri ne zaman kaybedebilirim bölümüne bakın.
Performans sorunu, işlem günlüğü yazma gecikme süresinden kaynaklanmaz.
Gecikmeli işlem dayanıklılığı, işlem günlüğü kayıtlarını bellekte tutarak ve işlem günlüğüne toplu olarak yazarak günlük G/Ç'sine bağlı gecikme süresini azaltır ve böylece daha az G/Ç işlemi gerektirir. Gecikmeli işlem dayanıklılığı potansiyel olarak günlük G/Ç çekişmesini azaltarak sistemdeki beklemeleri azaltır.
Tam İşlem Dayanıklılığı Garantileri
İşlem başarılı bir şekilde tamamlandıktan sonra, işlem sırasında yapılan değişiklikler sistemdeki diğer işlemler tarafından görülebilir. İşlem yalıtım düzeyleri hakkında daha fazla bilgi için bkz. SET TRANSACTION ISOLATION LEVEL (Transact-SQL) veya transactions with Memory-Optimized Tables.
Dayanıklılık, onay sırasında garanti edilir. İşlem işlemesi başarılı olmadan ve denetimi istemciye döndürmeden önce ilgili günlük kayıtları diskte kalıcı hale getirilir.
Gecikmeli işlem dayanıklılığı
Gecikmeli işlem dayanıklılığı, diske zaman uyumsuz günlük yazma işlemleri kullanılarak gerçekleştirilir. İşlem günlüğü kayıtları bir arabellekte tutulur ve arabellek dolduğunda veya arabellek boşaltma olayı gerçekleştiğinde diske yazılır. Gecikmeli işlem dayanıklılığı, sistem içindeki gecikme süresini ve çekişmesini azaltır çünkü:
İşlem işleme işlemi günlük GÇ'nin bitmesini beklemez ve denetimi istemciye döndürür.
Eşzamanlı işlemlerin günlük GÇ için çakışma olasılığı daha düşüktür; bunun yerine, günlük tamponu diske daha büyük öbekler halinde boşaltılarak çekişme azaltılabilir ve aktarım hızı artırılabilir.
Not
Günlük arabelleğini boşaltmaktan daha hızlı doldurduğunuzda özellikle yüksek düzeyde eşzamanlılık varsa günlük I/O çekişmesi yaşanmaya devam edebilir.
Gecikmeli işlem dayanıklılığı ne zaman kullanılır?
Gecikmeli işlem dayanıklılığından yararlanabileceğiniz durumlardan bazıları şunlardır:
Bazı veri kayıplarını tolere edebilirsiniz.
Eğer verilerin çoğuna sahip olduğunuz sürece tek tek kayıtlar kritik değilse ve bazı veri kayıplarını tolere edebiliyorsanız, gecikmeli dayanıklılığı değerlendirmeye almak faydalı olabilir. Herhangi bir veri kaybına tolerans gösteremiyorsanız gecikmeli işlem dayanıklılığı kullanmayın.
İşlem günlüğü yazma işlemlerinde bir performans sorunu yaşıyorsunuz.
Performans sorunlarınız işlem günlüğü yazmalarındaki gecikme süresinden kaynaklanıyorsa, uygulamanız gecikmeli işlem dayanıklılığının kullanılmasından büyük olasılıkla yararlanacaktır.
İş yüklerinizin çekişme oranı yüksektir.
Sisteminizde yüksek çekişme düzeyine sahip iş yükleri varsa kilitlerin serbest bırakılması beklenirse çok fazla zaman kaybedilir. Gecikmeli işlem dayanıklılığı işleme süresini kısaltır ve böylece kilitleri daha hızlı serbest bırakır ve bu da daha yüksek aktarım hızına neden olur.
Gecikmeli İşlem Dayanıklılığı Garantileri
İşlem başarılı bir şekilde tamamlandıktan sonra, işlem sırasında yapılan değişiklikler sistemdeki diğer işlemler tarafından görülebilir.
İşlem dayanıklılığı, yalnızca bellek içi işlem günlüğünün diske boşaltıldığı zaman garanti edilir. Bellek içi işlem günlüğü şu durumlarda diske boşaltılır:
Aynı veritabanındaki tamamen kalıcı bir işlem, veritabanında bir değişiklik yapar ve başarıyla tamamlar.
Kullanıcı, sistem saklı yordamını başarıyla
sp_flush_logyürütür.Tamamen dayanıklı bir işlem veya sp_flush_log başarıyla işleniyorsa, daha önce kaydedilmiş tüm gecikmeli dayanıklılık işlemlerinin dayanıklı hale getirildiği garanti edilir.
SQL Server, tüm işlemler gecikmeli dayanıklı olsa bile hem günlük oluşturma hem de zamanlama temelinde günlüğü diske boşaltmaya çalışır. Başarılı olma durumu genellikle, IO cihazı ayak uyduruyorsa sağlanır. Ancak SQL Server, dayanıklı işlemler ve sp_flush_log dışında herhangi bir sabit dayanıklılık garantisi sağlamaz.
İşlem dayanıklılığını denetleme
Veritabanı düzeyi denetimi
DBA olarak, aşağıdaki deyimle kullanıcıların veritabanında gecikmeli işlem dayanıklılığı kullanıp kullanamayacağını denetleyebilirsiniz. ALTER DATABASE ile gecikmeli dayanıklılık ayarını ayarlamanız gerekir.
ALTER DATABASE ... SET DELAYED_DURABILITY = { DISABLED | ALLOWED | FORCED }
DEVRE DIŞI
[varsayılan] Bu ayarla, veritabanında işleyen tüm işlemler, işleme düzeyi ayarından bağımsız olarak tamamen dayanıklıdır (DELAYED_DURABILITY=[AÇIK | KAPALI]). Saklı yordam değişikliğine ve yeniden derlemeye gerek yoktur. Bu, gecikmeli dayanıklılık nedeniyle hiçbir verinin risk altında kalmadığından emin olmanıza olanak tanır.
İZİN VERİLDİ
Bu ayarla, her işlemin dayanıklılığı işlem düzeyinde belirlenir - DELAYED_DURABILITY = { KAPALI | AÇIK }. Daha fazla bilgi için Atomik blok seviyesi kontrolü - Yerel Olarak Derlenmiş Saklı Yordamlar ve COMMIT seviyesi kontrolü bölümüne bakın.
ZORLA
Bu ayarla, veritabanında tamamlanan her işlem gecikmeli olarak dayanıklıdır. İşlem, tamamen dayanıklı (DELAYED_DURABILITY = KAPALI) olarak belirtilmiş olsun ya da bir belirtim yapılmamış olsun, işlem gecikmeli dayanıklı olarak değerlendirilir. Gecikmeli işlem dayanıklılığı bir veritabanı için yararlı olduğunda ve herhangi bir uygulama kodunu değiştirmek istemediğinizde bu ayar kullanışlıdır.
Atomik blok düzeyi denetimi - Doğal Olarak Derlenmiş Saklı Yordamlar
Aşağıdaki kod atomik bloğun içine girer.
DELAYED_DURABILITY = { OFF | ON }
KAPALI
[varsayılan] İşlem tamamen dayanıklıdır, ancak veritabanı seçeneği DELAYED_DURABILITY = FORCED etkin duruma geldiğinde, işlemin gerçekleştirilmesi zaman uyumsuz hale gelir ve bu nedenle gecikmeli dayanıklılık gösterir. Daha fazla bilgi için bkz. Veritabanı düzeyi denetimi.
AÇIK
veritabanı seçeneği DELAYED_DURABILITY = DISABLED etkin olmadığı sürece işlem geciktirilir ve bu durumda işleme zaman uyumlu ve dolayısıyla tamamen dayanıklı olur. Daha fazla bilgi için bkz. Veritabanı düzeyi denetimi.
Örnek Kod:
CREATE PROCEDURE [<procedureName>] /* parameters go here */
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(
DELAYED_DURABILITY = ON,
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
/* procedure body goes here */
END
Tablo 1: Atomik Bloklarda Dayanıklılık
| Atomik blok dayanıklılığı seçeneği | Mevcut işlem yok | İşlem devam ediyor (tamamen veya gecikmeli kalıcı) |
|---|---|---|
| DELAYED_DURABILITY = KAPALI | Atomik blok, tamamen dayanıklı yeni bir işlem başlatır. | Atomik blok, mevcut işlemde bir kaydetme noktası oluşturur ve yeni işlemi başlatır. |
| GECİKMELİ DAYANIKLILIK = AÇIK | Atomik blok yeni bir gecikmeli dayanıklı işlem başlatır. | Atomik blok, mevcut işlemde bir kaydetme noktası oluşturur ve yeni işlemi başlatır. |
COMMIT düzeyi denetimi -Transact-SQL
COMMIT sentaksı, ertelenmiş işlem dayanıklılığını zorlayabilmeniz için genişletilir. Eğer veritabanı düzeyinde DELAYED_DURABILITY DEVRE DIŞI bırakıldıysa veya ZORLANMIŞ ise (yukarıya bakın), bu COMMIT seçeneği göz ardı edilir.
COMMIT [ { TRAN | TRANSACTION } ] [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
KAPALI
[varsayılan] veritabanı seçeneği DELAYED_DURABILITY = FORCED etkin olmadığı sürece işlem COMMIT'i tamamen dayanıklıdır; bu durumda COMMIT zaman uyumsuzdur ve bu nedenle gecikmeli dayanıklıdır. Daha fazla bilgi için bkz. Veritabanı düzeyi denetimi.
AÇIK
veritabanı seçeneği DELAYED_DURABILITY = DISABLED etkin olmadığı sürece işlem COMMIT'i dayanıklı olarak geciktirilir; bu durumda COMMIT zaman uyumlu ve dolayısıyla tamamen dayanıklı olur. Daha fazla bilgi için bkz. Veritabanı düzeyi denetimi.
Seçeneklerin ve etkileşimlerinin özeti
Bu tabloda, veritabanı düzeyi gecikmeli dayanıklılık ayarları ile işleme düzeyi ayarları arasındaki etkileşimler özetlemektedir. Veritabanı düzeyi ayarları her zaman işleme düzeyi ayarlarından önceliklidir.
| COMMIT ayarı/Veritabanı yapılandırması | DELAYED_DURABILITY = DEVRE DIŞI | DELAYED_DURABILITY = İzİn VERİlDİ | DELAYED_DURABILITY = ZORUNLU |
|---|---|---|---|
| DELAYED_DURABILITY = OFF Veritabanı düzeyi işlemleri. | İşlem tamamen dayanıklıdır. | İşlem tamamen dayanıklıdır. | İşlem gecikmeli dayanıklıdır. |
| DELAYED_DURABILITY = ON Veritabanı düzeyi işlemleri. | İşlem tamamen dayanıklıdır. | İşlem gecikmeli dayanıklıdır. | İşlem gecikmeli dayanıklıdır. |
| DELAYED_DURABILITY = OFF Çapraz veritabanlı veya dağıtılmış işlem. | İşlem tamamen dayanıklıdır. | İşlem tamamen dayanıklıdır. | İşlem tamamen dayanıklıdır. |
| DELAYED_DURABILITY = ON Çapraz veritabanı veya dağıtılmış işlem. | İşlem tamamen dayanıklıdır. | İşlem tamamen dayanıklıdır. | İşlem tamamen dayanıklıdır. |
İşlem günlüğü temizlemeyi zorlama
İşlem günlüğünü diske zorla yazdırmak için iki yöntem vardır.
Aynı veritabanını değiştiren tüm tamamen dayanıklı işlemleri yürütür. Bu, önceki tüm kaydedilmiş gecikmeli dayanıklılık işlemlerinin günlük kayıtlarını diske boşaltmaya zorlar.
Sistem saklı yordamı
sp_flush_log'ı yürütün. Bu yordam, önceki tüm kaydedilmiş gecikmeli dayanıklı işlemlerin günlük kayıtlarını diske boşaltmaya zorlar. Daha fazla bilgi için bkz. sys.sp_flush_log (Transact-SQL).
Gecikmeli dayanıklılık ve diğer SQL Server özellikleri
İşlemsel Çoğaltma, Değişiklik İzleme ve Değişiklik Verisi Yakalama
İşlem Çoğaltması veya Değişiklik Veri Yakalaması (CDC) için etkinleştirilen veritabanları için gecikmeli dayanıklılık kullanımı desteklenmez.
Gecikmeli Dayanıklılık ile Değişiklik İzleme desteklenir. Değişiklik İzleme ile yapılan tüm işlemler tamamen dayanıklıdır. Değişiklik izlemeyi etkinleştirmiş tablolara herhangi bir yazma işlemi yaparsa, işlem değişiklik izleme özelliğine sahiptir.
SQL Server 2022 CU 2 ve SQL Server 2019 CU 20'den başlayarak şunları görebilirsiniz:
Gecikmeli dayanıklılığı etkinleştirmiş bir veritabanında İşlem Çoğaltma veya Veri Yakalamayı Değiştir'i etkinleştirmeye çalışırsanız
Error 22891: Could not enable '_FeatureName_' for database '_DatabaseName_'. '_FeatureName_' cannot be enabled on a DB with delayed durability set.Gecikmeli dayanıklılığı, İşlem Çoğaltma veya Değişiklik Verilerini Yakalama ile yapılandırılmış bir veritabanında etkinleştirmeye çalışırsanız
Error 22892: Could not enable delayed durability on DB. Delayed durability cannot be enabled on a DB while '_FeatureName_' is enabled.
Çökme kurtarma
Tutarlılık garanti edilir, ancak taahhüt edilmiş gecikmeli dayanıklı işlemlerden kaynaklanan bazı değişiklikler kaybolabilir.
Veritabanları arası ve DTC
bir işlem veritabanları arası veya dağıtılmışsa, herhangi bir veritabanı veya işlem işleme ayarından bağımsız olarak tamamen dayanıklıdır.
AlwaysOn Kullanılabilirlik Grupları ve Yansıtma
Ertelenmiş dayanıklı işlemler, ne birincil sunucuda ne de ikincil sunucularda herhangi bir dayanıklılık garantisi vermez. Ayrıca, ikincil işlem hakkında herhangi bir bilgi garantisi vermezler. İşlem tamamlandıktan sonra, herhangi bir senkron ikincil sunucudan bildirim alınmadan önce, denetim istemciye geri döndürülür. İkincil çoğaltmalara çoğaltma, birincil çoğaltmadaki diske boşaltma işlemi gerçekleştiğinde gerçekleşmeye devam eder.
yük devretme kümelemesi
Bazı gecikmeli dayanıklı işlem yazma işlemleri kaybolabilir.
SQL için Azure Synapse Link'i
Gecikmeli dayanıklı işlemler SQL için Azure Synapse Link ile desteklenmez.
Kayıt gönderme
Yalnızca kalıcı hale getirilmiş işlemler, gönderilen günlüğe dahil edilir.
İşlem Günlüğü Yedekleme
Yalnızca dayanıklı hale getirilmiş işlemler yedeklemeye dahil edilir.
Verileri ne zaman kaybedebilirim?
Tablolarınızdan herhangi birinde gecikmeli dayanıklılık uygularsanız, belirli koşulların veri kaybına yol açabileceğini anlamanız gerekir. Herhangi bir veri kaybına tolerans gösteremiyorsanız tablolarınızda gecikmeli dayanıklılık kullanmamalısınız.
Yıkıcı olaylar
Sunucu kilitlenmesi gibi yıkıcı bir olay söz konusu olduğunda, diske kaydedilmemiş tüm kaydedilmiş işlemlerin verilerini kaybedersiniz. Gecikmiş dayanıklı işlemler, veritabanındaki herhangi bir tabloda (dayanıklı belleğe göre optimize edilmiş veya disk tabanlı) tam dayanıklı bir işlem yürütüldüğünde veya sp_flush_log çağrıldığında disk üzerine kaydedilir. Gecikmeli dayanıklı işlemler kullanıyorsanız, bekleyen tüm işlemleri kaydetmek için veritabanında düzenli aralıklarla güncelleştirebileceğiniz veya sp_flush_log çağırabileceğiniz küçük bir tablo oluşturmak isteyebilirsiniz. İşlem günlüğü de dolmak üzere olduğunda boşaltılır, ancak bunu tahmin etmek zordur ve kontrol etmek imkansızdır.
SQL Server kapatma ve yeniden başlatma
Gecikmeli dayanıklılık için beklenmeyen kapatma ile SQL Server'ın beklenen kapatma/yeniden başlatma arasında bir fark yoktur. Yıkıcı olaylar gibi veri kaybını da planlamanız gerekir. Planlı kapatma/yeniden başlatmada, diske yazılmayan bazı işlemler kapatmadan önce diske kaydedilebilir, ancak bunu planlamamalısınız. Planlı veya plansız bir kapatma veya yeniden başlatmanın, verileri yıkıcı bir olayda olduğu gibi kaybedeceğini varsayarak plan yapın.
Sonraki adımlar
- Memory-Optimized Tablo İşlemleri