SQL Server 2005 ve sonraki sürümlerinde 2570 DBCC hata giderme

Şunlar için geçerlidir: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

GİRİŞ


Bu makalede, SQL Server hata 2570, hatanın nedeni nedir ve nasıl sorun giderileceği anlatılmaktadır.

Daha fazla bilgi


DATA_PURITY denetimleri

SQL Server 2005'te, DBCC CHECKDB ve DBCC CHECKTABLE komutlarını DATA_PURITY, yeni bir seçenek eklendi. Bu seçeneğin etkinleştirilmiş bir DBCC CHECKDB veya DBCC CHECKTABLE komutunu çalıştırdığınızda, komut tüm satırlar Tablo veya veritabanındaki tabloların her sütunun değeri "veri olmak üzere" doğrulamaları gerçekleştirir. Sütunda depolanan değerleri geçerli olduğundan emin olmak için bu yeni denetimler gerçekleştirilir (yani, değerler dışarı etki alanı için aralık değil ilişkili sütunun veri türü ile). Sütunun veri türü doğrulaması doğasına bağlıdır. Aşağıdaki liste kapsamlı olmayan birkaç örnekler verilmektedir:
Sütun veri türüVeri doğrulaması türü
Unicode karakteriVeri uzunluğu 2 katı olması gerekir.
Tarih/saatGün alanı 1 1753 Oca-Ara 31 arasında olmalıdır 9999. Saat alanı '11:59:59:999 PM' önce olmalıdır.
Gerçek ve kayan noktalı sayıGeçersiz kayan nokta değerleri SNAN, QNAN, NINF, ND, PD, PINF gibi varlığını denetle.
Tüm veri türleri için sütun veri geçerliliğini kontrol edilir. Yalnızca işaretli yere aralık dışında saklanan bir değeri olma olasılığı vardır. Örneğin, tinyint veri türü geçerli bir aralık 0 ile 255 arasında olan ve (Bu, yalnızca değerler 0-255 arasında saklayabilirsiniz) tek bir bayt olarak depolanır, böylece denetimi değeri gerekli değildir.

Doğrulama denetimleri veri olmak üzere tüm veritabanları için otomatik olarak etkin değildir. Denetimleri, çeşitli etkenlere bağlı olarak etkinleştirilir:
  • SQL Server 2005 ve sonraki sürümlerinde oluşturulmuş veritabanları için bu denetimleri varsayılan olarak etkinleştirilir ve böylece bir DBCC CHECKDB veya DBCC CHECKTABLE komutunu yürütürken DATA_PURITY seçeneğin kullanılması, ilgisiz, devre dışı bırakılamaz.
  • SQL Server 2000, SQL Server 7.0 ve SQL Server 2005'e yükseltilmiş sürümleri gibi SQL Server'ın önceki sürümlerinde oluşturulmuş veritabanları için bu denetimleri varsayılan olarak etkin değildir. Sırayla gerçekleştirilecek bu denetimler için DBCC CHECKDB veya DBCC CHECKTABLE komutunu DATA_PURITY seçeneğini belirtmeniz gerekir. Bu iki şey neden olabilir:
    • DBCC komutu tamamlandıktan ve veritabanının tüm veri olmak üzere denetimleri de dahil olmak üzere temiz olduğunu bildirir. Bu olgu veritabanı başlığında kaydedilir. Tüm izleyen DBCC CHECKDB veya DBCC CHECKTABLE komutunu yürütmeleri bu bilgileri görürsünüz ve SQL Server 2005'te oluşturulan veritabanları için olacağını gibi veri saflıktan denetimleri otomatik olarak gerçekleştirir. Diğer bir deyişle, bir veritabanı "temiz" olduğu bilinen bir kez, her zaman veri olmak üzere denetimleri gerçekleştirilmez.
    • DBCC komutu tamamlandıktan ancak veri tutarsızlığına sorunları bildirir. Bu durumda, tutarsızlıkları kaldırmak için veritabanını temizlemek zorunda ve denemek için DBCC komutunu yeniden çalıştırın. Veritabanı temiz bildirilmiştir kadar DBCC komutu DATA_PURITY seçeneğini belirtmeniz gerekir.
  • DBCC CHECKDB veya DBCC CHECKTABLE komut yürütüldüğünde PHYSICAL_ONLY seçeneği belirtilmediği takdirde, veri saflıktan denetim gerçekleştirilmez.

BELİRTİLER

Geçersiz veya aralık dışı veri önceki sürümleri SQL Server veritabanında aşağıdaki nedenlerden dolayı saklanmış olabilir:
  • Geçersiz veri kaynağında mevcut bcp yardımcı programı gibi toplu ekleme yöntemleri kullanırken.
  • Geçersiz verileri SQL Server'a yapılan RPC olayı çağrıları aracılığıyla geçildi.
  • Diğer olası fiziksel veri bozulması sol sütun değeri geçersiz bir durumda neden olur.
Bir tablonun bir sütununda geçersiz veri varsa, geçersiz veri karşı gerçekleştirilen işlem türüne bağlı olarak sorunlarla karşılaşabilirsiniz. Ancak, ayrıca hiçbir sorun görünür ve SQL Server 2005 ve sonraki sürümlerinde bir DBCC CHECKDB veya DBCC CHECKTABLE komutunu yürütmek kadar geçersiz veri bulunamayacaktır mümkündür.

Bazı belirtileri nedeniyle geçersiz veri varlığını fark edebilirsiniz dahil (ancak bunlarla sınırlı değildir):
  • Erişim ihlalleri veya diğer türdeki etkilenen sütun karşı sorgu yürütülürken özel durumlar.
  • Etkilenmiş bir sütuna karşı yürütülen sorgu tarafından döndürülen yanlış sonuçlar.
  • Hata veya istatistikleri etkilenen sütunları karşı oluşturulduğunda sorunları.
  • Aşağıdakine benzer hata iletileri:
    Msg 9100 düzeyi 23, durum 2, 1 satır olası dizini bozukluğu algılandı. DBCC CHECKDB çalıştırın.

DATA_PURITY sorun raporu

DBCC CHECKDB veya DBCC CHECKTABLE komutunu DATA_PURITY seçeneği etkin (veya denetimleri otomatik olarak çalıştırmak veri olmak üzere) ve geçersiz yürütme DBCC komutlarıyla kontrol tabloları veri bulunması, DBCC çıktı verileri sorunları gösteren ek iletiler içerir. Veri olmak üzere sorunları gösteren bazı örnek hata iletileri aşağıda gösterilmiştir:
"Account_history" için DBCC sonuçları.
Msg 2570, düzey 16, State 2, 1 satır
Sayfa (1:1073), yuva 33 içinde nesne kimliği 1977058079 dizin kimliği 0, bölüm kimliği 129568478265344, ayırma birim kimliği 129568478265344 ("-satır veri" türü). Sütun "account_name_japan" değerini "nvarchar" veri türü için geçerli aralığın dışında. Sütun için geçerli bir değer güncelleştirin.

Msg 2570, düzey 16, State 2, 1 satır
Sayfa (1:1156), yuva 120 içinde nesne kimliği 1977058079 dizin kimliği 0, bölüm kimliği 129568478265344, ayırma birim kimliği 129568478265344 ("-satır veri" türü). Sütun "account_name_japan" değerini "nvarchar" veri türü için geçerli aralığın dışında. Sütun için geçerli bir değer güncelleştirin.
"Account_history" nesnesi için 1080 sayfalarında 153137 satır vardır.
CHECKDB tablosunda "account_history" (nesne kimliği 1977058079) 0 ayırma hataları ve 338 tutarlılık hataları bulundu.
CHECKDB 'BadUnicodeData' veritabanında 0 ayırma hataları ve 338 tutarlılık hataları bulundu.
DBCC yürütme tamamlandı. DBCC hata iletileri yazdırıldıysa, sistem yöneticinize başvurun.
DBCC 'tablo1' için oluşur.
Msg 2570, düzey 16, State 3, satır 1
Sayfa (1:154), yuva 0 içinde nesne kimliği 2073058421, dizin kimliği 0, bölüm kimliği 72057594038321152, ayırma birim kimliği 72057594042318848 ("-satır veri" türü). Sütun "col2" için "gerçek" veri türü aralık dışında bir değerdir. Sütun için geçerli bir değer güncelleştirin.
"Tablo1" nesnesi için 2 sayfa 4 satır vardır.
CHECKDB 0 1 tutarlılığı hataları tablosu 'tablo1' (nesne kimliği 2073058421) ve ayırma hataları bulundu.
CHECKDB 'realdata' veritabanında 0 ayırma hataları ve 1 tutarlılık hataları bulundu. DBCC yürütme tamamlandı. DBCC hata iletileri yazdırıldıysa, sistem yöneticinize başvurun.
DBCC 'tablo2' için oluşur.
Msg 2570, düzey 16, State 3, satır 1
Sayfa (1:155), yuva 0 içinde nesne kimliği 2105058535, dizin kimliği 0, bölüm kimliği 72057594038452224, ayırma birim kimliği 72057594042449920 ("-satır veri" türü). Sütun "col2" için "ondalık" veri türü aralık dışında bir değerdir. Sütun için geçerli bir değer güncelleştirin.
"Tablo2" nesnesi için 1 sayfa 4 satır vardır.
CHECKDB 0 1 tutarlılığı hataları tablosu 'tablo2' (nesne kimliği 2105058535) ve ayırma hataları bulundu.
CHECKDB 'realdata' veritabanında 0 ayırma hataları ve 1 tutarlılık hataları bulundu. DBCC yürütme tamamlandı. DBCC hata iletileri yazdırıldıysa, sistem yöneticinize başvurun.
DBCC 'Tablo3' için oluşur.
Msg 2570, düzey 16, State 3, satır 1
Sayfa (1:157), yuva 0 içinde nesne kimliği 2121058592, dizin kimliği 0, bölüm kimliği 72057594038517760, ayırma birim kimliği 72057594042515456 ("-satır veri" türü). Sütun "col2" "DATETIME" veri türü için geçerli aralığın dışında bir değerdir. Sütun için geçerli bir değer güncelleştirin.
"Tablo3" nesnesi için 1 sayfa 3 satır vardır.
CHECKDB 0 1 tutarlılığı hataları tablosu 'Tablo3' (nesne kimliği 2121058592) ve ayırma hataları bulundu.
CHECKDB 'realdata' veritabanında 0 ayırma hataları ve 1 tutarlılık hataları bulundu. DBCC yürütme tamamlandı. DBCC hata iletileri yazdırıldıysa, sistem yöneticinize başvurun.
Geçersiz sütun değerini içeren her satır için bir 2570 hata oluşturulur.

Veri olmak üzere sorun çözme

Hataları 2570 DBCC onarım seçeneklerden herhangi birini kullanarak onarılamıyor. Geçersiz sütun değeri değiştirmek için hangi değerin kullanılması gerektiğini belirlemek, DBCC için mümkün değildir çünkü. Bu nedenle, sütun değeri el ile güncelleştirilmelidir.

El ile güncelleştirme gerçekleştirmek için sorunlu bir satır bulmak zorunda. Bunu yapmanın iki yolu vardır.
  • Geçersiz değerler içeren tüm satırları bulmak için geçersiz değerler içeren bir tabloda bir sorguyu çalıştırın.
  • 2570 hata bilgileri geçersiz bir değer içeren satırları tanımlamak için kullanın.
Her iki yöntem de aşağıda ayrıntılı örnekler geçersiz veri içeren satırları bulmak için kullanarak tartışacağız.

Doğru satır bulduğunuzda, bir karar geçersiz varolan verileri değiştirmek için kullanılacak yeni değeri üzerinde yapılması gerekiyor. Bu kararı üzerinde çalışan uygulama için değerler aralığı çok dikkatli göre yapılması sahiptir ilgili belirli satır veri mantıksal anlamlı kılan yanı sıra. Sahip olduğunuz Seçenekler şunlardır:
  • Olması gereken hangi değeri biliyorsanız, belirli bir değere ayarlayın.
  • Bir kabul edilebilir bir varsayılan değere ayarlayın.
  • Sütun değeri NULL olarak ayarlayın.
  • Maksimum veya minimum değer sütunun veri türü için sütun değerini ayarlayın.
  • Belirli satır sütun için geçerli bir değer olmadan herhangi kullanımı olmadığını düşünüyorsanız, bu satırı tamamen silebilirsiniz.

T-SQL sorguları kullanarak geçersiz değerlere sahip satırlar bulma

Geçersiz değerler içeren satırları bulmak için yürütmek için gereken sorgu türünü bir sorun rapor sütun veri türüne bağlıdır. 2570 hata ileti bakarsanız, bu konuda yardımcı olacak bilgiler iki önemli parçaları göreceksiniz. Aşağıdaki örnekte, sütun "account_name_japan" değerini "nvarchar" veri türü aralık dışında olur. Biz kolayca sorunu yanı sıra, söz konusu sütunun veri türü olan sütun tanımlayabilirsiniz. Bu nedenle, veri türü tanıyor ve ona ilgili sütunu, sütun için geçersiz değerler içeren tüm satırları bulmak için sorgu formüle sonra sütunları seçme herhangi başka güncelleştirmek veya silmek için satır (WHERE yan tümcesindeki Doğrulamalar) olarak tanımlamak gerekli.

Unicode veri türü:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Float veri türü:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
SELECT col1, col2 FROM table1
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)

Real veri türü:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
SELECT col1, col2 FROM testReal
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))
ORDER BY col1; -- checks for real out of range

Ondalık ve sayısal veri türü:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Duyarlık ve ölçeği ondalık veya sayısal sütun tanımlı temel değerlerini ayarlamak için gereksinim duyacağınız aklınızda bulundurun. Yukarıdaki örnekte, sütun col2 decimal(15,5) tanımlanmıştır.

Tarih saat veri türü:
Tarih saat sütunu için geçersiz değerler içeren satırları tanımlamak için iki farklı sorguları yürütmek gerekir.
SELECT col1 FROM table3WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM'

SELECT col1 FROM table3 WHERE
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))
> 25919999

Fiziksel konumu kullanarak geçersiz değer içeren satırları bulma:

Yukarıda açıklanan T-SQL yöntemini kullanarak ilgi satırları bulmak varsa bu yöntemi kullanabilirsiniz. 2570 hata iletisinde, fiziksel konumunu geçersiz değer içeren satır yazdırılır. Örneğin, aşağıdaki iletiyi arayın:
Sayfa (1:157), yuva 0 içinde nesne kimliği 2121058592, dizin kimliği 0, bölüm kimliği 72057594038517760, ayırma birim kimliği 72057594042515456 ("-satır veri" türü). Sütun "col2" "DATETIME" veri türü için geçerli aralığın dışında bir değerdir. Sütun için geçerli bir değer güncelleştirin.
Bu iletide, bilgileri görürsünüz: sayfa (1:157) 0 yuvası. Satırı tanımlamak için gereken bilgileri budur. Dosyasını Win32_filespecification ' 1 PageInFile 157 ve SlotID 0'dır. Bu bilgi edindikten sonra aşağıdaki gibi bir komut yürütmek gerekir:
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Bu komut, bir sayfanın tüm içeriğini yazdırır. DBCC PAGE komutu Parametreler şunlardır:
  • Veritabanı adı
  • Dosyasını Win32_filespecification '
  • PageInFile
  • yazdırma seçeneği
Bu komutu çalıştırmak sonra aşağıdaki biçime benzer bilgiler içeren bir çıkış görürsünüz:
Slot 0  Offset 0x60 Length 19 Record Type = PRIMARY_RECORD Record  Attributes = NULL_BITMAP Memory Dump @0x44D1C060 00000000: 10001000 01000000
ffffffff ffffffff †................ 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 0 Column 0 Offset 0x4 Length 4 col1 = 1 Slot 0 Column 1 Offset 0x8 Length 8 col2 = Dec 31 1899 19:04PM Slot 1 Offset 0x73 Length 19 Record Type = PRIMARY_RECORD Record
Attributes = NULL_BITMAP Memory Dump @0x44D1C073 00000000: 10001000 02000000
0ba96301 f8970000 †..........c..... 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 1 Column 0 Offset 0x4 Length 4
col1 = 2 Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM Slot 2
Offset 0x86 Length 19 Record Type = PRIMARY_RECORD Record Attributes =
NULL_BITMAP Memory Dump @0x44D1C086 00000000: 10001000 03000000 0ba96301
f8970000 †..........c..... 00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3 Slot 2 Column 1 Offset 0x8 Length
8 col2 = Jul 8 2006 9:34PM
Bu çıktıda ilginizi çeken satırın sütun değerlerini açıkça görebilirsiniz. Bu durumda, satır yuvası sayfa 0 saklanan gerekir. Hata iletisinden o col2 sorunlu olur biliyor. Bu nedenle col1 değeri 0 yuvası için alabilir ve, update deyiminin WHERE yan tümcesinde koşul olarak kullanmak ya da delete deyimi.

Uyarı İlk yöntem (için gerekli bilgileri bulmak amacıyla, kullanım T-SQL sorguları) kullanmanızı öneririz. DBCC PAGE komutu yalnızca son çare olarak kullanın. Bir üretim ortamında bu komutu kullanırken utmost dikkat edin. Üretim veritabanının bir sınama sunucusunda geri sonra DBCC sayfa kullanarak gerekli tüm bilgileri almak ve üretim sunucusundaki güncelleştirmeleri yapın önerilir. Her zaman bir yedek veritabanını önceki bir kopyasına döndürmeye gerek ve bir aksilik durumunda hazır tutmak emin olun.

Başvurular


DBCC CHECKDB deyimini hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesinde "DBCC CHECKDB (Transact-SQL)" konusuna bakın:SQL Server 2000'deki bilinen sorunlar hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
900335 düzeltme: SQL Server 2000 otomatik veritabanı kurtarma işlemi dizin veri türü FLOAT veya REAL veri türü varsa ve NaN değeri bu veri türü içeren başarısız

RPC olayları hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesinde "Çağıran bir saklı yordam (OLE DB)" konusuna bakın:Farklı veri türleri hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesinde "Çağıran bir saklı yordam (OLE DB)" konusuna bakın:Kayan nokta değeri kuralları hakkında daha fazla bilgi için aşağıdaki Intel Web sitesini ziyaret edin:Microsoft, üçüncü taraf iletişim bilgilerini teknik destek bulmanıza yardımcı olmak için sağlamaktadır. Bu iletişim bilgileri haber verilmeden değiştirilebilir. Microsoft bu üçüncü taraf iletişim bilgilerinin doğruluğunu garanti etmez.