DBCC CHECKTABLE Nedir
DBCC CHECKTABLE ile bir tablo ya da indexed view’in tutarlılık testi yapılır. DBCC CHECKDB komutunun yaptığı işlemleri büyük bir benzerlikle veritabanındaki bir tablo için gerçekleştiriyor. “DBCC CHECKDB Detayları” isimli makalemi okumak isteyebilirsiniz.
DBCC CHECKTABLE ‘ın birkaç farklı kullanım şekli vardır. Bunların hepsini teker teker inceleyelim.
Aşağıdaki komut ile Test veritabanındaki TestTable tablosundaki mantıksal ve fiziksel hatalar tespit edilir.
USE Test GO DBCC CHECKTABLE ('TestTable')
Aşağıdaki sorgu yardımıyla TestTable tablosundaki non clustered index ‘ler dışındaki hatalar tespit edilir.
USE Test GO DBCC CHECKTABLE (N'TestTable',NOINDEX)
Aşağıdaki komutu kullanarak tablodaki non clustereded index’lerdeki hataları veri kaybı olmadan düzeltecek şekilde DBCC CHECKTABLE komutunu çalıştırabilirsiniz.
REPAIR_REBUILD işlemi filestream veri içeren hataları düzeltmez.
USE Test GO ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DBCC CHECKTABLE (N'TestTable',REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS; GO ALTER DATABASE Test SET MULTI_USER;
Aşağıdaki komutu kullanarak tablodaki bütün hataları veri kaybı riski ile beraber düzeltecek şekilde DBCC CHECKTABLE komutunu çalıştırabilirsiniz.
USE Test GO ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DBCC CHECKTABLE (N'TestTable', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS; GO ALTER DATABASE [Test] SET MULTI_USER;
Script’in sonundaki 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.
Script’in sonundaki NO_INFOMSGS bilgilendirme mesajlarını gösterme anlamına gelir.
NOT1: Veritabanının suspect olduğu teyidini yaptıktan sonra kurtarmak için(REPAIR_REBUILD ya da REPAIR_ALLOW_DATA_LOSS komutları ile çalıştırmadan önce) girişime başlamadan önce yapmamız gereken ilk işin bu haliyle bir backup’ını almak olmalı!!!
NOT2: DBCC CHECKTABLE komutunu REPAIR_REBUILD ya da REPAIR_ALLOW_DATA_LOSS ile çalıştırdıktan sonra DBCC CHECKCONSTRAINTS komutunu çalıştırmanızı öneririm. Bu komutla ilgili bilgiyi “DBCC CHECKCONSTRAINTS Nedir” isimli makalemde bulabilirsiniz.
Default olarak DBCC CHECKTABLE komutu indexed view, XML index, ve spatial index ler için sadece fiziksel tutarlılık testi yapar. Aşağıdaki komutu kullanarak compatibility level’i 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. “Compatibility Level Nedir Ve Nasıl Değiştirilir” isimli makalemi okumak isteyebilirsiniz.
USE Test GO DBCC CHECKTABLE (N'TestTable') WITH EXTENDED_LOGICAL_CHECKS,NO_INFOMSGS, ALL_ERRORMSGS;
DBCC CHECKTABLE komutu internal database snapshot kullanır. Bu sayede bu komutu çalıştırdığınızda bloklama olmaz. “Database Snapshot Nedir ve Nasıl Alınır?” isimli makalemi okumak isteyebilirsiniz.
Aşağıdaki komutu kullanarak çalıştırırsanız internal database snapshot kullanmak yerine tablo üzerinde shared table lock koyar. “SQL Server Lock Çeşitleri” isimli makalemi okumak isteyebilirsiniz.
USE Test GO DBCC CHECKTABLE (N'TestTable') WITH TABLOCK,NO_INFOMSGS, ALL_ERRORMSGS;
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.
USE Test GO DBCC CHECKTABLE (N'TestTable') WITH ESTIMATEONLY,NO_INFOMSGS, ALL_ERRORMSGS;
Estimated TEMPDB space (in KB) needed for CHECKTABLE on database Test = 1.
Aşağıdaki komutu kullanarak çalıştırdığınızda tutarlılık kontrolü sadece fiziksel olarak yapılır. Mantıksal olarak yapılmaz.
Bana sorarsanız bu komutu kullanarak çalıştırmanın pek bir anlamı yok. Çünkü mantıksal tutarlılığını kontrol etmiyor. Tabi özel durumlarda kullanılmak üzere böyle bir seçeneği bize sunmuşlar.
PHYSICAL_ONLY komutu ile herhangi bir REPAIR(sorunu düzeltme) işlemi yapamazsınız.
USE Test GO DBCC CHECKTABLE (N'TestTable') WITH PHYSICAL_ONLY,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.
USE Test GO DBCC CHECKTABLE (N'TestTable') WITH DATA_PURITY,NO_INFOMSGS, ALL_ERRORMSGS;
DBCC CHECKTABLE’ın daha hızlı tamamlanması için DBCC CHECKTABLE komutunu çalıştırmadan önce server konfigurasyonlarından maxdop(max degree of paralellism)’u arttırabilirsiniz. Eğer sisteminiz oltp bir sistemse ve tamamen küçük transaction lardan oluşuyorsa maxdop’u arttırmak çalışan sistemin performansını yavaşlatabilir. Bu yüzden maxdop’u arttırdıktan sonra sistemi incelemeli ve herhangi bir performans probleminde değişikliği geri almalısınız. Maxdop değerini doğru ayarlamak için “sp_configure(SQL Server’da Server Seviyesinde Konfigurasyonlar)” isimli makalemden faydalanabilirsiniz.
Sadece bir index için DBCC CHECKTABLE komutunu çalıştırabilirsiniz. Aşağıdaki script’te TestTable tablosundaki PK_TestTable isimli clustered index üzerinde tutarlılık testi yapıyoruz.
USE Test GO 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);