MSSQLSERVER_2570

A következőkre vonatkozik:SQL Server

Részletek

Attribute Value
Termék neve SQL Server
Eseményazonosító 2570
Eseményforrás MSSQLSERVER
Összetevő SQLEngine
Szimbolikus név DBCC_COLUMN_VALUE_OUT_OF_RANGE
Üzenet szövege P_ID. oldal, hely S_ID az objektumazonosítóban O_ID, index ID I_ID, partíciós azonosító PN_ID, alloc egységazonosító A_ID (típus TYPE). Az COLUMN_NAME oszlop értéke a "DATATYPE" adattípus tartományán kívül esik. Oszlop frissítése érvényes értékre.

Explanation

Az adott oszlopban található oszlopérték kívül esik az oszlop adattípusának lehetséges értéktartományán. Ha egy táboszlopban értelen adat van, problémákba ütközhetsz, attól függően, milyen műveleteket végeztek az érvénytelen adatokkal. Ugyanakkor az is előfordulhat, hogy nem fog probléma megjelenni, és az érvénytelen adatokat csak akkor fedezik fel, ha végrehajtasz egy DBCC CHECKDB vagy DBCC CHECKTABLE parancsot.

Néhány tünet, amit érvénytelen adatok jelenléte miatt észrevehet, a következők (de nem kizárólagosan):

  • Hozzáférési szabálysértések vagy egyéb kivételek a érintett oszlop elleni lekérdezések végrehajtásakor.
  • Hibás eredmények a érintett oszlopon végzett lekérdezések által visszaadottak.
  • Hibák vagy problémák, amikor statisztikákat építenek az érintett oszlop ellen.
  • Hibaüzenetek, mint a következő:

    Msg 9100, 23. szint, állapot 2, Line <LineNum> Lehetséges indexkorrupció észlelve. Futtassa a DBCC CHECKDB-t.

DATA_PURITY ellenőrzések

Amikor DBCC CHECKDB vagy DBCC CHECKTABLE parancsot futtatsz, az SQL Server "adattisztaság" ellenőrzést végez az adatbázis minden táblázatának minden sorában lévő oszlopértékekről. Ezeket az ellenőrzéseket azért végzik, hogy megbizonyosodjanak arról, hogy az oszlopokban tárolt értékek érvényesek-e. Vagyis az ellenőrzés biztosítja, hogy az értékek ne kerüljenek kívül az oszlopok adattípusához tartozó tartománytól. Az elvégzett validáció jellege az oszlop adattípusától függ. Az alábbi, nem kimerítő lista néhány példát mutat:

Oszlop adattípusa Az adatellenőrzés típusa
Unicode-karakter Az adathossznak 2 szoroncának kell lennie.
Dátum és idő A dátummező 1753. január 1. és 9999. december 31. között kellene lennie. Az időmezőnek korábban kell lennie, mint a "11:59:59.997PM".
Valódi és lebegő Ellenőrizd az érvénytelen lebegőpontos értékek létezését, mint például SNAN, QNAN, NINF, ND, PD és PINF.

Nem minden adattípust ellenőriznek az oszlopadatok érvényessége szempontjából. Csak azok, amelyeknek a tárolt értéke esetleg túllépett a tartományban. Például az tinyint adattípus érvényes tartománya 0 és 255 között van, és egyetlen bájtban tárolódik (amely csak 0 és 255 közötti értékeket tud tárolni), így az érték ellenőrzése nem szükséges.

Note

Ezek a próbákat alapértelmezés szerint engedélyezett, és nem lehet kikapcsolni, így nincs szükség arra, hogy az DATA_PURITY opciót kifejezetten használd az or DBCC CHECKDB parancs végrehajtásánálDBCC CHECKTABLE. Azonban, ha a PHYSICAL_ONLY opciót használod vagy DBCC CHECKDBDBCC CHECKTABLE, az adattisztasági ellenőrzések nem végzik.

DATA_PURITY problémajelentés

Amikor egy DBCC CHECKDB vagy DBCC CHECKTABLE parancsot futtatsz a DATA_PURITY opcióval (vagy az adattisztasági ellenőrzések automatikusan futnak), és a parancsok által ellenőrzött DBCC táblázatokban érvénytelen adatok találhatók, a DBCC kimenet további üzeneteket is tartalmaz, amelyek jelezik az adatokhoz kapcsolódó problémákat. Az alábbi mintahibaüzenetek adattisztasági problémákat jeleznek:

DBCC results for "account_history". 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1073), slot 33 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value. 
 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1156), slot 120 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value.
There are 153137 rows in 1080 pages for object "account_history". 
CHECKDB found 0 allocation errors and 338 consistency errors in table "account_history" (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 338 consistency errors in database '<DatabaseName>'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table1'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:154), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "real". Update column to a legal value. 
There are 4 rows in 2 pages for object "table1". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table1' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table2'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:155), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "decimal". Update column to a legal value. 
There are 4 rows in 1 pages for object "table2". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table2' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table3'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 
There are 3 rows in 1 pages for object "table3". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table3' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

For every row that contains an invalid column value, a 2570 error is generated. 

A probléma oka

Érvénytelen vagy hatótávolságon kívüli adatokat tárolhattak az SQL Server adatbázisban az alábbi okokból:

  • Érvénytelen adatokat távoli eljáráshívás (RPC) eseményeken keresztül helyeztek be az SQL Server-be.
  • A fizikai adatromlás egyéb lehetséges okai miatt az oszlop értéke érvénytelenné vált.

Javítsuk meg az adattisztasági problémát

A 2570-es hibákat egyik javítási lehetőséggel sem lehet kijavítani DBCC . Az ok az, hogy DBCC nem lehet meghatározni, milyen értéket kell használni az érvénytelen oszlopérték helyettesítésére. Ezért az oszlop értékét manuálisan kell frissíteni. A manuális frissítéshez meg kell találni azt a sort, ahol a probléma fennáll. Használj az alábbi módszerek egyikét a sor megtalálásához:

  • Hajtson végre lekérdezést a képtelen értékeket tartalmazó táblázat ellen, hogy megtaláld azokat a sorokat, amelyek az érvénytelen értékeket tartalmazzák.
  • Használja a 2570-es hiba adatait az értelen értékek azonosítására.

Mindkét módszert részletezzük a következő szakaszokban, és példákat adnak a sorok megtalálásához, amelyekben értelen adat van.

Miután megtalálod a megfelelő sort, döntést kell hozni az új értékről, amelyet a meglévő érvénytelen adatok cseréjére használnak. Ezt a döntést nagyon óvatosan kell meghozni, az alkalmazásra vonatkozó értéktartomány és az adott adatsornak a logikai jelentése alapján. A következő lehetőségek közül választhat:

  • Ha tudod, milyen értéknek kellene lennie, állítsd be erre az értékre.
  • Állítsd be elfogadható alapértelmezett értékre.
  • Állítsuk be az oszlopértéket .NULL
  • Állítsuk be az oszlop értékét az adott adattípus maximális vagy minimális értékére.
  • Ha úgy gondolod, hogy az adott sor nem hasznos érvényes érték nélkül az oszlophoz, töröld teljesen azt a sort.

Keress sorokat érvénytelen értékekkel T-SQL lekérdezésekkel

A lekérdezés típusa, amit végrehajtani kell a hibás értékű sorok megtalálásához, attól függ, melyik oszlop adattípusa jelent problémát. Ha megnézed a 2570-es hibaüzenetet, két fontos információt fogsz észrevenni, amelyek segíthetnek ebben a problémában. A következő példában az oszlop account_name értéke az adattípus nvarcharesetén a tartományon kívül van. Könnyen azonosíthatjuk az oszlopot a problémával és az adott oszlop adattípusával. Így ha ismered az adattípust és az érintett oszlopot, lekérdezéseket fogalmazhatsz meg, hogy megtaláld azokat a sorokat, amelyek érvénytelen értékeket tartalmaznak az adott oszlophoz, és kiválaszthatod azokat az oszlopokat, amelyek szükségesek az adott sor azonosításához (mint a WHERE záradék predikátumai) további frissítéshez vagy törléshez.

Unicode adattípus
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Float adattípus

Futtasd le a következő kódrészletet úgy, col1 hogy a tényleges elsődleges kulcsoszlopokra váltogatsz, col2 a 2570 hibából származó oszlopra, és table1 a kimenetből a táblázatra CHECKDB .

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)
Valós adattípus

Futtasd le a következő kódrészletet úgy, col1 hogy a tényleges elsődleges kulcsoszlopokra váltogatsz, col2 a 2570 hibából származó oszlopra, és table1 a kimenetből a táblázatra CHECKDB .

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 
Tizedes és numerikus adattípusok
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

Ne feledd, hogy az értékeket az or oszlop pontossága és mérete decimalnumeric alapján kell módosítani. A fenti példában az oszlop definiálva van .col2 decimal(15,5)

Dátumidő adattípus

Két különböző lekérdezést kell végrehajtani, hogy azonosítsuk azokat a sorokat, amelyek érvénytelen értékeket tartalmaznak az datetime oszlopban.

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

Keress sorokat érvénytelen értékekkel a fizikai helyen

Ezt a módszert használhatod, ha nem találod meg azokat a sorokat, amelyeknek értéke érvénytelen, a T-SQL módszerrel. A 2570-es hibaüzenetben megjelenik annak a sornak a fizikai helye, amely az érvénytelen értéket tartalmazza. Például nézze meg a következő üzenetet:

Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 

Ebben az üzenetben észreveszed Page (1:157), slot 0. Ez az információ, amire szükséged van a sor azonosításához. Az FileId az 1, az PageInFile , 157és az SlotId is 0.

Ha megvan ez az információ, a következő parancsot kell végrehajtania:

DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)

Note

Ez a parancs kinyomtatja az oldal teljes tartalmát. A DBCC PAGE parancs paraméterei a következők:

  • Database name: Az adatbázis neve.
  • File number: Az adatbázis fájl fájlszáma.
  • Page number: Az oldal száma, amit meg akarsz vizsgálni.
  • Print option: Egy opcionális paraméter, amely meghatározza a kimeneti részletesség szintjét.

Miután végrehajtod ezt a parancsot, egy kimenetet fogsz észrevenni, amely hasonló információkat tartalmaz a következő formátumhoz:

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

Ebben a kimenetben jól látható az érdeklődő sor oszlopértékei. Ebben az esetben a sort az oldalon kell tárolni slot 0 . A hibaüzenetből tudod, hogy ez col2 a probléma. Tehát az col1 értéket veheted az for Slot 0 értékével, és használhatod predikátumként a WHERE update vagy delete utasításod záradékában.

Warning

Javasoljuk, hogy az első módszert használd (vagyis T-SQL lekérdezésekkel keresd meg a szükséges információkat). Használd a DBCC PAGE parancsot csak utolsó lehetőségként. Légy a legnagyobb óvatosság, amikor ezt a parancsot produkciós környezetben használod. Ajánlott a termelési adatbázis visszaállítása egy tesztszerveren, az összes szükséges információ beszerzése az DBCC PAGE, és a termelési szerveren történő frissítés. Mint mindig, mindig tarts biztonsági mentést arra az esetre, ha valami rosszul sülne el, és vissza kell térned az adatbázis korábbi példányára.