Depanarea DBCC eroare 2570 în SQL Server 2005 și în versiunile ulterioare

Traduceri articole Traduceri articole
ID articol: 923247 - View products that this article applies to.
Măriți totul | Reduceți totul

În această pagină

INTRODUCERE

Acest articol descrie SQL Server error 2570, ceea ce cauzează eroare, și cum să rezolve problema.

INFORMAȚII SUPLIMENTARE

Controalelor DATA_PURITY

În SQL Server 2005, a fost adăugată o nouă opțiune, DATA_PURITY, comenzile DBCC CHECKDB și DBCC CHECKTABLE. Când executați o DBCC CHECKDB sau comanda DBCC CHECKTABLE cu această opțiune activată, comanda va efectua "date puritate" validare pe fiecare valoare coloană în toate rândurile din tabelul sau tabelele din baza acoperire de date. Aceste noi controale sunt efectuate pentru a asigura valorile stocate în coloanele sunt valabile (care este, că valorile nu sunt afară-de-gama pentru domeniu asociat cu tipul acoperire de date din acea coloană). The natura de validare efectuate depinde de tipul acoperire de date al coloanei. The urmează Listă tabel non-exhaustivă oferă câteva exemple:
Reduceți tabelulMăriți tabelul
Tip acoperire de date coloanăTipul de validare a datelor efectuate
Caracterul UnicodeLungimea trebuie să fie un multiplu de 2.
DatetimeCâmpul zile ar trebui să fie între Jan 1 1753 și 31 decembrie 9999. Câmpul marcă de timp trebuie să fie mai devreme decât "11:59:59:999 PM".
Real și FloatA verifica pentru existența de invalid plutitoare valori ca SNAN, QNAN, NINF, ND, PD, PINF.
Nu toate tipurile acoperire de date sunt verificate pentru valabilitatea coloana date. Numai în cazul în care este posibil să aibă o valoare stocate din gama sunt verificate. De exemplu, tipul acoperire de date tinyint are o gamă valabil de la 0 la 255 și sunt stocate într-un singur octet (care pot stoca numai valori de la 0 la 255), deci verificarea valorii nu este necesar.

Date puritate validare controalelor nu sunt activate automat pentru toate bazele acoperire de date. Controalele sunt activate în funcție de pe mai multe factori:
  • Pentru baze acoperire de date create în SQL Server 2005 și în versiunile ulterioare, aceste controale sunt activate implicit și nu poate fi dezactivată, astfel încât utilizarea opțiunea de DATA_PURITY atunci când execută o comanda DBCC CHECKDB sau DBCC CHECKTABLE este irelevant.
  • Pentru bazele acoperire de date care au fost create în versiuni anterioare ale SQL Server, cum ar fi SQL Server 2000, SQL Server 7.0 și versiuni upgraded la spre SQL Server 2005, aceste controale nu sunt activate implicit. Pentru ca aceste controale să fie efectuate, trebuie să specificați opțiunea DATA_PURITY în DBCC CHECKDB sau Comanda DBCC CHECKTABLE. Acest lucru poate duce la două lucruri:
    • Comanda DBCC finisaje și raportează că baza acoperire de date este curat, inclusiv toate datele puritate controale. Acest fapt se înregistrează în date antet. Toate comanda DBCC CHECKDB sau DBCC CHECKTABLE ulterioare execuțiile observa această informație și va efectua automat datele puritate verifică, s-ar întâmpla pentru baze acoperire de date create pe SQL Server 2005. În alte cuvinte, odată ce o bază acoperire de date este cunoscută ca fiind "curat", controalele de puritate date sunt întotdeauna realizată.
    • Comanda DBCC finisaje dar rapoartele de probleme despre date incoerență. Dacă este cazul, va trebui să curățați baza acoperire de date Eliminați inconsecvențele și apoi încearcă să execute comanda DBCC din nou. Va trebui să specificați opțiunea DATA_PURITY pentru comanda DBCC până la baza acoperire de date este raportat a fi curat.
  • Dacă se specifică opțiunea de PHYSICAL_ONLY atunci când DBCC Comandă CHECKDB sau DBCC CHECKTABLE este executat, date puritate verificările nu efectuate.

SIMPTOME

Date nevalide sau afară-de-gama poate au fost stocate în SQL Server bază acoperire de date din versiunile din următoarele motive:
  • Date incorecte a fost prezentă în sursa în marcă de timp ce folosind vrac Inserare metode, cum ar fi utilitarul bcp.
  • Date incorecte a fost trecut prin RPC eveniment apelurile efectuate la SQL Server.
  • Potențialul de alte cauze de corupție datelor fizice stânga valoarea din coloana într-o stare nevalidă.
Dacă aveți date incorecte într-o coloană a unui tabel, care pot apărea probleme în funcție de tipul de opera?iune se efectuează împotriva date nevalide. Cu toate acestea, este de asemenea posibil ca va apărea nici o problemă, și date incorecte nu vor fi descoperite până când executați o comanda DBCC CHECKDB sau DBCC CHECKTABLE pe SQL Server 2005 și în versiunile ulterioare.

Unele dintre simptomele vă poate observa datorită prezenței acoperire de date incorecte includ (dar nu sunt limitate la):
  • Încălcări de acces sau alte tipuri de excepții în marcă de timp ce executarea interogărilor împotriva coloana afectate.
  • Rezultate incorecte returnate de interogări executate împotriva coloana afectate.
  • Erori sau probleme atunci când statisticile sunt construite împotriva coloanele afectate.
  • Mesajele de eroare cum ar fi următoarele:
    Msg 9100, Nivel 23, stat 2, linia 1 posibil index corupția detectat. DBCC a alerga CHECKDB.

Raport de problemă DATA_PURITY

Când executați o comanda DBCC CHECKDB sau DBCC CHECKTABLE cu opțiunea DATA_PURITY activat (sau date puritate controalele sunt rulate automat), și există date incorecte în tabelele verificate de DBCC comenzi, produc?ia DBCC include mesaje suplimentare care indică probleme cu datele. Unele mesaje de eroare probă care indică date puritate probleme sunt prezentate mai jos:
DBCC rezultatele pentru "account_history".
Msg 2570, nivel 16, stat 2, linia 1
Pagina (1:1073), slot 33 în obiect ID 1977058079, ID-ul index 0, partiția ID 129568478265344, unitate de permise ID 129568478265344 (tip "în rândul date"). Coloana "account_name_japan" valoarea este din gama pentru tipul acoperire de date "nvarchar". Actualizare coloană la o valoare entitate juridică.
Msg 2570, nivel 16, stat 2, linia 1
Pagina (1:1156), slot 120 în obiect ID 1977058079, ID-ul index 0, partition ID 129568478265344, permise unitate ID 129568478265344 (tip "Datele în rând"). Coloana "account_name_japan" valoarea este în afara intervalului pentru tipul acoperire de date "nvarchar". Actualizare coloană la o valoare entitate juridică.
Acolo sunt 153137 rânduri în 1080 pagini pentru obiect "account_history".
CHECKDB găsit 0 alocarea erori și 338 coeren?a erori în tabelul "account_history" (ID 1977058079 obiect).
CHECKDB găsit erori de alocare 0 și 338 coeren?a erori în baza acoperire de date 'BadUnicodeData'.
DBCC executarea completat. If DBCC printed error messages, contact your system administrator.
DBCC rezultatele pentru 'table1'.
Msg 2570, nivel 16, Statul 3, linia Către 1
Pagina (1:154), slot 0 în obiect ID 2073058421, ID-ul index 0, partition ID 72057594038321152, permise unitate ID 72057594042318848 (tip "În rândul date"). Coloana "col2" valoarea este din gama pentru tipul acoperire de date "reale". Actualizare coloană la o valoare entitate juridică.
Există 4 rânduri în 2 pagini pentru obiect "table1".
CHECKDB găsit erori de alocare 0 și 1 coeren?a erori în tabelul 'table1' (ID 2073058421 obiect).
CHECKDB găsit erori de alocare 0 și coerența 1 erori în baza acoperire de date 'realdata'. DBCC executarea completat. Dacă DBCC printed error mesaj, contactați administrator de sistem.
DBCC rezultatele pentru 'table2'.
Msg 2570, nivel 16, Statul 3, linia Către 1
Pagina (1:155), slot 0 în obiect ID 2105058535, ID-ul index 0, partition ID 72057594038452224, permise unitate ID 72057594042449920 (tip "În rândul date"). Coloana "col2" valoarea este din gama pentru tipul acoperire de date "zecimal". Actualizare coloană la o valoare entitate juridică.
Există 4 rânduri în paginile 1 pentru obiect "table2".
CHECKDB găsit erori de alocare 0 și 1 coeren?a erori în tabelul 'table2' (ID 2105058535 obiect).
CHECKDB găsit erori de alocare 0 și coerența 1 erori în baza acoperire de date 'realdata'. DBCC executarea completat. Dacă DBCC printed error mesaj, contactați administrator de sistem.
DBCC rezultatele pentru 'Tabel3'.
Msg 2570, nivel 16, Statul 3, linia Către 1
Pagina (1:157), slot 0 în obiect ID 2121058592, ID-ul index 0, partition ID 72057594038517760, permise unitate ID 72057594042515456 (tip "În rândul date"). Coloana "col2" valoarea este din gama pentru tipul acoperire de date "datetime". Actualizare coloană la o valoare entitate juridică.
Există 3 rânduri în paginile 1 pentru obiect „Tabel3".
CHECKDB găsit erori de alocare 0 și 1 coeren?a erori în tabelul 'Tabel3' (ID 2121058592 obiect).
CHECKDB găsit erori de alocare 0 și coerența 1 erori în baza acoperire de date 'realdata'. DBCC executarea completat. Dacă DBCC printed error mesaj, contactați administrator de sistem.
Pentru fiecare rând care conține o valoare incorectă coloana, o eroare de 2570 este generat.

Stabilirea problemei de puritate date

Erorile 2570 nu pot fi reparate utilizând oricare din repararea DBCC Opțiuni. Acest lucru este pentru că este imposibil pentru DBCC pentru a determina ce valoare ar trebui să folosit la replace valoarea din coloana nevalid. Astfel, trebuie să fie valoarea din coloana actualizat manual.

Pentru a efectua o actualizare manuală, aveți pentru a găsi rândul care are problema. Există două moduri de a realiza acest lucru.
  • Executați o interogare împotriva tabelul care conține valori incorecte pentru a găsi rândurile care conțin valorile nevalid.
  • Utilizați informațiile de eroare 2570 pentru a identifica rândurile care au o valoare nevalidă.
Vom discuta ambele aceste metode în detaliu mai jos, folosind exemple pentru a găsi rândurile care au date nevalide.

Odată ce ați găsit rând corectă, o decizie trebuie să se facă pe valoarea nouă, care va fi utilizat pentru înlocui datele incorecte existente. Prezenta decizie trebuie să se facă cu grijă bazate pe zona de valori care locul de muncă de aplicare, precum și ceea ce are sens logic pentru că special rând acoperire de date. Opțiunile aveți sunt:
  • Dacă știți ce valoare ar trebui să fie, setați-l la care valoare specifice.
  • Setați-l la o valoare acceptabilă implicit.
  • Setați valoarea din coloana la NULL.
  • Setați valoarea din coloana cu valoarea maximă sau minimă pentru că tipul acoperire de date al coloanei.
  • Dacă vă simțiți că rândul specifice nu este orice utilizare fără o valoare validă pentru coloană, aveți posibilitatea să ștergeți acel rând cu totul.

Găsirea rânduri cu valori incorecte folosind T-SQL Queries

Tipul de interogare care aveți nevoie pentru a executa pentru a găsi rândurile care au valori incorecte depinde de tipul acoperire de date al coloanei a raportat o problemă. Dacă te uiți la mesajul de eroare 2570, veți observa două piese importante informa?ii care vă va ajuta cu acest lucru. În exemplul următor, coloana valoarea "account_name_japan" este din gama pentru tipul acoperire de date "nvarchar." Putem identifica cu ușurință coloana care are problema, precum și tipul acoperire de date al coloana implicate. Astfel, o dată știi date tip și coloana implicate, vă poate formula interogarea pentru a găsi rândurile care conțin valori incorecte pentru care coloană, selectați coloanele necesare pentru identificarea acel rând (ca predicate în o clauză WHERE) pentru orice continuare actualizare sau șterge.

Tip acoperire de date Unicode:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan 
FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0

Tip acoperire de date float:
-- 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)

Tip acoperire de date reale:
-- 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
Zecimal și numerice tip de date:
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999
Rețineți că aveți nevoie pentru a ajusta valori bazate pe precizia ?i scară cu care le-ați definit coloana zecimal sau numerică. În exemplul de mai sus, coloana a fost definit ca col2 decimal(15,5).

Data marcă de timp date tip:
Aveți nevoie pentru a executa două interogări diferite pentru a identifica rândurile care conțin valori incorecte pentru data marcă de timp coloană.
SELECT col1 FROM table3
WHERE 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

Găsirea rânduri cu valoare nevalidă utilizând locația fizică:

Utilizați această metodă dacă sunteți în imposibilitatea de a găsi rândurile interes, utilizând metoda de T-SQL discutate mai sus. În mesajul de eroare 2570, locația fizică a rândul care conține valoarea incorectă este imprimat. Pentru exemplu, uita-te la următorul mesaj:
Pagina (1:157), slot 0 în obiect ID 2121058592, ID-ul index 0, partiția ID 72057594038517760, unitate de permise ID 72057594042515456 (tip "în rândul date"). Valoare coloană "col2" din gama pentru tipul acoperire de date "datetime". Actualizare coloana juridice valoarea.
În acest mesaj, veți observa informa?iile: pagină (1:157), slot 0. Acest lucru este informații aveți nevoie pentru a identifica pe rând. FileId este 1, PageInFile este 157, și SlotId este 0. Odată ce aveți aceste informații, aveți va trebui să execute comanda, după cum urmează:
DBCC TRACEON ( 3604 )
DBCC PAGE ( realdata , 1 , 157 , 3 )
Această comandă va imprima întregul conținut al unei pagini. Parametri Comanda DBCC pagină sunt:
  • nume de sign-in bazei acoperire de date
  • FileId
  • PageInFile
  • opțiune de imprimare
După ce executați această comandă, veți observa că de ieșire conține informații similare cu următorul format:
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 = 1Slot 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 
În această produc?ie puteți vedea în mod clar valorile coloanelor pentru rândul de interes pentru tine. În acest caz, vă nevoie de rând stocate în slot 0 a paginii. Din mesajul de eroare, știi col2 că este una cu problema. Deci puteți lua valoarea col1 pentru Slot 0 și folos it as Predicatul în clauza WHERE de declarație de update sau ștergeți instrucțiunea.

Avertizare Vă recomandăm să utilizați metoda primul (care este, utilizați T-SQL interogări pentru a găsi informațiile necesare). Utilizarea paginii DBCC comanda doar ca o ultimă instanță. Ia cea mai mare grijă, în marcă de timp ce utilizați această comandă într-o producție mediu. Se recomandă să Restabilire bază acoperire de date de producție pe un test server, apoi obține toate informațiile necesare folosind pagina DBCC, și apoi face actualizări de pe serverul de produc?ie. Ca întotdeauna, vă rugăm să păstrați o copiere de rezervă gata în cazul în care ceva nu merge bine și aveți nevoie pentru a reveni la o copie anterioară a bază acoperire de date.

REFERINȚE

Pentru mai multe informații despre instrucțiunea DBCC CHECKDB, vedea subiect "DBCC CHECKDB (Transact-SQL)" pe următoarele Microsoft Developer site web Network (MSDN):
http://msdn2.Microsoft.com/en-us/library/ms176064.aspx
Pentru mai multe informații despre cunoscute probleme în SQL Server 2000, faceți clic pe următorul număr de articol pentru a vedea articolul în bază de cunoștințe Microsoft:
900335FIX: Opera?ia de recuperare automată acoperire de date SQL Server 2000 poate nu reușesc în cazul în care un index conține un tip acoperire de date FLOAT sau un tip acoperire de date reale, și acest tip acoperire de date conține o valoare NaN
Pentru mai multe informații despre evenimente RPC, vedea "Calling o procedură stocată (OLE DB)" subiect de pe următorul site MSDN Web:
http://msdn2.Microsoft.com/en-us/library/aa198358 (SQL.80) .aspx
Pentru mai multe informații despre tipurile diferite acoperire de date, consultați "Calling o procedură stocată (OLE DB)" subiect de pe următorul site MSDN Web:
http://msdn2.Microsoft.com/en-us/library/ms187752.aspx
Pentru mai multe informații despre plutitoare punctul valoarea conven?iile, următorul site Intel Web:
http://www.Intel.com/design/pentiumii/manuals/243191.htm
Microsoft oferă informații de contact terțe pentru a vă ajuta să găsiți suport tehnic. Aceste informații de contact pot fi modificate fără preaviz. Microsoft nu garantează precizia acestor informații de contact terțe.

Proprietă?i

ID articol: 923247 - Ultima examinare: 22 martie 2012 - Revizie: 1.0
SE APLICĂ LA:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Express Edition with Advanced Services
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Standard Edition for Small Business
Cuvinte cheie: 
kbtshoot kbexpertiseadvanced kbsql2005engine kbinfo kbmt KB923247 KbMtro
Traducere automată
IMPORTANT: Acest articol a fost tradus de software-ul de traducere automată Microsoft, si nu de un traducător. Microsoft vă oferă atât articole traduse de persoane, cât și articole traduse automat, astfel incat aveti access la toate articolele din Baza noastră de informatii în limba dvs. materna. Totuși, un articol tradus automat nu este întotdeauna perfect. Acesta poate conține greșeli de vocabular, sintaxă sau gramatică, la fel cum un vorbitor străin poate face greșeli vorbind limba dvs. materna. Compania Microsoft nu este responsabilă pentru nici o inexactitate, eroare sau daună cauzată de traducerea necorespunzătoare a conținutului sau de utilizarea traducerii necorespunzătoare de către clienții nostri. De asemenea, Microsoft actualizează frecvent software-ul de traducere automată.
Face?i clic aici pentru a vizualiza versiunea în limba engleză a acestui articol:923247

Trimite?i feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com