DBCC CHECKDB Veritabanında meydana gelen hataları kontrol etmemizi sağlayan bir prosedürdür ve suspect modunda olduğu gibi herhangi bir veritabanı bozulma durumlarında kullanırız.

DBCC CHECKDB ile parametre olarak verilen database in bütünlük kontrolü yapmaktadır. Bu kontrolde her index’in içeriği validate edilir, metadata ve dosya sistemi arasındaki uyumluluk kontrolü yapılır.

DBCC CHECKDB komutu çalıştırıp sonucuna ve daha sonra alınan hataların çözümü için kullanılabilecek parametrelere gözatalım;

USE LOGODB

DBCC CHECKDB

GO

İlk satırlarda sorgunun çalıştırılacağı database belirtilerek ilgili database’ye ulaşılır daha sonra DBCC CHECKDB komutu ile database kontrol edili. Database de bulunan her table için bütünlük kontrollerinin sonuçları bulunmakta.

There are 20777 rows in 96 pages for object "LOGODB".
DBCC results for 'Production.ProductReview'.

Her table için içerdiği kayıt bilgisine bu kayıtların kaç page e dağıldığı bilgisine erişebilirsiniz.

Table da bulunan datalarda ya da indexlerde bulunan kayıtlarda herhangi bir problem var ise çıktıda bunu görüyor olacaksınız.

Table bütünlükleri tamamlandıktan sonra çıktının en altında şöyle bir mesaj görülecektir;

CHECKDB found 0 allocation errors and 0 consistency errors in database 'LOGODB'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Bu mesajdan veritabanımızda herhangi bir hata olmadığı bilgisine ulaşırsınız. Eğer veritabanınızda bütünlük hatası var ise en alttaki mesaj da toplamda kaç hata oluştuğunu görüyor olacaksınız.

CHECKDB found 3 allocation errors and 40 consistency errors in database 'LOGODB'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

DBCC CHECKDB komutu ve parametrelerine gözatalım;

Database Name – Database Id

CHECKDB komutu Database Name (Datanın İsmi) yada Database Id (Datanın Id’si) parametresi verilerek çalıştırılabilir. Eğer bu parametre verilmezse ya da 0 verilirse o anda aktif olan Database için bu komut çalışır.

LOGODB datasında çalıştırmak için (LOGODB = Database ismi)

DBCC CHECKDB('LOGODB')

GO

REPAIR_ALLOW_DATA_LOSS / REPAIR_FAST / REPAIR_REBUILD Komutları

Index datalarında ya da table datalarında kayıt problemi var ise DBCC CHECKDB komutu sonrasında gelen mesajda (3 allocation errors and 40 consistency) listelenmektedir. REPAIR_ALLOW_DATA_LOSS / REPAIR_FAST / REPAIR_REBUILD parametreleri ile bu bulunan hataların düzeltilmesi sağlanabilmektedir.

 

  • REPAIR_FAST : Geriye dönük veri onarım işlevini gerçekleştirir. Veri kaybı olmaz fakat hata alma olasılığı diğerlerine göre daha fazladır.
  • REPAIR_REBUILD : Bir önceki işlevden (REPAIR_FAST ) sonuç alınamadığı durumda kullanılabilir. Data kaybı olmadan hata düzeltmeye olanak sağlar. Bu hata düzeltmeye non-clustered index de ki eksik kayıdın eklenmesi ya da bir index in rebuild edilmesi örnek olarak verilebilir.
  • REPAIR_ALLOW_DATA_LOSS: Bütün raporlanan hataları düzeltmeye çalışır. Bu düzeltme işleminde data kaybı ihtimali vardır. Bu nedenle bu parametre çalıştırılmadan önce full backup alınması gerekmektedir.

Veritabanınınzda '..' allocation errors and '..' tane consistency errors in database 'LogoDb' hata bulunmuş ise ,bunu hataların düzeltilmesi için sırası ile;

1 Öncelikle veritabanının "single user mod" da alınmalıdır.

Database Single User Mode geçirmek için

(sp_dboption 'LOGODB', 'single user', 'true')

Ya da (ALTER DATABASE LOGODB SET SINGLE_USER)komutları kullanılabilir.

2 Bundan sonra aşağıdaki komut çalıştırılmalıdır.

DBCC CHECKDB ('LOGODB', REPAIR_FAST) ya da DBCC CHECKDB ('LOGODB', REPAIR_REBUILD)

Daha sonra sorunun düzelip düzelmediği DBCC CHECKDB komutu ile kontrol edilmeli ve düzelmemesi durumunda aşağıdaki komut çalıştırılmalıdır.

(Düzelmesi durumunda komutun sunduğu raporun en sonunda "0 allocation erros and 0 consistency errors" yazdığı görülmelidir.)

3 DBCC CHECKDB ('LOGODB', REPAIR_ALLOW_DATA_LOSS)

Bu işlem sonrasında veritabanı düzeldiyse, "single user" mod kaldırılmalıdır.

(sp_dboption 'LOGODB', 'single user', 'false')

ya da (ALTER DATABASE LOGODB SET MULTI USER)komutları kullanılabilir.

Datadaki alınan hatalar düzelmediyse bu işlemler bir kaç defa tekrarlanmalıdır. Bu işlemler sonrasında sonuç alınamaması durumunda data veritabanı uzmanlarına ulaştırılmalıdır.

Örnek kullanımı aşağıdaki gibidir;

ALTER DATABASE LOGODB SET SINGLE_USER

GO

DBCC CHECKDB('LOGODB', REPAIR_REBUILD)

GO

ALTER DATABASE LOGODB SET MULTI_USER

GO

NOT: Aşağıdaki komutlar ile hızlı bir şekilde sonuç alabilir ve database hakkında istatiki bilgilere ulaşabilirsiniz.

NOINDEX: Kontrol esnasında Non-Clustered index lerin kontrol edilmemesi için bu parametreyi kullanabilir. Bu parametre ile kontrol daha hızlı bir şekilde bitmektedir.

DBCC CHECKDB('LOGODB', NOINDEX)

GO

TABLOCK: CHECKDB internal bir database snapshot kullanılarak işletilir. TABLOCK parametresi ile snapshot kullanmak yerine database exclusive lock kullanılır. TABLOCK parametresi işlemin daha kısa sürmesini sağlarken, exclusive lock sebebiyle database e erişimi bir süreliğine durdurur.

DBCC CHECKDB('LOGODB') WITH TABLOCK

GO

ESTIMATEONLY: CHECKDB komutu için TempDB de kullanılacak alanın tahmini değerini görmek için kullanılabilir.

DBCC CHECKDB('LOGODB') WITH ESTIMATEONLY

GO

PHYSICAL_ONLY: CHECKDB nin limitli versiyonudur. Full versiyona göre daha kısa sürdüğü için production ortamlarında kullanılması tavsiye edilir. Tabi genede arada bir full scan yapmak gerekir.

DBCC CHECKDB('LOGODB') WITH PHYSICAL_ONLY

GO

DBCC CHECKALLOC: Database in dosya sistemi yapısı hakkında bütünlülük kontrolü yapar.

Örnek kullanımı aşağıdaki gibidir;

DBCC CHECKALLOC('LOGODB')

GO

Daha öncede söylediğim gibi CHECKALLOC CHECKDB nin yaptığı kontrollerin tamamını yapmaktadır. Fakat CHECKDB dosya sistemi yapısı açısından daha detaylı bilgi vermektedir. Örneğin aşağıdaki rapor sonucunda sysobjects tablosunun data ve index page lerinin yapılarını detaylı olarak kontrol edebilmekteyiz.

Table sysobjects Object ID 1.

Index ID 1 FirstIAM (1:11) Root (1:12) Dpages 22.

Index ID 1. 24 pages used in 5 dedicated extents.

Index ID 2 FirstIAM (1:1368) Root (1:1362) Dpages 10.

Index ID 2. 12 pages used in 2 dedicated extents.

Index ID 3 FirstIAM (1:1392) Root (1:1408) Dpages 4.

Index ID 3. 6 pages used in 0 dedicated extents.

Total number of extents is 7.

DBCC CHECKTABLE: Parametre olarak verilen table veya indexed view in tüm page ve yapısı hakkında bütünlülük kontrolü yapar.

Örnek Kullanımı aşağıdaki gibidir;

DBCC CHECKTABLE ('LOGODB');

GO

Örnek rapor sonucu ise aşağıdaki gibidir.

DBCC results for 'LOGODB'.

There are 4540 rows in 9 pages for object "LOGODB".

DBCC execution completed. If DBCC printed error messages, contact your system administrator.