DBCC CHECKTABLE

Bu makalede DBCC CHECKTABLE konusunu detaylı bir şekilde görmüş olacağız. DBCC CHECKTABLE, SQL Server’da bir tablonun veya tabloyla ilişkili bir dizinin (index) fiziksel ve mantıksal bütünlüğünü kontrol etmek için kullanılan bir komuttur. Bu komut, tabloların yapısında ve ilişkili dizinlerde meydana gelebilecek olası bozulmaları (corruption) tespit etmek için kullanılır. DBCC CHECKDB komutunun yaptığı işlemleri büyük bir benzerlikle veritabanındaki bir tablo için gerçekleştiriyor


DBCC CHECKTABLE, şu işlemleri gerçekleştirir:

1. Tablo ve Dizinlerin Tutarlılığını Kontrol Eder:
Tablo veya dizin yapılarında herhangi bir fiziksel veya mantıksal bozukluk olup olmadığını denetler. Örneğin, bir tablonun veri satırlarının fiziksel bütünlüğünü, dizin sayfalarının düzenini ve bağlantılarını kontrol eder.

2. Dizinlerin Doğruluğunu Doğrular:
Tablodaki clustered ve non-clustered dizinleri kontrol eder.
Dizin sayfalarının bağlantılarının (page links) doğru olup olmadığını ve her dizin sayfasının dizinin diğer bölümleriyle tutarlı olduğunu inceler.

3. Metadata (Sistem Verisi) Kontrolü:
Tablo ve dizinler hakkındaki meta verilerin doğru bir şekilde saklanıp saklanmadığını kontrol eder.

4. Sayfa ve Satır Yapısını Denetler:
Veri sayfalarındaki her satırın doğru bir biçimde oluşturulup oluşturulmadığını kontrol eder. Bir veri sayfasındaki satırların arasında çakışma olup olmadığını (örneğin, bir satırın başka bir satırla çakışması gibi) inceler.

Komut aşağıdaki gibi çalıştırılır:

DBCC CHECKTABLE ('TabloAdı');

Aşağıdaki sorgu yardımıyla TestTable tablosundaki non clustered index ‘ler dışındaki hatalar tespit edilir.

DBCC CHECKTABLE (N'TabloAdı',NOINDEX)

Yukarıdaki komutlar ilgili veritabanı altında çalışmaktadır.

Not: Eğer CHECKTABLE üzerinde herhangi bir seçenek belirtilmezse, SQL Server fiziksel ve mantıksal kontrolleri varsayılan olarak yapar.

Eğer tabloda ve ilişkili dizinlerde bir hata bulunmazsa şu mesaj görüntülenir:

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

Komut, hataların detaylarını belirterek ilgili tabloda/dizinde bir bozulma olduğunu bildirir.

Msg 8946, Level 16, State 1, Line 1
Table error: Object ID 123456789, index ID 1, partition ID 987654321, alloc unit ID 123456789123456789 (type In-row data).


Hangi Durumlarda Kullanılır?
1. Tablo Bozulması Şüphesi:
 Veri kaybı, sorgu hataları veya tabloda bozulma şüphesi olduğunda kullanılır.

2. Performans Sorunları:
 Dizinlerin yanlış yapılandırıldığı veya zarar gördüğü durumlarda performans düşüklüğü yaşanabilir. Bu gibi durumlarda kullanılabilir.

3. Veritabanı Yedeklemesi Sonrası:
Yedek alınan bir veritabanı başka bir sunucuya taşındıktan sonra, tabloların düzgün çalıştığından emin olmak için.

4. DBCC CHECKDB ile Birlikte:
 DBCC CHECKDB, tüm veritabanını kontrol ederken, DBCC CHECKTABLE sadece belirli bir tablo üzerinde işlem yapar. Belirli bir tabloyla ilgili sorunları izole etmek için kullanılır.

Performans Üzerine Etkisi
Büyük tablolar üzerinde çalıştırıldığında, disk I/O ve CPU üzerinde ciddi bir yük oluşturabilir.
Canlı sistemlerde çalıştırılırken dikkatli olunmalıdır. DBCC CHECKTABLE çalışırken tablo üzerinde şema düzeyinde bir kilitleme uygulayabilir.

DBCC CHECKTABLE sadece sorunları tespit eder, ancak bu sorunları düzeltmez. Eğer bir hata bulunursa:
Düzeltme işlemine başlamadan önce veritabanının tam bir yedeği alınmalıdır.
2. Düzeltme İçin Komut Kullanımı:
DBCC CHECKDB ile birlikte REPAIR_ALLOW_DATA_LOSS veya REPAIR_REBUILD seçenekleri kullanılabilir.

ALTER DATABASE VeritabanıAdı SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKTABLE (N'TabloAdı',REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
ALTER DATABASE VeritabanıAdı SET MULTI_USER;

Veri kaybını göze alınırsa aşağıdaki komut kullanılır.

ALTER DATABASE VeritabanıAdı SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKTABLE (N'TabloAdı',REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
ALTER DATABASE VeritabanıAdı SET MULTI_USER;

İndexslerde  sorun varsa, dizinleri yeniden oluşturabilirsiniz:

ALTER INDEX ALL ON TabloAdı REBUILD;

Not: DBCC CHECKTABLE komutunu REPAIR_REBUILD ya da REPAIR_ALLOW_DATA_LOSS ile çalıştırdıktan sonra DBCC CHECKCONSTRAINTS komutunu çalıştırmanız önerilir.

Default olarak DBCC CHECKTABLE komutu indexed view, XML index, ve spatial index ler için sadece fiziksel tutarlılık testi yapar. SQL Server 2008 ve üstü olan veritabanlarındaki tablolardaki indexed view, XML index, ve spatial index ler için mantıksal tutarlılık kontrolü de yapılır.

DBCC CHECKTABLE (N'TabloAdı') WITH EXTENDED_LOGICAL_CHECKS,NO_INFOMSGS, ALL_ERRORMSGS;

Not: DBCC CHECKTABLE komutu internal database snapshot kullanır. Bu sayede bu komutu çalıştırdığınızda bloklama olmaz.

Aşağıdaki komutu kullanarak çalıştırırsanız internal database snapshot kullanmak yerine tablo üzerinde shared table lock koyar.

DBCC CHECKTABLE (N'TabloAdı') WITH TABLOCK,NO_INFOMSGS, ALL_ERRORMSGS;

Aşağıdaki komut ile tempdb’de ne kadar alan gerektiğini hesaplamaktadır.

DBCC CHECKTABLE (N'TabloAdı') WITH ESTIMATEONLY,NO_INFOMSGS, ALL_ERRORMSGS;

Dikkat ederseniz dbcc checkdb komutuyla aynı özellikleri kullanabiliriz. Sadece check ifadesi değişmektedir.

Not: Maxdop değeri komut çalıştırmadan önce attırta bilirsiniz. Oltp sistemlerde sıkıntıya sebebiyet verebilir dikkatli olunması gerekmektedir.

Aşağıdaki komut ile sadece bir index için tutarlılık testi yapılmaktadır.

DECLARE @IndexId int;   

SET @IndexId = (SELECT index_id    

              FROM sys.indexes   

              WHERE object_id = OBJECT_ID('TestTable')   

                    AND name = 'PK_TestTable');   

DBCC CHECKTABLE ('TestTable',@IndexId);


DBCC CHECKTABLE, belirli bir tablonun ve ilişkili dizinlerin fiziksel ve mantıksal bütünlüğünü kontrol eden güçlü bir komuttur. Veritabanı tutarlılığını sağlamak ve potansiyel hataları erken tespit etmek için düzenli olarak kullanılması önerilir. Ancak tespit edilen sorunları düzeltmek için dikkatli bir analiz yapılmalı ve düzeltme işlemleri öncesinde mutlaka bir yedek alınmalıdır.

Bu makalede DBCC CHECKTABLE komutunu detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“Allah’tan kulları içinde ancak ilim sahibi olanlar korkar.” Fâtır sûresi – 28

Author: Yunus YÜCEL

Bir yanıt yazın

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