Résolution de l'erreur DBCC 2570 dans SQL Server 2005 et versions ultérieures

Traductions disponibles Traductions disponibles
Numéro d'article: 923247 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

INTRODUCTION

Cet article décrit l'erreur SQL Server 2570, quelle est la cause l'erreur et comment résoudre le problème.

Plus d'informations

Contrôles DATA_PURITY

Dans SQL Server 2005, une nouvelle option, DATA_PURITY, a été ajoutée à les commandes DBCC CHECKDB et DBCC CHECKTABLE. Lorsque vous exécutez un DBCC CHECKDB ou la commande DBCC CHECKTABLE avec cette option est activée, la commande va effectuer. les validations de « pureté de données » sur chaque valeur de colonne dans toutes les lignes de la table ou tables dans la base de données. Ces nouveaux contrôles sont effectués pour s'assurer que le les valeurs stockées dans les colonnes sont valides (c'est-à-dire que les valeurs ne sont pas hors des limites pour le domaine associé au type de données de cette colonne). Le nature de la validation exécutée dépend du type de données de la colonne. Le suivant une liste non exhaustive donne quelques exemples :
Réduire ce tableauAgrandir ce tableau
Type de données de colonneType de validation de données effectuée
Caractère UnicodeLa longueur des données doit être un multiple de 2.
DateTimeLe champ jours doit être entre le 1 janvier 1753 et le 31 décembre 9999. Le champ heure doit être antérieur à '11:59:59:999 PM'.
Real et FloatVérifie l'existence de non valide valeurs à virgule flottante comme SNAN, QNAN, NINF, ND, PD, PINF.
Pas tous les types de données sont vérifiées pour la validité de la colonne données. Seules celles où il est possible d'avoir une valeur stockée qui est en dehors de plage sont vérifiées. Par exemple, le type de données tinyint a une plage valide comprise entre 0 et 255 et est stocké dans un octet (qui peut stocker uniquement les valeurs comprises entre 0 et 255), par conséquent, en vérifiant la valeur n'est pas nécessaire.

Les contrôles de validation de pureté de données ne sont pas activés automatiquement pour toutes les bases de données. Les contrôles sont activés en fonction de plusieurs facteurs suivants :
  • Pour les bases de données créées dans SQL Server 2005 et versions ultérieures, ces contrôles sont activés par défaut et ne peut pas être désactivés, c'est pourquoi l'utilisation de l'option DATA_PURITY lors de l'exécution d'une commande DBCC CHECKDB ou DBCC CHECKTABLE est sans importance.
  • Pour les bases de données qui ont été créés dans les versions antérieures de SQL Serveur, tel que SQL Server 2000 SQL Server 7.0 et versions mises à niveau vers SQL Server 2005, ces contrôles ne sont pas activés par défaut. Pour que ces vérifications pour être exécutée, vous devez spécifier l'option DATA_PURITY dans l'instruction DBCC CHECKDB ou Commande DBCC CHECKTABLE. Deux choses peuvent se produire :
    • La commande DBCC se termine et signale que la base de données est propre, y compris tous les contrôles de pureté des données. Ce fait est enregistré dans le en-tête de la base de données. Toutes les commandes DBCC CHECKDB ou DBCC CHECKTABLE ultérieures exécutions remarquerez cette information et effectuent automatiquement les données pureté des vérifications, que se passerait-il pour les bases de données créées dans SQL Server 2005. Dans Autrement dit, une fois qu'une base de données est connu pour être « propre », les contrôles de pureté des données sont toujours réalisée.
    • La commande DBCC se termine, mais signale des problèmes incohérence des données. Si c'est le cas, vous devrez nettoyer la base de données supprimer les incohérences, puis essayez à nouveau d'exécuter la commande DBCC. Vous devrez spécifier l'option DATA_PURITY pour la commande DBCC jusqu'à ce que le base de données est signalée comme sain.
  • Si l'option PHYSICAL_ONLY est spécifiée lors de la DBCC Commande CHECKDB ou DBCC CHECKTABLE est exécutée, les contrôles de pureté des données ne sont pas effectuée.

SYMPTÔMES

Données non valides ou non valides ont été stockées dans le SQL Base de données du serveur dans les versions antérieures pour les raisons suivantes :
  • Était présentes dans la source lors de l'utilisation en bloc des données valides Insérer des méthodes, telles que l'utilitaire bcp.
  • Données non valides a été passées par l'intermédiaire d'appels RPC événements à SQL Server.
  • D'éventuels autres causes de la corruption des données physiques à gauche la valeur de colonne dans un état non valide.
Si vous avez des données non valides dans une colonne d'une table, vous pouvez rencontrer des problèmes selon le type d'opération est effectuée sur les données non valides. Toutefois, il est également possible qu'aucun problème n'apparaît, et les données non valides ne seront pas découverts jusqu'à ce que vous exécutez une commande DBCC CHECKDB ou DBCC CHECKTABLE sur SQL Server 2005 et versions ultérieures.

Certains symptômes vous remarquerez peut-être due à la présence de données non valides incluent (mais ne sont pas limitées vers) :
  • Violations d'accès ou d'autres types d'exceptions tout en exécute des requêtes sur la colonne concernée.
  • Des résultats incorrects renvoyés par les requêtes exécutées sur le colonne concernée.
  • Erreurs ou problèmes de statistiques sont construites par rapport à les colonnes concernées.
  • Messages d'erreur semblable à celui-ci :
    Msg 9100, Niveau 23, état 2, ligne 1 Possible index endommagé détecté. Exécutez DBCC CHECKDB.

Rapport de problème DATA_PURITY

Lorsque vous exécutez une commande DBCC CHECKDB ou DBCC CHECKTABLE avec l'option DATA_PURITY activé (ou la pureté de données exécutent des vérifications automatiquement), et il existe des données non valides dans les tables vérifiées par la DBCC commandes, la sortie DBCC inclut les messages supplémentaires qui indiquent la problèmes avec les données. Certains messages d'erreur exemple qui indiquent la pureté de données des problèmes sont présentées ci-dessous :
Résultats DBCC pour « account_history ».
Msg 2570, niveau 16, état 2, ligne 1
Page (1:1073), slot 33 dans ID 1977058079, index ID 0, partition ID 129568478265344, objet unité d'allocation 129568478265344 ID (type « données en ligne »). Colonne « account_name_japan » valeur est hors limites pour le type de données « nvarchar ». Mettre à jour la colonne à une valeur légale.
Msg 2570, niveau 16, état 2, ligne 1
Page (1:1156), slot 120 dans l'objet ID 1977058079, index ID 0, partition 129568478265344 ID, ID d'unité alloc 129568478265344 (de type « En-ligne données »). Valeur de la colonne « account_name_japan » est sorti de la plage pour le type de données « nvarchar ». Mettre à jour la colonne à une valeur légale.
Il sont 153137 lignes dans les pages de 1080 pour objet « account_history ».
CHECKDB trouvé 0 erreurs d'allocation et 338 erreurs de cohérence dans la table « account_history » (objet ID 1977058079).
CHECKDB trouvé 338 et erreurs d'allocation de 0 erreurs de cohérence dans la base de données « BadUnicodeData ».
Exécution de DBCC terminée. Si DBCC vous a adressé des messages d'erreur, contactez votre administrateur système.
Résultats DBCC pour « table1 ».
Msg 2570, niveau 16, État 3, ligne 1
Page (1:154), slot 0 dans l'objet 2073058421 ID, ID d'index 72057594038321152 ID, ID 72057594042318848 (type d'unité d'allocation de 0, partition « Données en ligne"). Valeur de la colonne « col2 » est hors limites pour le type de données « réel ». Mettre à jour la colonne à une valeur légale.
Il y a 4 lignes de 2 pages pour l'objet « table1 ».
CHECKDB trouvé des erreurs d'allocation de 0 et les erreurs de 1 cohérence dans table « table1 » (object ID 2073058421).
CHECKDB a trouvé 0 erreurs d'allocation et les erreurs de 1 cohérence dans la base de données « realdata ». Exécution de DBCC terminée. If Erreur DBCC vous a adressé des messages, contactez votre administrateur système.
Résultats DBCC pour « table2 ».
Msg 2570, niveau 16, État 3, ligne 1
Page (1:155), slot 0 dans l'objet 2105058535 ID, ID d'index 72057594038452224 ID, ID 72057594042449920 (type d'unité d'allocation de 0, partition « Données en ligne"). Valeur de la colonne « col2 » est hors limites pour le type de données « décimal ». Mettre à jour la colonne à une valeur légale.
Il y a 4 lignes dans les pages 1 objet « table2 ».
CHECKDB trouvé des erreurs d'allocation de 0 et les erreurs de 1 cohérence dans table « table2 » (object ID 2105058535).
CHECKDB a trouvé 0 erreurs d'allocation et les erreurs de 1 cohérence dans la base de données « realdata ». Exécution de DBCC terminée. If Erreur DBCC vous a adressé des messages, contactez votre administrateur système.
Résultats DBCC pour « Tableau3 ».
Msg 2570, niveau 16, État 3, ligne 1
Page (1:157), slot 0 dans l'objet 2121058592 ID, ID d'index 72057594038517760 ID, ID 72057594042515456 (type d'unité d'allocation de 0, partition « Données en ligne"). Valeur de la colonne « col2 » est hors limites pour le type de données « datetime ». Mettre à jour la colonne à une valeur légale.
Il existe 3 lignes dans les pages 1 objet « Tableau3 ».
CHECKDB trouvé des erreurs d'allocation de 0 et les erreurs de 1 cohérence dans table « Tableau3 » (object ID 2121058592).
CHECKDB a trouvé 0 erreurs d'allocation et les erreurs de 1 cohérence dans la base de données « realdata ». Exécution de DBCC terminée. If Erreur DBCC vous a adressé des messages, contactez votre administrateur système.
Pour chaque ligne contient une valeur de colonne non valide, une erreur 2570 est généré.

Résolution du problème de pureté de données

Les erreurs 2570 ne peut pas être réparés à l'aide de la réparation DBCC Options. C'est parce qu'il est impossible pour DBCC déterminer la valeur doit utilisé pour remplacer la valeur de colonne non valide. Par conséquent, la valeur de colonne doit être mise à jour manuellement.

Pour effectuer une mise à jour manuelle, vous disposez rechercher la ligne qui a le problème. Il existe deux façons de procéder.
  • Exécuter une requête sur la table qui contient le valeurs non valides pour rechercher les lignes qui contiennent les valeurs non valides.
  • Utilisez les informations à partir de l'erreur 2570 pour identifier les lignes qui ont une valeur non valide.
Nous allons étudier ces deux méthodes en détail ci-dessous, à l'aide exemples pour rechercher les lignes contenant des données non valides.

Une fois que vous trouvez le ligne correcte, une décision doit être établie sur la nouvelle valeur qui sera utilisée pour remplacer les données existantes non valides. Cette décision doit être effectuée avec prudence en fonction de la plage de valeurs de travail pour l'application, ainsi que les sens logique pour cette ligne particulière de données. Les choix sont :
  • Si vous savez quelle valeur il convient, définissez-la à qui valeur spécifique.
  • Attribuez-lui une valeur par défaut acceptables.
  • Définissez la valeur NULL.
  • Définissez la valeur de colonne à la valeur maximale ou minimale pour ce type de données de la colonne.
  • Si vous pensez que la ligne spécifique n'est pas du tout usage sans une valeur valide pour la colonne, vous pouvez supprimer cette ligne entièrement.

Recherche de lignes avec des valeurs non valides à l'aide de requêtes T-SQL

Le type de requête que vous avez besoin d'exécuter pour rechercher les lignes qui ont valeurs non valides varie selon le type de données de la colonne qui a signalé un problème. Si vous examinez le message d'erreur 2570, vous remarquerez deux éléments importants de informations qui vous aidera à cela. Dans l'exemple suivant, la colonne valeur de « account_name_japan » est hors limites pour le type de données nvarchar. » » Nous pouvez identifier facilement la colonne qui a le problème ainsi que le type de données de la colonne impliquée. Par conséquent, une fois vous connaissez les données de type et la colonne concernée, vous peut formuler la requête pour rechercher les lignes qui contiennent des valeurs non valides pour cette colonne, sélectionnez les colonnes nécessaires pour identifier cette ligne (comme les prédicats dans une clause WHERE) pour tout autre update ou delete.

Type de données Unicode :
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan 
FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0

Type de données 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)

Type de données 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 et Numeric type de données :
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999
N'oubliez pas que vous devrez ajuster les valeurs en fonction de la précision et échelle avec lequel vous avez défini la colonne decimal ou numeric. Dans l'exemple ci-dessus, la colonne a été définie comme col2 decimal(15,5).

Date des données au moment du type :
Vous devrez exécuter deux requêtes différentes pour identifier les lignes qui contiennent des valeurs non valides pour la colonne heure de date.
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

Recherche de lignes avec une valeur non valide à l'aide de l'emplacement physique :

Vous pouvez utiliser cette méthode si vous ne parvenez pas à trouver les lignes de intérêt en utilisant la méthode de T-SQL décrite ci-dessus. Dans le message d'erreur 2570 le emplacement physique de la ligne qui contient la valeur non valide est imprimé. Pour exemple, regardez le message suivant :
Page (1:157), Slot 0 dans l'objet ID 2121058592, index ID 0, partition ID 72057594038517760, unité d'allocation 72057594042515456 ID (type « données en ligne »). Valeur de la colonne « col2 » est hors des limites pour le type de données « datetime ». Mettre à jour la colonne à un service juridique valeur.
Dans ce message, vous remarquerez les informations : Page (1:157), emplacement 0. Voici les informations nécessaires identifier la ligne. L'identificateur est 1, le PageInFile est 157, et la SlotId est 0. Une fois que vous avez cette information, vous devra exécuter la commande, comme suit :
DBCC TRACEON ( 3604 )
DBCC PAGE ( realdata , 1 , 157 , 3 )
Cette commande va imprimer l'intégralité du contenu d'une page. Paramètres pour la Commande DBCC PAGE sont les suivants :
  • nom de la base de données
  • FileId
  • PageInFile
  • option d'impression
Une fois que vous exécutez la commande suivante, vous remarquerez que de sortie contient des informations semblables au format suivant :
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 
Dans cette sortie, vous pouvez voir clairement les valeurs de colonne pour la ligne qui vous intéressent. Dans ce cas, vous besoin de la ligne stockée dans l'emplacement 0 de la page. Le message d'erreur, vous savez Ce col2 est celui avec le problème. Donc vous pouvez prendre la valeur de col1 pour Slot 0 et l'utiliser comme le prédicat figurant dans la clause WHERE de l'instruction update ou l'instruction delete.

Avertissement Nous vous conseillons d'utiliser la première méthode (autrement dit, utilisez T-SQL requêtes pour rechercher les informations requises). Utilisez la commande de la PAGE DBCC uniquement comme une dernier recours. Prendre le plus grand soin pendant que vous utilisez cette commande dans une production environnement. Il est conseillé de restaurer la base de données de production sur un test serveur, puis obtenir toutes les informations requises à l'aide de DBCC PAGE et effectuez ensuite la mises à jour sur le serveur de production. Comme toujours, assurez-vous de conserver une sauvegarde prêt dans le cas où quelque chose se passe mal et vous auriez besoin de revenir à une copie antérieure de la base de données.

Références

Pour plus d'informations sur l'instruction DBCC CHECKDB, consultez la rubrique « DBCC CHECKDB (Transact-SQL) » sur MSDN Microsoft Developer Site Web de Network (MSDN) :
http://msdn2.Microsoft.com/en-us/library/ms176064.aspx
Pour plus d'informations sur connus problèmes de SQL Server 2000, cliquez sur le numéro ci-dessous pour afficher les article de la Base de connaissances Microsoft :
900335CORRECTIF : L'opération de récupération automatique de la base de données SQL Server 2000 peut échouer si un index contient un type de données FLOAT ou un type de données REAL, et ce type de données contient une valeur NaN
Pour plus d'informations sur les événements RPC, consultez la Rubrique « Appel d'une procédure stockée (OLE DB) » sur le site Web MSDN suivant :
http://msdn2.Microsoft.com/en-us/library/aa198358 (SQL.80) .aspx
Pour plus d'informations sur les différents types de données, consultez le Rubrique « Appel d'une procédure stockée (OLE DB) » sur le site Web MSDN suivant :
http://msdn2.Microsoft.com/en-us/library/ms187752.aspx
Pour plus d'informations sur les conventions de valeur de point flottant, visitez le site le site Web Intel suivant :
http://www.Intel.com/design/PentiumII/Manuals/243191.htm
Microsoft Fournit des informations de contact de sociétés tierces pour vous aider à trouver un support technique. Ces coordonnées peuvent changer sans préavis. N'est pas le cas de Microsoft garantir l'exactitude des informations de contact de ce tiers.

Propriétés

Numéro d'article: 923247 - Dernière mise à jour: jeudi 22 mars 2012 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • 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
Mots-clés : 
kbtshoot kbexpertiseadvanced kbsql2005engine kbinfo kbmt KB923247 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 923247
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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