Odstraňování chyby DBCC 2570 v SQL Server 2005 a novější verze

ÚVOD

Tento článek popisuje chyby serveru SQL Server 2570, co způsobuje chybu a jak problém vyřešit.

Další informace

DATA_PURITY kontroly

V SQL Server 2005 byla přidána nová možnost DATA_PURITY, příkazy DBCC CHECKDB a DBCC CHECKTABLE. Po spuštění příkazu DBCC CHECKDB nebo DBCC CHECKTABLE tato možnost povolena, příkaz provede ověření "čistoty dat" na každou hodnotu sloupec ve všech řádcích tabulky nebo tabulek v databázi. Jsou prováděny tyto nové kontroly k zajištění platnosti hodnoty uložené ve sloupcích (to znamená hodnoty nejsou mimo rozsah domény přidružené datový typ tohoto sloupce). Povaha ověření provést, závisí na typu dat sloupce. Následující nevyčerpávající seznam uvádí několik příkladů:
Typ dat sloupceTyp ověřování dat
Znak UnicodeDélka dat by měla být násobkem 2.
Datum a časDní smluv.serv.zakázky by měla být mezi 1753 1 ledna a 31. prosince 9999. Pole čas musí být dřívější než "11:59:59:999 PM".
Skutečné a FloatZkontrolovat existenci neplatných hodnot s plovoucí čárkou, například SNAN, QNAN, NINF, ND, PD, PINF.
Ne všechny datové typy jsou kontrolovány na platnost dat sloupce. Pouze ty, kde je možné mít uloženou hodnotu, která je mimo rozsah jsou kontrolovány. Například typ dat tinyint má platný rozsah od 0 do 255 a je uložen v jednom bajtu (který může obsahovat pouze hodnoty od 0 do 255), takže kontrolní hodnota není nezbytné.

Ověřovací kontroly čistoty dat nejsou automaticky povoleny pro všechny databáze. Kontroly jsou povoleny v závislosti na několika faktorech:
  • Pro databáze vytvořené v SQL Server 2005 a novější verze těchto kontrol jsou ve výchozím nastavení povoleno a nemůže být zakázán, takže je možnost DATA_PURITY při spuštění příkazu DBCC CHECKDB nebo DBCC CHECKTABLE irelevantní.
  • Pro databáze vytvořené v předchozích verzích serveru SQL Server, SQL Server 2000, SQL Server 7.0 a verze, které jsou inovovány na SQL Server 2005 tyto kontroly nejsou standardně. Tyto kontroly provádět, musíte zadat možnost DATA_PURITY příkazu DBCC CHECKDB nebo DBCC CHECKTABLE. To může mít za následek dvě věci:
    • Příkazu DBCC dokončí a hlásí, že je čistý, včetně kontroly čistoty všech dat v databázi. Tato skutečnost je zaznamenána v záhlaví databáze. Všechny následné DBCC CHECKDB nebo DBCC CHECKTABLE příkazu spuštění jsou patrné tyto informace a automaticky provede kontrolu čistoty dat, jako by se stalo pro databáze vytvořené v SQL Server 2005. Jinými slovy Jakmile databáze je známá jako "čisté", kontrolu čistoty dat jsou prováděny vždy.
    • Dokončení příkazu DBCC, ale o nekonzistenci dat hlásí problémy. Pokud jde o případ, budou mít Vyčistit databázi nekonzistence odebrat a poté se pokusíte spustit příkaz DBCC znovu. Je nutné zadat možnost DATA_PURITY příkazu DBCC databáze je hlášena být čisté.
  • Pokud je zadána možnost PHYSICAL_ONLY, při spuštění příkazu DBCC CHECKDB nebo DBCC CHECKTABLE, nejsou provedeny kontroly čistoty dat.

PŘÍZNAKY

Neplatná nebo mimo rozsah dat může byly uloženy v databázi serveru SQL Server v předchozích verzích následujících důvodů:
  • Neplatná data obsahoval zdroje při použití metod hromadného vložit, například nástroj bcp.
  • Prostřednictvím vzdáleného volání Procedur události volání SQL Server byla předána neplatná data.
  • Další potenciál způsobuje poškození fyzické datové vlevo hodnota sloupce v neplatném stavu.
Pokud máte neplatná data ve sloupci tabulky, může dojít k potížím v závislosti na typu operace, která bude provedena neplatná data. Je však také možné, že není žádný problém se objeví, a neplatná data nebudou rozpoznány, dokud spuštění příkazu DBCC CHECKDB nebo DBCC CHECKTABLE na serveru SQL Server 2005 a novější verze.

Některé z příznaků, může dojít vzhledem k přítomnosti neplatná data zahrnují (ale nejsou omezeny na):
  • Narušení přístupu nebo jiné typy výjimek při spouštění dotazů příslušném sloupci.
  • Nesprávné výsledky dotazů prováděny ovlivněný sloupec.
  • Chyby nebo problémy při statistiky se vyvíjejí proti ovlivněné sloupce.
  • Chybové zprávy, například následující:
    Msg 9100, úroveň 23, stav 2, řádek 1 možná zjištěno poškození indexu. Spusťte DBCC CHECKDB.

Hlášení problému DATA_PURITY

Při spuštění DBCC CHECKDB nebo CHECKTABLE DBCC příkazu s povolena možnost DATA_PURITY (nebo čistotu dat se automaticky spustí kontroly) a neplatná data existují v tabulkách zkontrolovat DBCC příkazy, DBCC výstup obsahuje další zprávy, které označují problémy s daty. Níže jsou uvedeny některé ukázkové chybové zprávy, které označují problémy čistoty dat:
Výsledky DBCC "account_history".
Msg 2570, úroveň 16, stav 2, řádek 1
Stránky (1:1073), patice 33 v objektu ID 1977058079, index ID 0, oddíl ID 129568478265344, alloc jednotky ID 129568478265344 (typ "v řádku dat"). "Account_name_japan" hodnota sloupce je mimo rozsah datového typu "nvarchar". Aktualizujte sloupec právní hodnotu.

Msg 2570, úroveň 16, stav 2, řádek 1
Stránky (1:1156), slot 120 v objektu ID 1977058079, index ID 0, oddíl ID 129568478265344, alloc jednotky ID 129568478265344 (typ "v řádku dat"). "Account_name_japan" hodnota sloupce je mimo rozsah datového typu "nvarchar". Aktualizujte sloupec právní hodnotu.
V 1080 stránek pro objekt "account_history" jsou 153137 řádky.
CHECKDB nalezen 0 přidělení chyby a 338 konzistence chyby v tabulka "account_history" (objekt ID 1977058079).
CHECKDB nalezen 0 přidělení chyby a 338 konzistence chyby v databázi 'BadUnicodeData'.
Provádění DBCC dokončeno. Pokud DBCC vytištěny chybové zprávy, obraťte se na vašeho správce systému.
Výsledky DBCC "Tabulka1".
Msg 2570, úroveň 16 stav 3, řádek 1
Stránka (1:154), patice 0 v objektu ID 2073058421, index ID 0, oddíl ID 72057594038321152, alloc jednotky ID 72057594042318848 (typ "v řádku dat"). "Sloupec2" hodnota sloupce je mimo rozsah datového typu "reálný". Aktualizujte sloupec právní hodnotu.
Existují 4 řádky 2 stránek pro objekt "Tabulka1".
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v tabulka "Tabulka1" (objekt ID 2073058421).
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v databázi 'realdata'. Provádění DBCC dokončeno. Pokud DBCC vytištěny chybové zprávy, obraťte se na vašeho správce systému.
Výsledky DBCC "Tabulka2".
Msg 2570, úroveň 16 stav 3, řádek 1
Stránky (1:155), v objektu ID 2105058535 patice 0, index ID 0, oddíl ID 72057594038452224, alloc jednotky ID 72057594042449920 (typ "v řádku dat"). "Sloupec2" hodnota sloupce je mimo rozsah datového typu "desetinné". Aktualizujte sloupec právní hodnotu.
Existují 4 řádky 1 stránek pro objekt "Tabulka2".
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v tabulka "Tabulka2" (objekt ID 2105058535).
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v databázi 'realdata'. Provádění DBCC dokončeno. Pokud DBCC vytištěny chybové zprávy, obraťte se na vašeho správce systému.
Výsledky DBCC "Tabulka3".
Msg 2570, úroveň 16 stav 3, řádek 1
Stránky (1:157), v objektu ID 2121058592 patice 0, index ID 0, oddíl ID 72057594038517760, alloc jednotky ID 72057594042515456 (typ "v řádku dat"). "Sloupec2" hodnota sloupce je mimo rozsah datového typu "datetime". Aktualizujte sloupec právní hodnotu.
Existují 3 řádky 1 stránek pro objekt "Tabulka3".
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v tabulka "Tabulka3" (objekt ID 2121058592).
CHECKDB nalezen 0 přidělení chyby a 1 konzistence chyby v databázi 'realdata'. Provádění DBCC dokončeno. Pokud DBCC vytištěny chybové zprávy, obraťte se na vašeho správce systému.
Pro každý řádek, který obsahuje hodnotu sloupce je neplatné je generována chyba 2570.

Řešení problémů čistoty dat

2570 chyby nelze opravit pomocí možností opravy DBCC. Je to proto, že je nemožné pro DBCC určit, jakou hodnotu má lze nahradit hodnotu sloupce je neplatné. Proto musí být ručně aktualizovány na hodnotu sloupce.

Chcete-li provést ruční aktualizaci, máte najděte řádek, který má tyto potíže. Existují dva způsoby, jak toho dosáhnout.
  • Spuštění dotazu proti tabulku, která obsahuje neplatné hodnoty, chcete-li najít řádky, které obsahují neplatné hodnoty.
  • Informace z chyby 2570 použijte k identifikaci řádky, které obsahuje neplatnou hodnotu.
Jsme projedná obě tyto metody podrobně níže uvedené příklady použití Chcete-li najít řádky, které obsahují neplatná data.

Jakmile naleznete správný řádek rozhodnutí musí být přijata na novou hodnotu, která bude použita k nahrazení existující neplatná data. Toto rozhodnutí má být provedena velmi pečlivě založené na rozsah hodnot, které pracují pro aplikaci a co dává logický smysl pro tento řádek dat. Jsou možnosti, které máte:
  • Pokud víte, jaké hodnoty by mělo být, nastavit na určitou hodnotu.
  • Nastavte ji na přijatelné výchozí hodnotu.
  • Hodnota sloupce nastavena na hodnotu NULL.
  • Hodnota sloupce nastavena na maximální nebo minimální hodnotu pro daný typ dat sloupce.
  • Pokud máte pocit, že konkrétní řádek není jakékoli použití bez platné hodnoty pro sloupec, je tento řádek úplně odstranit.

Hledání řádky s neplatnými hodnotami pomocí T-SQL dotazů

Typ dotazu, který je nutné provést k nalezení řádků, které mají neplatné hodnoty závisí na typu dat sloupce, který oznámil problém. Pokud se podíváte na chybovou zprávu 2570, zjistíte dva důležité informace, které vám pomohou s tímto. V následujícím příkladu "account_name_japan" hodnota sloupce je mimo rozsah datového typu "nvarchar". Sloupec, který má problém, stejně jako typ dat sloupce, které nám umožňuje snadno identifikovat. Jakmile víte, typ dat a související sloupce lze formulovat dotaz, chcete-li najít řádky, které obsahují neplatné hodnoty v tomto sloupci, výběr sloupce tedy potřebné pro identifikaci daného řádku (jako predikáty v klauzuli WHERE) pro libovolné další aktualizace nebo odstranění.

Data ve formátu Unicode, zadejte:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Typ dat 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)

Typ dat Real:
-- 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

Decimal a Numeric typ dat:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Mějte na paměti, že je třeba upravit na základě přesnost a měřítko, se kterým jste definovali decimal nebo numeric sloupec hodnoty. Ve výše uvedeném příkladu byl sloupec definován jako Sloupec2 decimal(15,5).

Datum časové údaje typu:
Je třeba provést dva různé dotazy k identifikaci řádky, které obsahují neplatné hodnoty pro sloupec Datum čas.
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

Hledání řádky s pomocí fyzické umístění je neplatný:

Pokud nemůžete najít řádky zájmu výše popsanou metodou T-SQL, můžete použít tuto metodu. V chybové zprávě 2570 vytiskne se fyzické umístění na řádek, který obsahuje neplatnou hodnotu. Podívejte se například na následující zpráva:
Stránky (1:157), v objektu ID 2121058592 patice 0, index ID 0, oddíl ID 72057594038517760, alloc jednotky ID 72057594042515456 (typ "v řádku dat"). "Sloupec2" hodnota sloupce je mimo rozsah datového typu "datetime". Aktualizujte sloupec právní hodnotu.
V této zprávě si všimnete informace: stránky (1:157) pozici 0. To jsou informace, které budete potřebovat k identifikaci řádku. FileId je 1, PageInFile je 157 a ID hodnotu 0. Jakmile máte tyto informace, je nutné spustit příkaz, takto:
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Tento příkaz vytiskne celý obsah stránky. Parametry příkazu DBCC stránky jsou:
  • Název databáze
  • FileId
  • PageInFile
  • možnost tisku
Po spuštění tohoto příkazu bude Všimněte si výstup, který obsahuje informace podobné následujícímu formátu:
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
V tomto výstupu se jasně zobrazí sloupec hodnoty pro řádek zajímat. V takovém případě musíte řádky uložené v pozici 0 stránky. Z chybové zprávy víte, že se problém je že Sloupec2. Tak může převzít hodnotu sloupci Sloupec1 pro pozici 0 a použít jako predikát v klauzuli WHERE v příkazu update nebo příkaz delete.

Upozornění: Doporučujeme použít první metodu (to znamená použít T-SQL dotazy k nalezení požadovaných informací). Pomocí příkazu DBCC stránky pouze jako poslední možnost. Přijmout nejvyšší pozornost, zatímco tento příkaz použít v provozním prostředí. Je vhodné k obnovení databáze výrobní na testovací server, a pak získat všechny požadované informace pomocí DBCC stránky a poté proveďte aktualizace na provozním serveru. Jako vždy nezapomeňte zálohu připraven v případě, že dojde k chybě a je třeba se vrátit k předchozí kopii databáze.

Odkazy

Další informace o příkazu DBCC CHECKDB naleznete v tématu "DBCC CHECKDB (Transact-SQL)" na následujícím webu Microsoft Developer Network (MSDN):Další informace o známých problémech v SQL Server 2000 klepněte na následující číslo článku databáze Microsoft Knowledge Base:
900335 oprava: operace obnovení automatického databáze SQL Server 2000 nemusí být úspěšný, pokud index obsahuje typ dat FLOAT nebo typ dat REAL a tento datový typ obsahuje hodnota NaN

Další informace o události RPC naleznete téma "Volání uložené procedury (OLE DB)" na následujícím webu MSDN:Další informace o různých datových typů naleznete v tématu "Volání uložené procedury (OLE DB)" na následujícím webu MSDN:Další informace o plovoucí bod hodnotu konvencích naleznete na následujícím webu společnosti Intel:Společnost Microsoft poskytuje kontaktní informace jiného výrobce, a tím vám usnadňuje získání technické podpory. Tyto kontaktní informace se mohou změnit bez předchozího upozornění. Společnost Microsoft nezaručuje přesnost kontaktních informací jiných výrobců.
Vlastnosti

ID článku: 923247 - Poslední kontrola: 14. 1. 2017 - Revize: 1

Váš názor