DBCC CHECKDB

DBCC CHECKDB komutu, Microsoft SQL Server’da veritabanlarının bütünlüğünü kontrol etmek ve hataları belirlemek için kullanılan güçlü bir sistem sorgu komutudur. Bu komut, bir veritabanındaki mantıksal ve fiziksel bütünlük sorunlarını tespit eder. Ayrıca, bazı durumlarda bu hataların düzeltilmesine de yardımcı olabilir. Veritabanımız Suspect moda düşmüşse çok işimize yarayan bir komut olarak karşımıza çıkmaktadır.
Tüm veritabanını tarayarak her nesne için fiziksel ve mantıksal bütünlük kontrollerini yapar.

Mantıksal hatalar, veritabanının iç yapısındaki tutarsızlıklardan kaynaklanır. Fiziksel olarak sayfalar sağlamdır, ancak veri ilişkileri bozulmuştur.  Mantıksal olan hatalara örnek vermek gerekirse Index ve tablo verileri arasında uyumsuzluk, Foreign key ihlalleri, Bozuk B-tree yapıları (index fragmentation), Geçersiz pointer’lar (orphaned rows, missing pages)
Bir tablodaki satır, başka bir tablodaki foreign key ile eşleşmiyor. Clustered index ile nonclustered index arasında tutarsızlık var. DBCC CHECKDB MSG 8909 (consistency errors) hatası verir.

Fiziksel hatalar, depolama katmanında (disk, SSD, vs.) meydana gelen bozulmalardır. Örneğin: Disk sektör bozulmaları (bad sectors), Sayfa (page) bozulmaları (checksum hataları, torn page sorunları), Dosya sistemindeki bozulmalar, Donanım arızaları (RAM, disk kontrolcüsü sorunları) gibi yapılar kontrol edilmektedir.

Örnek Senaryolar: SQL Server bir sayfayı okumaya çalıştığında CHECKSUM hatası alırsan (824 hatası). DBCC CHECKDB, DBCC CHECKTABLE gibi komutlar MSG 824 (I/O hatası) döndürür. DBCC PAGE komutuyla sayfa içeriği bozuk görünür.

SQL Server Error Log’da genelde 823, 824 veya 832 hataları görülür.
DBCC CHECKDB WITH PHYSICAL_ONLY → Sadece fiziksel bozulmaları kontrol eder.

KomutAçıklamaHata Türü
DBCC CHECKDBTüm veritabanını kontrol eder (fiziksel + mantıksal)Her ikisi
DBCC CHECKTABLEBelirli bir tabloyu kontrol ederHer ikisi
DBCC CHECKFILEGROUPDosya grubunu kontrol ederHer ikisi
DBCC CHECKALLOCSayfa ayırmalarını kontrol ederÇoğunlukla fiziksel
DBCC CHECKCATALOGSistem metadata tutarlılığını kontrol ederMantıksal
DBCC CHECKCONSTRAINTSConstraint’leri kontrol ederMantıksal

DBCC CHECKDB’nin Söz Dizimi

DBCC CHECKDB(N'Veritabanı_Adı') WITH ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY,PHYSICAL_ONLY, DATA_PURITY, NOINDEX)

Yukarıda bulunan veritabanı adının yanında diğer parametlerden herhangi birisi kullanılabilir. Tamamen ihtiyacınıza göre değişmektedir. Sadece veritabanı adı yazılarakta sorgu çalıştırılabilir.

 Parametreler:
Veritabanı_Adı: Kontrol edilecek veritabanının adını belirtir. Eğer belirtilmezse, komut bağlanılan veritabanında çalışır.

ALL_ERRORMSGS: Bulunan tüm hata mesajlarını ayrıntılı olarak gösterir.
NO_INFOMSGS: Bilgilendirme mesajlarını bastırır; yalnızca hata mesajlarını görüntüler.
TABLOCK: Veritabanı nesneleri üzerinde kilitleme kullanır. Performansı artırabilir ancak diğer işlemleri engelleyebilir.
ESTIMATEONLY: Kontrol işleminin ne kadar kaynak kullanacağını ve ne kadar süreceğini tahmini olarak bildirir.
PHYSICAL_ONLY: Yalnızca fiziksel seviyede (örneğin, sayfa yapıları ve fiziksel bütünlük) kontroller yapar. Bu, daha hızlı bir inceleme sağlar.
DATA_PURITY: Verilerin geçerliliğini ve düzgünlüğünü kontrol eder. Özellikle SQL Server 2005’ten önce oluşturulmuş veritabanlarında yararlıdır.

 Aşağıdaki örneklerde yukarıdaki parametrelerin kullanımını görebiliriz.

 Aşağıdaki komut ile Veritabanının bütünlük kontrolü yapılabilir.

DBCC CHECKDB ('VeritabaniAdi');

Aşağıdaki komut ile veritabanında non clustered index ‘ler dışındaki hatalar tespit edilir.

DBCC CHECKDB (N'VeritabaniAdi',NOINDEX) 

Aşağıdaki komut ile tüm hata mesajlarını ayrıntılı olarak gösterir.

DBCC CHECKDB ('VeritabaniAdi') WITH ALL_ERRORMSGS;

Aşağıdaki komut ile fiziksel seviyede kontroller yapar.

DBCC CHECKDB ('VeritabaniAdi') WITH PHYSICAL_ONLY;

Kontrol işleminin ne kadar kaynak kullanacağını ve ne kadar süreceğini tahmini olarak bildirir.

DBCC CHECKDB ('VeritabaniAdi') WITH ESTIMATEONLY;

 DBCC CHECKDB’nin Çalışma Süreci

Veritabanındaki sistem tabloları ve metadata doğruluğu kontrol edilir. Her tablo ve bu tabloların indeksleri incelenir. Veritabanının dosya yapısındaki veri allokasyonu ve fiziksel sayfa bütünlüğü doğrulanır. Verilerin belirlenen türlere uygunluğu(Data_Purity) kontrol edilir.

Eğer hata tespit edilirse, SQL Server genellikle bir onarım seçeneği önerir. Onarım işlemleri için REPAIR seçenekleri kullanılabilir. Ancak bu işlemler veritabanını çevrimdışı duruma getirebilir ve veri kaybına neden olabilir.

ALTER DATABASE VeritabaniAdi SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB (N'VeritabaniAdi',REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS,ESTIMATEONLY;
GO
ALTER DATABASE VeritabaniAdi SET MULTI_USER;

Not: ALL_ERRORMSGS yazmasak bile default olarak bu şekilde kabul eder. Her nesne için alınan bütün hataları göster anlamına gelir.

REPAIR_REBUILD: Daha basit hataları onarır (örneğin, indeks sorunları).
REPAIR_ALLOW_DATA_LOSS: Veri kaybı riski olan daha ciddi sorunları düzeltir. Kullanımı dikkatli yapılmalıdır.

ALTER DATABASE VeritabaniAdi SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB (N'VeritabaniAdi',REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS,ESTIMATEONLY;
GO
ALTER DATABASE VeritabaniAdi SET MULTI_USER;

Not: REPAIR_REBUILD işlemi filestream veri içeren hataları düzeltmez.
Not: Veritabanımız suspect moda düştükten sonra yukarıdaki komutları çalıştırmadan önce bu haliyle bir backup alınması gerekmektedir.
Not: Büyük veritabanlarında DBCC CHECKDB çalıştırmak yoğun kaynak kullanımı gerektirebilir. Bu nedenle, genellikle bakım saatlerinde çalıştırılması önerilir. Alwayson yapılarında secondary sunucusunda çalıştırılması gerekmektedir.
Not: Veritabanını yedeklemeden önce DBCC CHECKDB çalıştırmak, olası hataları tespit etmek açısından faydalıdır.
Not: DBCC CHECKDB, SQL Server bakım planlarının bir parçası olarak düzenli aralıklarla çalıştırılmalıdır.
Not: DBCC CHECKDB komutu disable edilmiş index’leri incelemez.

Not: Default olarak DBCC CHECKDB komutu indexed view, XML index, ve spatial index ler için sadece fiziksel tutarlılık testi yapar.
Not: DBCC CHECKDB komutu internal database snapshot kullanır. Bu sayede bu komutu çalıştırdığınızda bloklama olmaz.

DBCC CHECKDB komutu çalıştırıldığında SQL Server varsayılan olarak bir internal database snapshot oluşturur.

DBCC CHECKDB’nin oluşturduğu snapshot’ın boyutu veritabanının tam boyutuyla değil, işlem sırasında değişen veri miktarıyla ilişkilidir.

  • Nasıl çalışır?:
    • CHECKDB çalıştığında, veritabanının tutarlı bir görünümüne ihtiyaç duyar
    • SQL Server otomatik olarak geçici bir snapshot oluşturur
    • Tüm kontrol işlemleri bu snapshot üzerinde yapılır
    • İşlem tamamlandığında snapshot otomatik silinir
  • Neden kullanılır?:
    • CHECKDB’nin uzun sürmesi durumunda kullanıcı işlemlerini engellememek için
    • Veritabanının tutarlı bir anlık görüntüsü üzerinde çalışmak için

Aşağıdaki komutu kullanarak çalıştırırsanız internal database snapshot kullanmak yerine veritabanı üzerinde exclusive lock koyar. Internal database snapshot devre dışı bırakılır.

DBCC CHECKDB (N'Veritabanı_Adı') WITH TABLOCK;

TABLOCK parametresi snapshot oluşturulmasını engeller ancak veritabanına shared lock koyar

Aşağıdaki komutu kullanırsanız herhangi bir tutarlılık testi yapılmaz. Sadece tutarlılık testi yapılabilmesi için tempdb’de ne kadar alan gerektiği hesaplanır ve aşağıdaki gibi bir çıktı üretir.

DBCC CHECKDB (N'AdventureWorks2014') WITH ESTIMATEONLY,NO_INFOMSGS, ALL_ERRORMSGS;

Aşağıdaki komutu kullanarak çalıştırdığınızda veritabanındaki tablolara ait kolonların değerlerinin kolon’un veri tipi ile uyumlu olup olmadığı kontrol edilir. Eğer veritabanınız SQL Server 2005 ve üzeri ise kolon değerleri otomatik olarak kontrol edilir ve DATA_PURITY seçeneğine gerek yoktur.

DBCC CHECKDB (N'AdventureWorks2014') WITH DATA_PURITY, ALL_ERRORMSGS;

Not: NO_INFOMSGS bu ifade hata mesajı yoksa bir şey dönmez.

Başka makalede görüşmek dileğiyle..

“Yürüyüşünde ölçülü ol, sesini yükseltme; çünkü seslerin en çirkini eşeğin ­anırmasıdır.”Lokman-19

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir