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

Administration MySQL Discussion :

Detection d'erreur sur LOAD DATA LOCAL INFILE


Sujet :

Administration MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Points : 86
    Points
    86
    Par défaut Detection d'erreur sur LOAD DATA LOCAL INFILE
    Bonjour à tous,

    Mon contexte est le suivant :
    • Mysql 5.5 sur Linux RedHat 5 64bit
    • Une table partitionnée à charger
    • Procédure réalisée sur shell Bash


    Le script SQL de création de cette table est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE `maTable` (
      `idkey` MEDIUMINT(8) UNSIGNED NOT NULL,
      `info1` TINYINT(3) UNSIGNED NOT NULL,
      `info2` TINYINT(3) UNSIGNED NOT NULL,
    ) ENGINE=MYISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci PACK_KEYS=1
    /*!50100 PARTITION BY RANGE (idKey)
    (PARTITION P1 VALUES LESS THAN (3798460) ENGINE = MyISAM,
     PARTITION P2 VALUES LESS THAN (3798700) ENGINE = MyISAM,
     PARTITION P3 VALUES LESS THAN (3798940) ENGINE = MyISAM,
     ...)
    Ma procédure de chargement est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    echo "LOAD DATA LOCAL INFILE '/tmp/monFichier.txt' 
    INTO TABLE matable FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n' 
    (idKey, info1, info2);SHOW WARNINGS; SHOW ERRORS;" | mysql -bsN maBase
    [ $? -ne 0 ] && echo "Je pleure" && exit 1
    Mes constats/problèmes sont les suivants :
    • 1er cas : Lorsque la partition n'existe pas, les données ne sont pas chargées (juste que là tout va bien ). Par contre, le code d'erreur de retour $? n'est pas différent de zéro .. Même pas un seul petit warning n'est émis...
    • 2ème cas :J'ai fait une tentative de chargement uniquement sur le champ idKey (je vous rappèle que les champs de ma table sont NOT NULL) avec des valeurs cohérentes par rapport aux partitions disponibles, les lignes sont chargées avec les champs info1 et info2 à zéro !!! ... Je m'attendais à une sortie en erreur me signalant que ces deux champs sont obligatoires ... et ben non... Le code d'erreur est tjs zéro. Les warnings sont les suivants (cela devrait être des erreurs !)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      Level   Code    Message
      Warning 1364    Field 'info1' doesn't have a default value
      Warning 1364    Field 'info2' doesn't have a default value
    • 3ème cas (plus une remarque) : en équivalent INSERT, l'erreur de partition est bien détectée... malheureusement, j'ai des millions de lignes qui m'attendent... cela serait un peu long...


    Mes questions sont les suivantes :
    • Est-il possible de demander explicitement (par un paramètre de la cmd 'mysql' par exemple) un code retour sensible à tout incident ?
    • non... ne me dites pas qu'il faut que j'analyse le contenu de mes données à charger pour identifier la (ou les partitions) que je dois contrôler après chargement (pour les comparer avec la photo avant chargement)... Non ne me dites pas cela
    • non... ne me dites pas qu'il faut charger dans une temporary table (non partitionnée) puis faire un INSERT SELECT dans la table cible... Pitié, ne me le dites pas ...


    Merci d'avance de votre retour

  2. #2
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 687
    Points : 2 014
    Points
    2 014
    Par défaut
    Je n'ai pas reproduit le problème mais suis sur des versions plus récentes (Centos 6 & Percona Server 5.5):

    Il peut arriver que le fait de mettre un pipe "avale" une erreur, comme expliqué ici, mais ce ne semble pas être ton cas.
    Tu peux essayer avec mysql -e 'LOAD DATA LOCAL INFILE '/tmp/monFichier.txt'
    INTO TABLE matable FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'
    (idKey, info1, info2);SHOW WARNINGS; SHOW ERRORS;'

    Il est également possible que le client mysql retourne 0 pour les show warnings et Show Errors qui elles ont réussi.
    Essayes de supprimer les options passées à mysql pour voir si cela change quelque chose

  3. #3
    Membre régulier
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Tout d'abord merci de ton intérêt à ma cause ...

    Voici mes nouveaux tests ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE `maTable` (
      `idkey` MEDIUMINT(8) UNSIGNED NOT NULL,
      `info1` TINYINT(3) UNSIGNED NOT NULL,
      `info2` TINYINT(3) UNSIGNED NOT NULL
    ) ENGINE=MYISAM 
    /*!50100 PARTITION BY RANGE (idKey)
    (PARTITION P1 VALUES LESS THAN (100) ENGINE = MyISAM,
     PARTITION P2 VALUES LESS THAN (200) ENGINE = MyISAM,
     PARTITION P3 VALUES LESS THAN (300) ENGINE = MyISAM) */
    un script shell rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    echo "TRUNCATE TABLE..."
    echo "truncate table matable;" | mysql -b mabase
    [ $? -ne 0 ] && echo "Je pleure sur truncate" && exit 1
     
    echo "1er Loading sur tous les champs..."
    echo "LOAD DATA LOCAL INFILE './toto.txt'
    INTO TABLE matable FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'
    (idKey, info1, info2);" | mysql -bsN mabase
    [ $? -ne 0 ] && echo "Je pleure sur 1er loading" && exit 2
    echo "OK - 1er loading"
     
    echo "Affichage"
    echo "select * from matable;" | mysql -b mabase
     
    echo "TRUNCATE TABLE..."
    echo "truncate table matable;" | mysql -b mabase
    [ $? -ne 0 ] && echo "Je pleure sur truncate" && exit 1
     
    echo "2eme Loading uniquement sur idKey..."
    mysql -e "LOAD DATA LOCAL INFILE './toto.txt' \
              INTO TABLE matable \
              FIELDS TERMINATED BY '\\t' \
              LINES TERMINATED BY '\\n' (idKey);" mabase
    [ $? -ne 0 ] && echo "Je pleure sur le 2eme loading" && exit 4
    echo "OK - 2eme Loading !!!"
     
    echo "Affichage"
    echo "select * from matable;" | mysql -b mabase
     
    echo "TRUNCATE TABLE..."
    echo "truncate table matable;" | mysql -b mabase
    [ $? -ne 0 ] && echo "Je pleure sur truncate" && exit 1
     
    mysql -e "insert into matable (idKey,info1,info2) values (800,1,1);" mabase
    [ $? -ne 0 ] && echo "Je pleure sur le insert" && exit 3
     
    echo "Affichage"
    echo "select * from matable;" | mysql -b mabase
    mon fichier toto.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    400\t400\t400\n
    152\t152\t152
    Le résultat obtenu :
    :> test.sh
    TRUNCATE TABLE...
    1er Loading sur tous les champs...
    OK - 1er loading
    Affichage
    idkey info1 info2
    152 152 152
    TRUNCATE TABLE...
    2eme Loading uniquement sur idKey...
    OK - 2eme Loading !!!
    Affichage
    idkey info1 info2
    152 0 0
    TRUNCATE TABLE...
    ERROR 1526 (HY000) at line 1: Table has no partition for value 800
    Je pleure sur le insert
    Conclusion : mes constats sont tjs identiques avec SHOW bidule (ou pas)...

  4. #4
    Membre régulier
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Points : 86
    Points
    86
    Par défaut
    Si cela peut être utile à la collégiale, j'ai un début de solution...

    L'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "monsql" | mysql -vvb maBase
    fournit un bilan comme l'exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query OK, 2 rows affected, 4 warnings
    Records: 3  Deleted: 0  Skipped: 1  Warnings: 4
    On peut analyser ce bilan pour vérifier si le nombre de "Records" est identique au "row(s) affected"...

    Je préfèrerais une option qui demande à la commande "mysql" de retourner un code différent de zéro

    Si vous avez mieux à me proposer... Soyez les bienvenus !

Discussions similaires

  1. [MySQL] Deux problèmes sur LOAD DATA LOCAL INFILE
    Par ferd7 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/07/2015, 15h12
  2. Erreur sur LOAD DATA INFILE
    Par crazyday dans le forum Import/Export
    Réponses: 4
    Dernier message: 13/08/2009, 01h56
  3. LOAD DATA LOCAL INFILE
    Par bruno782 dans le forum Administration
    Réponses: 9
    Dernier message: 15/02/2006, 14h35
  4. Autoriser le LOCAL de LOAD DATA LOCAL INFILE
    Par talvins dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 03/02/2006, 09h09
  5. LOAD DATA LOCAL INFILE????
    Par perlgirl dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 05/01/2005, 18h31

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