Rozwiązywanie problemów błąd DBCC 2570 w programie SQL Server 2005 i nowszych wersjach

Dotyczy: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

WPROWADZENIE


W tym artykule opisano SQL Server error 2570, co powoduje błąd i sposobu rozwiązania problemu.

Więcej informacji


Kontrole DATA_PURITY

W programie SQL Server 2005 nowej opcji DATA_PURITY, dodano polecenia DBCC CHECKDB i DBCC CHECKTABLE. Podczas wykonywania polecenia DBCC CHECKDB lub ls z ta opcja jest włączona, polecenie wykona sprawdzanie poprawności "czystości danych" każdą wartość kolumny w wszystkie wiersze tabeli lub tabel w bazie danych. Te nowe są sprawdzane w celu zapewnienia, że wartości przechowywanych w tych kolumnach są prawidłowe (to znaczy, że wartości nie są poza zakresem dla domeny związane z typem danych tej kolumny). Rodzaju sprawdzania poprawności, wykonywane zależy od typu danych kolumny. Następujący niewyczerpujący wykaz podaje kilka przykładów:
Typ danych kolumnyTyp sprawdzania poprawności danych wykonywane
Znak UnicodeDługość danych powinna być wielokrotnością liczby 2.
Data i godzinaW polu dni należy między Jan 1 1753 do 31 grudnia 9999. Wartość pola czas musi być wcześniejsza niż "11:59:59:999 PM".
Prawdziwe i szpachlowanieSprawdź, czy istnienie nieprawidłowe wartości zmiennoprzecinkowe jak SNAN, QNAN, NINF, ND, PD, PINF.
Nie wszystkie typy danych są sprawdzane za poprawność danych kolumny. Tylko te, gdzie jest możliwe, że wartość przechowywana, który jest poza zakresem są sprawdzane. Na przykład typ danych tinyint ma prawidłowy zakres od 0 do 255 i jest przechowywany w pojedynczy bajt (który można przechowywać tylko wartości z zakresu od 0 do 255), więc sprawdzanie wartości nie jest konieczne.

Sprawdzanie poprawności danych czystości nie są automatycznie włączone dla wszystkich baz danych. Kontrole są włączone w zależności od kilku czynników:
  • Dla baz danych utworzonych w programie SQL Server 2005 i nowszych wersjach kontrole te są domyślnie włączone i nie może być wyłączony, więc użycie opcji DATA_PURITY podczas wykonywania polecenia DBCC CHECKDB lub ls jest bez znaczenia.
  • Dla baz danych utworzonych we wcześniejszych wersjach programu SQL Server, takich jak SQL Server 2000, SQL Server 7.0 i uaktualniony do programu SQL Server 2005, wersje te kontrole nie są włączone domyślnie. Aby kontrole te mają być wykonane należy określić opcji DATA_PURITY w polecenie DBCC CHECKDB lub DBCC CHECKTABLE. Może to spowodować, że dwie rzeczy:
    • Polecenie DBCC zakończy się i zgłasza, że jest czysta, włączając wszystkie kontrole czystości danych bazy danych. Fakt ten jest rejestrowana w nagłówku bazy danych. Wszystkie kolejne polecenia DBCC CHECKDB lub DBCC CHECKTABLE wykonania polecenia zauważyć, że te informacje i automatycznie przeprowadzi kontrole czystości danych, jak stałoby się dla baz danych utworzonych w programie SQL Server 2005. Innymi słowy gdy bazy danych jest znany jako "czyste", są zawsze przeprowadzane kontrole czystości danych.
    • Polecenie DBCC zakończy pracę, ale raportuje problemy dotyczące niespójność danych. Jeśli tak się stanie, będzie mieć do czyszczenia bazy danych, aby usunąć niespójności, a następnie spróbuj ponownie wykonać polecenie DBCC. Trzeba będzie podać opcji DATA_PURITY dla polecenia DBCC, dopóty, dopóki baza danych zgłosiła jest być czysta.
  • Jeśli określono opcję PHYSICAL_ONLY, gdy wykonywane jest polecenie DBCC CHECKDB lub DBCC CHECKTABLE, kontrole czystości danych nie są wykonywane.

SYMPTOMY

Nieprawidłowe lub spoza zakresu dane mogły być zapisane w bazie danych programu SQL Server w starszych wersjach z następujących powodów:
  • Nieprawidłowe dane był obecny w źródle podczas korzystania z metody wstawiania zbiorczego, takie jak narzędzia bcp.
  • Przekazano nieprawidłowe dane za pośrednictwem wywołania zdarzeń RPC do serwera SQL.
  • Inne możliwe przyczyny uszkodzenia danych fizycznych w lewo wartość kolumny w nieprawidłowym stanie.
Jeśli masz nieprawidłowe dane w kolumnie tabeli, mogą wystąpić problemy w zależności od rodzaju operacji, która jest przeprowadzana przy użyciu nieprawidłowych danych. Jednak również jest możliwe, że pojawi się bez problemu i nieprawidłowe dane nie zostaną odnalezione, aż do wykonania polecenia DBCC CHECKDB lub DBCC CHECKTABLE w programie SQL Server 2005 i nowszych wersjach.

Niektóre symptomy, które można zauważyć, ze względu na obecność nieprawidłowe dane obejmują (ale nie są ograniczone do):
  • Naruszenia zasad dostępu lub innych typów wyjątków podczas wykonywania kwerend w odpowiedniej kolumnie.
  • Nieprawidłowe wyniki zwracane przez kwerendy wykonywane w odpowiedniej kolumnie.
  • Błędy lub problemy podczas statystyki są tworzone z odpowiednich kolumn.
  • Komunikaty o błędach zbliżoną do następującej:
    Msg 9100, poziom 23, stan 2, wiersz 1 możliwe wykryto uszkodzenie indeksu. Uruchomienie polecenia DBCC CHECKDB.

Raport o problemie DATA_PURITY

Podczas wykonywania polecenia DBCC CHECKDB lub ls polecenia z włączoną opcją DATA_PURITY (lub czystości danych, kontrole są uruchamiane automatycznie) i nieprawidłowe dane istnieją w tabelach sprawdzany przez polecenia DBCC, dane wyjściowe DBCC zawierają dodatkowe komunikaty wskazujące na problemy z danymi. Poniżej przedstawiono komunikaty o błędach próbki, które wskazują problemy czystości danych:
DBCC wyniki dla "account_history".
Msg 2570, poziom: 16, stan 2, wiersz 1
Strona (1:1073), gniazdo 33 w obiekcie ID 1977058079, indeks Identyfikatora 0, partycje 129568478265344 ID, alloc jednostki identyfikator 129568478265344 (typu "dane w wierszu"). Kolumna "account_name_japan" wartość jest spoza zakresu dla typu danych "nvarchar". Aktualizacji kolumny wartości prawnej.

Msg 2570, poziom: 16, stan 2, wiersz 1
Strona (1:1156), gniazdo 120 w obiekcie ID 1977058079, indeks Identyfikatora 0, partycje 129568478265344 ID, alloc jednostki identyfikator 129568478265344 (typu "dane w wierszu"). Kolumna "account_name_japan" wartość jest spoza zakresu dla typu danych "nvarchar". Aktualizacji kolumny wartości prawnej.
Istnieją wiersze 153137 na stronach 1080 dla obiektu "account_history".
W tabeli "account_history" (obiekt ID 1977058079) CHECKDB znaleziono 0 błędów alokacji i 338 błędy spójności.
CHECKDB znaleziono 0 błędów alokacji i 338 błędy spójności w bazie danych 'BadUnicodeData'.
Zakończono wykonanie DBCC. DBCC drukowane komunikaty o błędach, skontaktuj się z administrator systemu.
DBCC wyniki dla elementu "Tabela1".
Msg 2570, poziom: 16, stan 3, wiersz 1
Strona (1:154), gniazdo 0 w obiekcie ID 2073058421, indeks Identyfikatora 0, partycje 72057594038321152 ID, alloc jednostki identyfikator 72057594042318848 (typu "dane w wierszu"). Kolumna "Kol2" wartość jest spoza zakresu dla typu danych "real". Aktualizacji kolumny wartości prawnej.
Występują 4 wiersze w 2 strony dla obiektu "elementu Tabela1".
CHECKDB znaleziono 0 błędy alokacji i błędy spójności 1 w tabeli "Tabela1" (obiekt ID 2073058421).
CHECKDB znaleziono błędy alokacji 0 i 1 błędy spójności w bazie danych 'realdata'. Zakończono wykonanie DBCC. DBCC drukowane komunikaty o błędach, skontaktuj się z administrator systemu.
DBCC wyniki dla "Tabela2".
Msg 2570, poziom: 16, stan 3, wiersz 1
Strona (1:155), gniazdo 0 w obiekcie ID 2105058535, indeks Identyfikatora 0, partycje 72057594038452224 ID, alloc jednostki identyfikator 72057594042449920 (typu "dane w wierszu"). Kolumna "Kol2" wartość jest spoza zakresu dla danych typu "decimal". Aktualizacji kolumny wartości prawnej.
Występują 4 wiersze w 1 stron dla obiektu "Tabela2".
CHECKDB znaleziono 0 błędy alokacji i błędy spójności 1 w tabeli "Tabela2" (obiekt ID 2105058535).
CHECKDB znaleziono błędy alokacji 0 i 1 błędy spójności w bazie danych 'realdata'. Zakończono wykonanie DBCC. DBCC drukowane komunikaty o błędach, skontaktuj się z administrator systemu.
DBCC wyniki dla "Tabela3".
Msg 2570, poziom: 16, stan 3, wiersz 1
Strona (1:157), gniazdo 0 w obiekcie ID 2121058592, indeks Identyfikatora 0, partycje 72057594038517760 ID, alloc jednostki identyfikator 72057594042515456 (typu "dane w wierszu"). Kolumna "Kol2" wartość jest spoza zakresu dla typu danych "datetime". Aktualizacji kolumny wartości prawnej.
Istnieją wiersze 3 w 1 stron dla obiektu "Tabela3".
CHECKDB znaleziono 0 błędy alokacji i błędy spójności 1 w tabeli "Tabela3" (obiekt ID 2121058592).
CHECKDB znaleziono błędy alokacji 0 i 1 błędy spójności w bazie danych 'realdata'. Zakończono wykonanie DBCC. DBCC drukowane komunikaty o błędach, skontaktuj się z administrator systemu.
Dla każdego wiersza, który zawiera wartość nieprawidłowa kolumna zostanie wygenerowany błąd 2570.

Rozwiązywanie problemów czystości danych

Nie można naprawić błędy 2570 przy użyciu dowolnej z opcji naprawy DBCC. Dlatego nie ma możliwości DBCC określić wartość, jaką należy używać zamiast wartość nieprawidłowa kolumna. Tak wartość kolumny musi ręcznie zaktualizować.

Aby przeprowadzić ręczną aktualizację, trzeba znaleźć wiersz, którego dotyczy problem. Istnieją dwa sposoby, aby osiągnąć ten cel.
  • Wykonanie kwerendy przed tabelę, która zawiera nieprawidłowe wartości, aby znaleźć wiersze, które zawierają nieprawidłowe wartości.
  • Informacje o błędzie 2570 służy do identyfikowania wierszy, które mają nieprawidłową wartość.
Omówimy obie te metody szczegółowo poniżej, aby znaleźć wiersze, które mają nieprawidłowe dane przy użyciu przykładów.

Po znalezieniu prawidłowego wiersza, decyzja powinna być podejmowana na nową wartość, która ma służyć do zastępowania istniejących danych nieprawidłowy. Niniejszej decyzji muszą być wykonane bardzo starannie oparte na zakres wartości, które działają dla aplikacji a także co ma sens logiczne dla tego konkretnego wiersza danych. Dostępne są następujące opcje, które masz:
  • Jeśli znasz wartość, jaką należy go, ustaw ją na tym określoną wartość.
  • Ustawić go na wartość akceptowanego domyślnego.
  • Ustawić wartość kolumny wartości null.
  • Ustawić wartość kolumny do maksymalnej lub minimalnej wartości dla tego typu danych kolumny.
  • Jeśli uważasz, że określonego wiersza nie jest wykorzystywanie nie jest prawidłową wartością dla kolumny, można całkowicie usunąć tego wiersza.

Znajdowanie wiersze z nieprawidłowymi wartościami za pomocą kwerendy T-SQL

Typ kwerendy, które trzeba wykonać, aby znaleźć wiersze, które mają nieprawidłowe wartości zależy od typu danych kolumny, który zgłosił problem. Jeśli spojrzeć na 2570 komunikat o błędzie, można zauważyć dwóch ważnych elementów informacji, które pomogą Ci z tym. W poniższym przykładzie wartość kolumny "account_name_japan" jest poza zakresem dla typu danych "nvarchar." Możemy łatwo zidentyfikować kolumny, która ma problem, a także typ danych kolumny zaangażowanych. W efekcie po wiesz, typ danych i kolumna zaangażowanych podczas formułowania kwerendę, aby znaleźć wiersze, które zawierają nieprawidłowe wartości dla tej kolumny, wybranie kolumn niezbędne do identyfikacji tego wiersza (jako predykaty w klauzuli WHERE) dla żadnego dalszego zaktualizować lub usunąć.

Typ danych Unicode:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan 
FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0

Typ danych: 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 danych rzeczywistych:
-- 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 i Numeric typ danych:
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999
OR col1 < -9999999999.99999
Należy pamiętać, że trzeba będzie dopasować wartości oparte na precyzję i skalę, z którym zdefiniowano kolumny decimal lub numeric. W powyższym przykładzie kolumna została zdefiniowana jako Kol2 decimal(15,5).

Data, czas danych typu:
Trzeba będzie wykonać dwa innej kwerendy do identyfikowania wierszy, które zawierają nieprawidłowe wartości dla kolumny czasu daty.
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

Znajdowanie wiersze z nieprawidłową wartość za pomocą fizycznej lokalizacji:

Tej metody można użyć, jeśli nie można znaleźć wiersze odsetek za pomocą metody T-SQL, omówione powyżej. W komunikacie o błędzie 2570 drukowany jest fizyczną lokalizację wiersz, który zawiera nieprawidłową wartość. Spójrz na przykład, następujący komunikat:
Strona (1:157), gniazdo 0 w obiekcie ID 2121058592, indeks Identyfikatora 0, partycje 72057594038517760 ID, alloc jednostki identyfikator 72057594042515456 (typu "dane w wierszu"). Kolumna "Kol2" wartość jest spoza zakresu dla typu danych "datetime". Aktualizacji kolumny wartości prawnej.
W tej wiadomości, można zauważyć informacji: strona (1:157), gniazdo 0. Są to informacje potrzebne do identyfikacji wiersza. Identyfikator FileId wynosi 1, PageInFile jest 157 i Identyfikator_gniazda wynosi 0. Po uzyskaniu tych informacji należy wykonać polecenie, w następujący sposób:
DBCC TRACEON ( 3604 )
DBCC PAGE ( realdata , 1 , 157 , 3 )
To polecenie będzie wydrukować całą zawartość strony. Parametry polecenia DBCC strony są:
  • Nazwa bazy danych
  • Identyfikator FileId
  • PageInFile
  • Opcja drukowania
Po wykonaniu tego polecenia, można zauważyć danych wyjściowych, który zawiera informacje podobne do następującego formatu:
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
W wyniku wyraźnie widać wartości kolumn dla wiersza, które Cię interesują. W takim przypadku należy wiersz zapisany w gnieździe 0 strony. W komunikacie o błędzie wiadomo, że ten Kol2 jest jednym z problem. Więc możesz przejąć wartość w kolumnie Kol1 dla gniazda 0 i używać go jako predykat w klauzuli WHERE w instrukcji update lub delete instrukcja.

Ostrzeżenie Firma Microsoft zaleca użycie pierwszej metody (czyli kwerendy użyj T-SQL, aby znaleźć wymaganych informacji). Polecenie DBCC stronę tylko w ostateczności. Postarać podczas korzystania z tego polecenia w środowisku produkcyjnym. Zaleca się, aby przywrócić w produkcyjnej bazie danych na serwerze testowym, a następnie uzyskać wymagane informacje, używając strony DBCC, a następnie wykonaj aktualizacje na serwerze produkcyjnym. Jak zawsze upewnij się zachować kopię zapasową gotowy, w przypadku, gdy coś pójdzie nie tak i trzeba przywrócić wcześniejszych kopii bazy danych.

Powiązane artykuły


Aby uzyskać więcej informacji na temat instrukcji DBCC CHECKDB zobacz temat "DBCC CHECKDB (Transact-SQL)" w następującej witrynie Microsoft Developer Network (MSDN) w sieci Web:Aby uzyskać więcej informacji o znanych problemach w programie SQL Server 2000 kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
NAPRAW 900335 : operacji odzyskiwania automatyczne bazy danych dla programu SQL Server 2000 może zakończyć się niepowodzeniem, jeśli indeks zawiera typ danych ZMIENNOPRZECINKOWYCH lub typ danych rzeczywistych, a ten typ danych zawiera wartość NaN

Aby uzyskać więcej informacji dotyczących zdarzeń RPC zobacz temat "Wywołanie procedury przechowywanej (OLE DB)" w następującej witrynie MSDN w sieci Web:Aby uzyskać więcej informacji o różnych typach danych zobacz temat "Wywołanie procedury przechowywanej (OLE DB)" w następującej witrynie MSDN w sieci Web:Aby uzyskać więcej informacji na temat ruchomy punkt wartość Konwencji odwiedź następującą witrynę firmy Intel w sieci Web:Firma Microsoft udostępnia informacje kontaktowe innych firm, aby ułatwić uzyskanie niezbędnej pomocy technicznej. Niniejsze informacje kontaktowe mogą ulec zmianie bez powiadomienia. Microsoft nie gwarantuje poprawności niniejszych informacji kontaktowych innych firm.