IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

[table corrompue] integrity constraints violation


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut [table corrompue] integrity constraints violation
    Bonsoir,

    Je me permets de vous demander certains éclaircissements concernant une erreur qui est survenue hier sur ma base de données.
    Après un crash général (dont la source n'a pas encore été élucidée) des erreurs ont persisté au niveau de mysql, et plus précisément sur une table, ou le fait de faire un simple insert posait problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1062 : Duplicate key or integrity constraint violation message from server:
     "Duplicate entry 'NULL' for key 4"
    insert into BASE.`TABLE` (ID, HEURE1, DATE1, HEURE2, DATE2, ID1, ID2, CHAMP1, CHAMP2, CHAMP3) values
    (42, '19:27:00', '2007-12-11', '19:27:00', '2007-12-11', 10, 10, 'val1', 'val2', 'val3')
    Des opérations de maintenance diverses (proposées par phpmyadmin) telles que CHECK ou ANALYSE n'ont donné absolument aucun résultat (aucune erreur détectée). J'ai tenté un FLUSH qui doit permettre de mettre à jour le contenu du cache MySQL au niveau des données si j'ai bien compris.

    Suite à cette manipulation, les inserts ont refonctionné.

    J'ai essayé ensuite de combler les vides puisqu'il manquait environ 300 enregistrement avant que la table ne soit réparée. J'ai donc tenté une requête permettant 300 inserts, une fois via phpmyadmin et une fois via mysqlQueryBrowser. J'ai alors obtenu une erreur du style suivant sur les deux clients :


    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 80385 bytes) in /usr/share/phpmyadmin/libraries/sqlparser.lib.php on line 306
    Enfin, en cherchant des infos sur le net, je suis simplement tombé dans un forum ou l'explication donnée par le support technique était le suivant (concernant cette même erreur) :


    Support response: 2007/09/07 10:35
    The database server you were on was having a memory allocation problem. We have restarted the mysql daemon on the server and the problem went away. We don’t expect the problem to return.
    Ca me semble assez léger tout ça.

    Ce qui me dérange dans l'affaire, c'est que je n'ai pas pu retrouver la moindre trace de log concernant les requetes d'insertions qui ont pu avoir été faites depuis ce crash, je ne sais pas du tout quel est le risque pour que le problème se reproduise, ni son origine.

    Si vous avez des idées, des suggestions sur ce qui aurait pu se produire, elles sont les bienvenues.

    En parallèle, j'ai pu voir dans /var/log/daemon.log le log suivant :

    Dec 11 14:28:14 localhost mysqld[4226]: 071211 14:28:14 [ERROR] Got error 134 when reading table './basename/table2'
    ... qui ne concerne pas la même table, mais qui a été corrigée via la commande CHECK.

    En vous remerciant infiniment pour vos suggestions.

    Edit :
    Stats mySQL :
    Un autre thread a été ouvert contenant les infos de configuration de mysql, ça pourrait aider à trouver une explication ! Encore merci

  2. #2
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    bonjour,

    Un petit Up et une simplification de l'énoncé.
    Il nous arrive assez fréquemment d'avoir une table qui lâche inopinément, jetant des exceptions du type :
    Duplicate key or integrity constraint violation message from server: "Duplicate entry 'NULL' for key 4"
    La requête est tout à fait correcte (utilisée x fois tous les jours sans poser de pb). Tout insert dans la base est rejeté. Un update ne pose pas de problème.

    Afin de palier au problème, il suffit de faire un REPAIR TABLE. La question est : comment éviter cela, à quoi cela peut-il être dû ? Passer en InnoDB serait une solution je pense, mais qui ne m'arrange pas dans l'immédiat.
    L'ajout d'un ordre de checksum (cf CHECKSUM doc MySQL) dans les create table (ou via alter table pour la reprise) pourrait corriger le problème ?

    En vous remerciant.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Le message
    "Duplicate entry 'NULL' for key 4"
    Signifie que tu as essayé d'entrer une valeur NULL dans une clé primaire, ce qui est rigoureusement interdit.

  4. #4
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    Bonjour,

    Comme je l'ai dit au-dessus, la requete est correcte. En la repassant après un REPAIR TABLE, tout refonctionne. Je n'ai aucun champ null dans la requete, c'est vraiment mySQL qui craque. En attendant cela arrive quelques fois par an. Maintenant on sait comment réagir, mais au début c'était pas du gâteau.

    Merci d'avoir répondu

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Citation Envoyé par if_zen Voir le message
    La requête est tout à fait correcte (utilisée x fois tous les jours sans poser de pb). Tout insert dans la base est rejeté. Un update ne pose pas de problème.
    Le problème ne provient pas, à l'évidence, de la syntaxe SQL de la requête mais des données transmises à celle-ci.
    On peut imaginer que le processus client sous-jacent, qui alimente et soumet cette requête, puisse, de temps à autres, générer un flux de données incohérent, non ?

  6. #6
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Je ne suis pas certain d'avoir compris le message, mais je précise qu'il ne s'agit pas d'une preparedStatement, mais d'une requête toute bête, comme on peut en voir une dans le 1er post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO BASE.`TABLE` (ID, HEURE1, DATE1, HEURE2, DATE2, ID1, ID2, CHAMP1, CHAMP2, CHAMP3) VALUES
    (42, '19:27:00', '2007-12-11', '19:27:00', '2007-12-11', 10, 10, 'val1', 'val2', 'val3')
    Un CHECK TABLE indique bien que la table est corrompue.

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Mais cette requête est bien générée et soumise au serveur MySQL par un processus client.
    C'est peut-être la fiabilité de ce processus qui est en cause, celui-ci générant de temps en temps une requête avec une valeur NULL pour la colonne ID, par exemple.

  8. #8
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    Bonjour,

    Même en supposant que cela soit vrai, la clé incriminée est la clé 4. Or, seule ID est une clé unique (une PK), les autres champs IDxxx sont bien indexés mais ne subissent pas la contrainte de l'unicité. Donc, même en supposant que j'envoie un NULL dans la key 4 cela ne devrait pas poser de problème. Je pense que l'erreur vient du fait que la table soit corrompue et non du flux qui est envoyé à mySQL.
    Une fois la table corrompue, ce sont tous les INSERT qui sont rejetés et qui me renvoient la même erreur.

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Non, une PK ne peut être NULL. (cf le post de Cinephil)

  10. #10
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 317
    Points
    317
    Par défaut
    Comme je viens de le dire, KEY 4 n'est pas une PK.

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/04/2011, 17h03
  2. Réponses: 3
    Dernier message: 04/03/2011, 09h30
  3. Réponses: 7
    Dernier message: 29/11/2010, 17h34
  4. Réponses: 1
    Dernier message: 26/11/2010, 11h34
  5. [1.x] data-load après datadump : Integrity constraint violation
    Par rastaferraille dans le forum Symfony
    Réponses: 8
    Dernier message: 07/05/2010, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo