DBCC CheckDB ne tür yolsuzlukları kaçırabilir?


16

Bu soru bu daha önceki yazı tarafından soruldu ve benim gelecekteki soruşturma için bir veritabanı sahip aşağıdaki geri yüklendi:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.

Bağlantılı soru ve DBCC PAGE soruşturmaları için hazır yedeklemede, DBCC CHECKDB hatasız geçti ama yolsuzluk açıkça var.

CHECKDB'nin geçeceği, ancak CHECKSUM İLE YEDEKLEME başarısız olacak ne tür yolsuzluklar oluşabilir?


1
Belki, DBCC IND: komutu tablo veya dizin tarafından kullanılan sayfaların listesini sağlar? Sorunun olduğu tabloya, dizine bakabilirsiniz.
garik

1
Sorun ortaya çıktığında hata atan sayfaların hızlı bir analizini yaptım. 30 dakikalık çalışma, neyin yanlış olduğunu çözmek için 30 dakikadan fazla zamana ihtiyacım olduğu sonucuna vardı :) Daha ayrıntılı bir şekilde incelemeye geri döndüğümde, bu durumdan ayrıntılarla ayrı bir soru göndereceğim.
Mark Storey-Smith

Yanıtlar:


10

Aşağıdakiler, okuduğum sonuçların bir derlemesidir. Bağlantılı bloglarda ve belgelerde çok daha fazla bilgi bulacaksınız.

İlk olarak, DBCC CHECKDBsağlama toplamı veya torn_page doğrulamasını kapatırsanız tutarsızlıkları algılamaz. Bu yazıda Paul Randal'dan bir alıntı :

Haklısınız - yırtık sayfa veya sağlama toplamı açık değilse, sayfa koruma seçenekleriyle ilgili olarak algılanabilecek hiçbir şey yoktur. CHECKDB, yaptığı tüm tutarlılık kontrollerini yapmaktan bulduğu bozulmaları hala alabilir - ancak veri değerlerinin ortasında bozulmalar görmez.

Ha - bu sayfa sağlama toplamlarını açmanın en kötü yanı - bir sayfa okunana, değiştirilip tekrar yazılana kadar hiçbir şey olmuyor. Sayfaları sağlama toplamları almaya zorlamanın tek yolu, onları değiştirmektir - örneğin, tüm dizinlerinizi yeniden oluşturarak, hoş olmayan olabilir - orada hiçbir 'dokunma' aracı yoktur.

Bir veritabanını SQL Server 2000'den veya daha önce 2005 veya sonraki bir sürüme yükselttiyseniz, yukarıdaki durum size ulaşabilir. Daha sonra, aktif hale getirmek için sayfa kontrol toplamlarını ALTER DATABASE ile manuel olarak etkinleştirmeniz gerekir. Ama sonra yukarıdaki alıntıdaki 2. paragraf devreye girer ve sizi rahatsız edebilir.

BACKUP WITH CHECKSUMsağlama toplamı tutarsızlıklarını algılar, ancak yalnızca sayfanın kendisine yedeklenmiş bir sağlama toplamı yazmışsa. Normalde DBCC CHECKDBbu hataları da algılar, bu nedenle DBCC CHECKDB'in yerini almak için CHECKSUM İLE YEDEKLEME kullanmak iyi bir fikir değildir .

Şimdi DBCC CHECKDB, bazı tutarsızlıklar olsa bile, herhangi bir tutarsızlık göstermemek için ikinci bir olasılık var. Bunun için Paul Randal'ı yolsuzluklarla ilgili yanılgılarda tekrar söylüyorum : kaybolabilirler mi? :

Peki kaybolan yolsuzluklar ne olacak? Bu, tutarlılık kontrollerinin nasıl çalıştığına girer. Tutarlılık denetimleri yalnızca veritabanındaki ayrılan sayfalarda çalışır. Bir sayfa hiçbir şeye tahsis edilmemişse, 8192 bayt anlamsızdır ve yorumlanamaz. Ayrılmış ve tahsis edilenler arasında kafanız karışmasın - bunu ilk yanlış anlamalarda burada açıklıyorum. Bir sayfa tahsis edildiği sürece, sayfa kontrol toplamının test edilmesi de dahil olmak üzere DBCC CHECKDB tarafından tutarlılık kontrol edilecektir. Bir DBCC CHECKDB çalıştığı sırada bozuk bir sayfa tahsis edilirse, ancak bir sonraki DBCC CHECKDB çalıştığı zaman yeniden konumlandırılırsa, bir yolsuzluk 'yok gibi görünebilir. İlk kez bozuk olarak bildirilecek, ancak ikinci kez ayrılmadığı için tutarlılık kontrol edilmedi ve bozuk olarak bildirilmeyecek. Yolsuzluk gizemli bir şekilde yok gibi görünüyor. Ancak olmadı - sadece bozuk sayfa artık ayrılmıyor. SQL Server'ın bozuk bir sayfayı dağıtmasını durduran hiçbir şey yoktur - aslında, DBCC CHECKDB onarımlarının çoğunun yaptığı şey - kırık olanları dağıtmak ve tüm bağlantıları düzeltmek.

Sorunuza son bir cevabım yok, ancak DBCC CHECKDByalnızca tahsis edilen sayfaları kontrol ettiği için, tahsis edilen sayfalarda tutarsızlıklar gösterilmeyecek. Şimdi hayal edebileceğim tek durum, YEDEKLEME'nin atlanan potansiyel sağlama toplamı hatalarını gösteren bu ayrılmış sayfaları yedeklemesidir DBCC CHECKDB.


Paul'un makalelerinin çoğunu zaten yer imlerine ekleyin, ancak özet için + 1'leyin. Bunların hiçbiri, başkalarının başka düşünceler ekleyebilmesini umarak kenara koyduğum veritabanına uygulanmaz.
Mark Storey-Smith
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.