CHECKPOINT veya COMMIT diske yazıyor mu?


12

Tam kurtarma modu veritabanlarıyla SQLServer2008R2 ve üstü için diyelim.

Her zaman düşünürüm :

  1. Bir işlem gerçekleştirildiğinde (COMMIT), işlem RAM'deki işlem günlüğüne yazılır.

  2. Bir CHECKPOINT oluştuğunda (bir süre ve / veya bazı işlemlerden ve diğer kriterlerden sonra), son CHECKPOINT ile akım arasındaki işlemler diske yazılır.

  3. YEDEKLEME GÜNLÜĞÜ oluştuğunda, veriler MDF dosyasına yazılır.

Doğrumuyum? Bazı meslektaşlarım yanıldığımı söylüyor ve BOL ile bile doğru cevabı bulmak zor.

Teşekkürler!


Yanıtlar:


20

Maalesef, COMMIT'in nasıl çalıştığıyla ilgili şu ana kadar cevaplarda bir takım hatalar var, bu yüzden başka bir tane ekleyeceğim. Nasıl Çalışır: Ayrıntılar ve SQL Server 2000 I / O Temelleri için Bob Dorr'un SQL Server I / O Sunumu'na bakın . Nasıl çalışır:

  • Tamamen günlüğe kaydedilen tüm veri yazma işlemleri (değişiklikler) tam olarak aşağıdaki sırayla gerçekleşir ( SQL Server'ın Sorguyu Nasıl Çalıştığını Anlama: Veri Yazma konusuna bakın ):

    • Veri sayfası yalnızca
    • Değişikliği açıklayan bir günlük kaydı, belleğe günlüğe eklenir. Yeni günlük kaydı yeni bir LSN oluşturur, bkz. LSN nedir: Günlük Dizisi Numarası .
    • Veri sayfası değiştirilir (sayfadaki hem veri kaydı hem de last_update_lsn). Bu artık değiştirildi ('kirli') sayfası.
    • Veri sayfası mandalı serbest bırakıldı
    • güncelleme sonucu doğrudan diske hiçbir şey yazılmaz
  • Bir KOMİT aşağıdakileri yapar

    • belleğe COMMIT'i tanımlayan yeni bir günlük kaydı ekler
    • yukarıda oluşturulmuş olana kadar diske temizlenmemiş tüm günlük kayıtları temizlenir (diske yazılır)
    • İş parçacığı blokları, işletim sistemi yukarıdaki yazıyı kalıcı olarak bildirene kadar bekler (ES tamamlanır)
    • COMMIT deyimi (veya örtülü kesinliğe sahip DML deyimi) tamamlandı
  • Bir CHECKPOINT aşağıdakileri yapar (basitleştirilmiş), bkz. Kontrol noktaları nasıl çalışır ve nelerin günlüğe kaydedildiği :

    • Bellekteki tüm kirli sayfalar diske yazılıyor
      • Her kirli sayfa için, diske yazmaya başlamadan önce, o sayfadaki last_update_lsn olan LSN'ye (bu diske yazılır) kadar olan kayıt temizlenir (diske yazılır). Herhangi bir LSN'nin sifonunun önceki tüm LSN'lerin de temizlendiğini ima ettiğine dikkat edin, bu nedenle en kirli sayfalarda kendi son_updatının zaten temizlendiğinden bu işlem yapılmaz.
    • Denetim noktasını tanımlayan günlük kaydı günlüğe yazılır ve temizlenir
    • veritabanı önyükleme sayfası yukarıda oluşturulan kaydın LSN'si ile güncellenir

Yazmalar en az günlüğe kaydedilen işlemler için farklı çalışır, bkz . En Az Günlüğe Kaydedilebilecek İşlemler . Kabaca asgari düzeyde günlüğe kaydedilen işlemler şu şekilde hareket eder (basitleştirilmiş):

  • Bir sayfaya minimal olarak kaydedilmiş bir işlemin parçası olarak satırlar eklemeden önce, sayfanın minimal olarak kaydedilmiş işlemlere katıldığını açıklayan bir günlük kaydı oluşturuluyor ve günlüğe (bellekte) ekleniyor
  • En az günlüğe kaydedilen sayfa güncellenmektedir, çünkü üzerine birçok ek yazılmaktadır. Hiçbir şey günlüğe kaydedilmez, diske nothign yazılmaz.
  • En az günlüğe kaydedilmiş bir işlem gerçekleştirildiğinde, işlemden önce, söz konusu işlemde en az günlüğe kaydedilmiş işlemlere katılan tüm sayfaların diske yazılması gerekir. Bu yazma işlemi tamamlandıktan sonra Onyl, COMMIT günlük kaydı günlüğe (bellekte) eklenebilir ve bu yeni eklenen kaydedilmiş günlük kaydına kadar ve bu günlük de dahil olmak üzere günlük diske temizlenir (yazılır).

8

Bir işlem gerçekleştirildiğinde (COMMIT), işlem RAM'deki işlem günlüğüne yazılır.

Sorgu tarafından istendiği gibi sayfayı veya verileri değiştirmeden önce işlem günlüğüne bir işlem yazılır. Buna ileri yazma günlüğü (WAL) denir. Bellek WAL'de bir sayfa güncellenirken SQL Server çökerse, DB motorunun işlem günlüğünü okuyabilmesini ve işlemi geri alabilmesini sağlar. Bu, RDBMS'nin ACID özelliğidir.

Bir CHECKPOINT oluştuğunda (bir süre ve / veya bazı işlemlerden ve diğer kriterlerden sonra), son CHECKPOINT ile akım arasındaki işlemler diske yazılır.

Denetim noktası kirli sayfaları arabellekten diske temizler. Tempdb için biraz farklı davranır . Kirli sayfa diskten okunduğundan bu yana değişen bir sayfadır. Bu denetim noktası işlemi, işlem günlüğünde, işlemlerin gerçekleştirildiği noktaya kadar bir işaret oluşturur. Başarısızlıktan sonra, kurtarma o işarete kadar olan tüm işlemlerin yapıldığını bilir. Denetim noktasını bir TSQL komutuyla elle verebilirsiniz.

YEDEKLEME GÜNLÜĞÜ oluştuğunda, veriler MDF dosyasına yazılır.

Hayır, yedekleme günlüğü gerçekleştiğinde SQL Server, işlem günlüğü bilgilerini veritabanı günlüğü dosyasından yedeklemeyi yazdığınız diske kopyalar. Bir yedekleme işlemi diskteki verileri okur ve verileri diske yazar.

Aşağıdaki linkleri okumanı istiyorum

SQL Server'da Günlüğe Kaydetme ve Kurtarmayı Anlama Mark tarafından işaret edildi

SQL Server 2008 Dahili ve sorun giderme Kitabı

İşlem Günlüğü Mimarisi ve Yönetimi


Tamam, net görünüyor. Sadece emin olmak için: bir KOMİT meydana geldiğinde, işlem günlüğüne yazıldığını söylersiniz; tampon veya disk (LDF) mi demek istediniz?
Patator

Her zaman ilk olarak önbelleği günlüğe yazacak ve daha sonra diskteki işlem günlüğüne akıtılacaktır. İşlem günlüğü yönetimi bağlantısını ekledim, lütfen
WAL'ın

"Bellek WAL'da bir sayfa güncellenirken SQL Server çökerse, DB motorunun işlem günlüğünü okuyabilmesini ve işlemi geri alabilmesini sağlar." Bu, yalnızca işlem yapılmadığında geçerlidir. Zaten taahhüt edilmişse hiçbir şey geri alınamaz. İşlem günlüğündeki bilgiler veri dosyalarını güncellemek için kullanılır. Arabellek çökmeden önce veri dosyasına yazılmamış olsa bile.
miracle173

@Miracle: Tabii ki belirli bir işlemle ilgili sayfanın güncellenip güncellenmediğini tahmin ediyorum.
Shanky

4

Aşağıda sizin için bir şeyler açıklayacağız:

Bir işlem gerçekleştirildiğinde (COMMIT), işlem RAM'deki işlem günlüğüne yazılır.

  • COMMIT (veya BEGIN) öğesinin kurtarma modeliyle ilgisi yoktur. İşlem seviyesinde. Bir işlemin tamamen tamamlanması veya başarısız olması gerekir ( ACID özelliklerini hatırlayın ). Bu nedenle, esasen, bir KOMİT başarılı bir işlemin sonunu (örtük veya açık) işaretler. Bir COMMIT deyimi, işlemin tüm değişikliklerinin veritabanının kalıcı bir parçası haline getirileceğini garanti eder.
  • Herhangi bir değişiklik yapmak için SQL Server , verileri değiştirmeden önce günlükte yapmak üzere olduğu herhangi bir değişikliği tanımlayacağı WAL (İleri Yazma Günlüğü) kullanır .

Bir CHECKPOINT oluştuğunda (bir süre ve / veya bazı işlemlerden ve diğer kriterlerden sonra), son CHECKPOINT ile akım arasındaki işlemler diske yazılır.

YEDEKLEME GÜNLÜĞÜ oluştuğunda, veriler MDF dosyasına yazılır.

Bakınız:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.