Problembehandlung bei DBCC Fehler 2570 in SQL Server 2005 und höher

Einführung

Dieser Artikel beschreibt SQL Server Fehler 2570 Ursachen des Fehlers und wie das Problem behoben.

Weitere Informationen

DATA_PURITY Überprüfung

In SQL Server 2005 wurde eine neue Option DATA_PURITY, um die Befehle DBCC CHECKDB und DBCC CHECKTABLE hinzugefügt. Beim Ausführen eines Befehls DBCC CHECKDB oder DBCC CHECKTABLE Option aktiviert führen der Befehl "Daten Reinheit" Prüfung auf jeder Spalte in allen Zeilen der Tabelle oder Tabellen in der Datenbank. Diese neue werden ausgeführt, um sicherzustellen, dass die Werte in den Spalten gespeicherten gültig sind (d. h., dass die Werte nicht außerhalb des Bereichs für die Domäne zugeordnet den Datentyp der Spalte). Die Art der Validierung hängt der Datentyp der Spalte. Folgende nicht erschöpfende Liste enthält Beispiele:
Datentyp der SpalteArt der Validierung durchgeführt
Unicode-ZeichenDie Länge sollte ein Vielfaches von 2 sein.
DateTimeDas Feld sollte zwischen 1 Jan. 1753 und dem 31. Dezember 9999. Feld muss vor '11:59:59:999 Uhr'.
Real und FloatÜberprüft, ob ungültige Gleitkommawerte wie SNAN, QNAN, NINF, ND, PD, PINF.
Nicht alle Datentypen werden überprüft die Gültigkeit der Spaltendaten. Nur ist es möglich, einen gespeicherten Wert, die außerhalb des Bereichs werden überprüft. Z. B. Tinyint -Datentyp hat keinen gültigen Bereich von 0 bis 255 werden in ein einzelnes Byte (die nur Werte zwischen 0 und 255 gespeichert werden kann) und so Überprüfen der Wert ist nicht erforderlich.

Daten Reinheit Überprüfung wird werden nicht automatisch für alle Datenbanken aktiviert. Die Kontrollen werden von mehreren Faktoren:
  • Kontrollen für Datenbanken in SQL Server 2005 oder höher erstellt wurden standardmäßig aktiviert und können nicht deaktiviert werden, damit die Verwendung der DATA_PURITY-Option beim Ausführen eines Befehls DBCC CHECKDB oder DBCC CHECKTABLE irrelevant ist.
  • In früheren Versionen von SQL Server, SQL Server 2000 und SQL Server 7.0 auf SQL Server 2005 aktualisiert Versionen erstellten Datenbanken sind Kontrollen standardmäßig nicht aktiviert. Kontrollen durchgeführt werden müssen Sie die Option DATA_PURITY den Befehl DBCC CHECKDB oder DBCC CHECKTABLE festlegen. Dies führt zu zwei Dinge:
    • DBCC-Befehls beendet und meldet, dass die Datenbank sauber, einschließlich aller Daten Reinheit. Dies wird in der Datenbank-Kopfzeile aufgezeichnet. Alle nachfolgende DBCC CHECKDB oder DBCC CHECKTABLE Ausführen von Befehlen werden diese Informationen und führt automatisch Daten Reinheit überprüft, wie Datenbanken auf SQL Server 2005 erstellt. Nach einer "sauber" sind Daten Reinheit überprüft also immer ausgeführt.
    • DBCC-Befehl beendet, aber meldet Probleme über Dateninkonsistenz. Ist dies der Fall, Sie entfernen die Inkonsistenzen bereinigt haben und versuchen, den DBCC-Befehl erneut ausführen. Sie müssen die DATA_PURITY-Option für den DBCC-Befehl angeben, bis die Datenbank sauber gemeldet wird.
  • Beim Ausführen des Befehls DBCC CHECKDB oder DBCC CHECKTABLE Option PHYSICAL_ONLY angegeben ist, werden Daten Reinheit Kontrollen nicht durchgeführt.

Problembeschreibung

Daten ungültig oder außerhalb des Bereichs wurde möglicherweise aus folgenden Gründen in der SQL Server-Datenbank in früheren Versionen gespeichert:
  • Ungültige Daten war in der Quelle mit Bulk Insert Methoden wie das Dienstprogramm Bcp vorhanden.
  • Ungültige Daten wurde durch RPC-Ereignisaufrufe an SQL Server übergeben.
  • Andere mögliche Ursachen für beschädigte Links physischen Daten den Spaltenwert in einem ungültigen Zustand.
Haben Sie ungültige Daten in einer Spalte einer Tabelle können Sie je nach Vorgang Probleme, die ungültigen Daten ausgeführt wird. Jedoch kann es auch kein Problem wird angezeigt, und die ungültigen Daten nicht entdeckt, bis ein Befehl DBCC CHECKDB oder DBCC CHECKTABLE auf SQL Server 2005 oder höher ausgeführt werden.

Einige der Symptome aufgrund ungültiger Daten bemerken enthalten (jedoch nicht auf):
  • Access Verstöße oder andere Arten von Ausnahmen während der Ausführung von Abfragen in der betreffenden Spalte.
  • Falsche Ergebnisse von Abfragen in der betroffenen Spalte zurückgegeben.
  • Fehler oder Probleme bei der Statistik für die betroffenen Spalten erstellt werden.
  • Fehlermeldungen wie die folgenden:
    Msg 9100 Ebene 23 State 2 Zeile 1 der Index ist möglicherweise beschädigt. Führen Sie DBCC CHECKDB aus.

DATA_PURITY-Problembericht

Beim Ausführen einer DBCC CHECKDB oder DBCC CHECKTABLE Befehl mit der Option DATA_PURITY (oder Daten Reinheit überprüft automatisch ausgeführt werden) und ungültige Daten in den Tabellen überprüft, indem die DBCC-Befehle vorhanden, DBCC-Ausgabe enthält weitere Nachrichten, die Probleme mit den Daten hinweisen. Nachfolgend einige Beispiele für Fehlermeldungen, die Reinheit Probleme hinweisen:
DBCC-Ergebnis für "Account_history".
Msg 2570, Ebene 16, Status 1 Zeile 2
Seite (1:1073) Steckplatz 33 in Objekt-ID 1977058079 index ID 0, Partition ID 129568478265344, Alloc Einheiten ID 129568478265344 (Typ "Zeilendaten"). Spalte liegt "Account_name_japan" außerhalb des Bereichs für Typ "Nvarchar". Spalte auf einen gültigen Wert.

Msg 2570, Ebene 16, Status 1 Zeile 2
Seite (1:1156) Steckplatz 120 in Objekt-ID 1977058079 index ID 0, Partition ID 129568478265344, Alloc Einheiten ID 129568478265344 (Typ "Zeilendaten"). Spalte liegt "Account_name_japan" außerhalb des Bereichs für Typ "Nvarchar". Spalte auf einen gültigen Wert.
Es sind 153137 Zeilen in 1080 Seiten für das Objekt "Account_history".
CHECKDB hat 0 Reservierungsfehler und 338 Konsistenzfehler in der Tabelle "Account_history" (Objekt-ID 1977058079) gefunden.
CHECKDB hat 0 Reservierungsfehler und 338 Konsistenzfehler in Datenbank 'BadUnicodeData' gefunden.
DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben, wenden Sie sich an Ihren Systemadministrator.
DBCC-Ergebnis für "Tabelle1".
Msg 2570, Ebene 16, State 3, Position 1
Seite (1:154), Steckplatz 0 in Objekt-ID 2073058421, index ID 0, Partition ID 72057594038321152, Alloc Einheiten ID 72057594042318848 (Typ "Zeilendaten"). Spalte liegt "SP2" bei "echten". Spalte auf einen gültigen Wert.
2 Seiten für Objekt "table1" sind 4 Zeilen vorhanden.
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in der Tabelle "Tabelle1" (Objekt-ID 2073058421) gefunden.
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in 'Realdata'-Datenbank gefunden. DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben, wenden Sie sich an Ihren Systemadministrator.
DBCC-Ergebnis für 'Tabelle2'.
Msg 2570, Ebene 16, State 3, Position 1
Seite (1:155), Steckplatz 0 in Objekt-ID 2105058535, index ID 0, Partition ID 72057594038452224, Alloc Einheiten ID 72057594042449920 (Typ "Zeilendaten"). Spalte liegt "SP2" außerhalb des Bereichs für Typ "decimal". Spalte auf einen gültigen Wert.
Es sind 4 Zeilen in 1 Seiten für das Objekt "Tabelle2".
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in der Tabelle "Tabelle2" (Objekt-ID 2105058535) gefunden.
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in 'Realdata'-Datenbank gefunden. DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben, wenden Sie sich an Ihren Systemadministrator.
DBCC-Ergebnis für "Tabelle3".
Msg 2570, Ebene 16, State 3, Position 1
Seite (1:157), Steckplatz 0 in Objekt-ID 2121058592, index ID 0, Partition ID 72057594038517760, Alloc Einheiten ID 72057594042515456 (Typ "Zeilendaten"). Spalte liegt "SP2" außerhalb des Bereichs für Typ "Datetime". Spalte auf einen gültigen Wert.
Es gibt 3 Zeilen in 1 Seiten für das Objekt "Tabelle3".
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in Tabelle "Tabelle3" (Objekt-ID 2121058592) gefunden.
CHECKDB hat 0 Reservierungsfehler und 1 Konsistenzfehler in 'Realdata'-Datenbank gefunden. DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben, wenden Sie sich an Ihren Systemadministrator.
Für jede Zeile, die einen Ungültiger Spaltenwert enthält, wird ein Fehler 2570 generiert.

Beheben das Problem Reinheit

2570 Fehler können unter Verwendung der Reparaturoptionen von DBCC repariert werden. Deswegen nicht DBCC bestimmen, welcher Wert ersetzen Ungültiger Spaltenwert verwendet werden sollen. Daher muss der Spaltenwert manuell aktualisiert werden.

Um ein manuelles Update auszuführen, müssen Sie die Zeile zu finden, die das Problem. Es gibt zwei Arten dazu.
  • Ausführen einer Abfrage für die Tabelle mit den ungültigen Werten um Zeilen suchen, die ungültige Werte enthalten.
  • Anhand der Informationen des Fehlers 2570 Zeilen identifizieren einen ungültigen Wert.
Beide Methoden unten ausführlich erörtert Beispielen suchen die Zeilen, die ungültige Daten enthalten.

Wenn Sie die richtige Zeile finden, muss eine Entscheidung auf den neuen Wert vorgenommen werden, das Ersetzen vorhandenen ungültigen Daten verwendet wird. Diese Entscheidung wurde sorgfältig basierend auf den Wertebereich vorgenommen werden, die für die Anwendung und Sinn für die betreffende Zeile der Daten macht. Die Auswahl der Optionen sind:
  • Wenn Sie, welchen Wert wissen sollte es sein und den spezifischen Wert festlegen.
  • Auf eine akzeptable Standardwert festgelegt.
  • Setzen Sie den Spaltenwert auf NULL.
  • Legen Sie den Spaltenwert auf den maximalen oder minimalen Wert für diesen Datentyp der Spalte.
  • Wenn Sie glauben, dass die betreffende Zeile nicht Verwendung ohne einen gültigen Wert für die Spalte ist, können Sie diese Zeile ganz löschen.

Suchen nach Zeilen mit ungültigen Werten mit T-SQL-Abfragen

Typ der Abfrage, die Sie ausführen, um Zeilen zu finden, die ungültige Werte hängt der Datentyp der Spalte, die ein Problem gemeldet. Wenn Sie die Fehlermeldung 2570 betrachten, sehen Sie zwei wichtige Punkte, die Ihnen dabei helfen. Im folgenden Beispiel wird die Spalte "Account_name_japan" außerhalb des Bereichs für Typ "Nvarchar". Wir können die Spalte identifizieren, die das Problem sowie der Datentyp der Spalte an. Daher erforderlich, wenn Sie den Datentyp und betroffene Spalte Sie die Abfrage formulieren, um die Zeilen zu finden, die ungültige Werte für diese Spalte enthalten, Auswählen der Spalten zu Zeile (als Prädikate in einer WHERE-Klausel) für weitere aktualisieren oder löschen.

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


Float-Datentyp:
-- 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-Datentyp:
-- 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 und Numeric-Datentyp:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Denken Sie daran, die Werte basierend auf der Genauigkeit und Dezimalstellenanzahl mit dem decimal oder numerische-Spalte definiert haben müssen. Im obigen Beispiel wurde die Spalte als col2 decimal(15,5) definiert.

Datum Uhrzeit Typ:
Sie müssen zum Ausführen von zwei anderer Abfragen Zeilen identifizieren, die ungültige Werte für Datum-Zeit-Spalte enthalten.
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

Suchen nach Zeilen mit ungültigen Wert physischen Speicherorts:

Diese Methode können Sie die Zeilen mit der oben beschriebenen T-SQL-Methode finden können. In der Fehlermeldung 2570 wird der Standort der Zeile, die den ungültigen Wert enthält gedruckt. Betrachten Sie beispielsweise die folgende Meldung angezeigt:
Seite (1:157), Steckplatz 0 in Objekt-ID 2121058592, index ID 0, Partition ID 72057594038517760, Alloc Einheiten ID 72057594042515456 (Typ "Zeilendaten"). Spalte liegt "SP2" außerhalb des Bereichs für Typ "Datetime". Spalte auf einen gültigen Wert.
Hierbei Beachten Sie die Angaben: Seite (1:157) Slot 0. Dies ist die Informationen, die Zeile zu identifizieren. "FileID" ist 1 und die Slot-ID 0 wird der PageInFile ist 157. Haben Sie diese Informationen, müssen Sie den Befehl wie folgt ausführen:
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Mit diesem Befehl wird der gesamte Inhalt einer Seite drucken. Parameter für den Befehl DBCC PAGE sind:
  • Name der Datenbank
  • "FileID"
  • PageInFile
  • Option zur
Nachdem Sie diesen Befehl ausführen, sehen Sie Ausgabe, die Informationen wie das folgende 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 = 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
In dieser Ausgabe sehen Sie deutlich die Spaltenwerte für die Zeile von Interesse. In diesem Fall benötigen Sie die Zeile in Steckplatz 0 der Seite gespeichert. Von der Fehlermeldung wissen Sie, dass SP2 das Problem ist. Sie können so nehmen Sie den Wert von SP1 für Steckplatz 0 und verwenden als das Prädikat in der WHERE-Klausel der UPDATEAnweisung oder delete-Anweisung.

Warnung Wir empfehlen, die erste Methode (d. h. mit T-SQL-Abfragen erforderlichen Informationen). Verwenden Sie den Befehl DBCC PAGE nur als letzten Ausweg. Übernehmen Sie sorgfältig, während dieser Befehl in einer. Es empfiehlt sich, alle erforderlichen Informationen mit DBCC PAGE, Wiederherstellen der Produktionsdatenbank auf einem Testserver und führen Sie dann die Updates auf dem Produktionsserver. Achten Sie wie immer eine Sicherungskopie bereit halten, falls etwas schief geht und Sie eine frühere Kopie der Datenbank wiederherstellen müssen.

Referenzen

Weitere Informationen über die Anweisung DBCC CHECKDB finden Sie "DBCC CHECKDB (Transact-SQL)" auf der folgenden Microsoft Developer Network (MSDN)-Website:Weitere Informationen zu bekannten Problemen in SQL Server 2000 finden Sie im folgenden Artikel der Microsoft Knowledge Base:
900335 beheben: automatische Datenbank-Wiederherstellungsvorgang die SQL Server 2000 möglicherweise fehl, wenn ein Index einen Datentyp FLOAT oder REAL-Datentyp enthält, der Datentyp NaN-Wert

Weitere Informationen zur RPC-Ereignisse finden Sie im Thema "Aufrufen einer gespeicherten Prozedur (OLE DB)" auf der folgenden MSDN-Website:Weitere Informationen über die verschiedenen Datentypen finden Sie im Thema "Aufrufen einer gespeicherten Prozedur (OLE DB)" auf der folgenden MSDN-Website:Weitere Informationen zu floating Point Wert Konventionen finden Sie auf der folgenden Intel-Website:Microsoft stellt Kontaktinformationen von Drittanbietern zur Verfügung, damit Sie technischen Support erhalten können. Diese Kontaktinformationen können sich ohne vorherige Ankündigung ändern. Microsoft garantiert nicht die Richtigkeit dieser Kontaktinformationen von Drittanbietern.
Eigenschaften

Artikelnummer: 923247 – Letzte Überarbeitung: 14.01.2017 – Revision: 1

Feedback