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

MySQL Discussion :

Lost connection to MySQL server during query


Sujet :

MySQL

  1. #1
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut Lost connection to MySQL server during query
    Salut à tous.

    Code mysql : 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
    40
    41
    42
    43
    44
    45
    Heure Début :  0:52:38,61
    --------------
    START TRANSACTION
    --------------
     
    --------------
    SHOW SESSION VARIABLES LIKE '%timeout'
    --------------
     
    +-----------------------------+----------+
    | Variable_name               | Value    |
    +-----------------------------+----------+
    | connect_timeout             | 900      |
    | delayed_insert_timeout      | 900      |
    | have_statement_timeout      | YES      |
    | innodb_flush_log_at_timeout | 1        |
    | innodb_lock_wait_timeout    | 900      |
    | innodb_rollback_on_timeout  | OFF      |
    | interactive_timeout         | 900      |
    | lock_wait_timeout           | 31536000 |
    | net_read_timeout            | 900      |
    | net_write_timeout           | 900      |
    | replica_net_timeout         | 900      |
    | rpl_stop_replica_timeout    | 31536000 |
    | rpl_stop_slave_timeout      | 31536000 |
    | slave_net_timeout           | 900      |
    | ssl_session_cache_timeout   | 300      |
    | wait_timeout                | 900      |
    +-----------------------------+----------+
    --------------
    ALTER TABLE charniere ADD CONSTRAINT `FK_01` FOREIGN KEY (`medecin`) REFERENCES `medecin` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    --------------
     
    ERROR 2013 (HY000) at line 10 in file: 'E:\30.MySql\20.Basic\21.Optimisation\Ex_02\Prog\05.Base.sql': Lost connection to MySQL server during query
    --------------
    ALTER TABLE charniere ADD CONSTRAINT `FK_02` FOREIGN KEY (`patient`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    --------------
     
    ERROR 2013 (HY000) at line 11 in file: 'E:\30.MySql\20.Basic\21.Optimisation\Ex_02\Prog\05.Base.sql': Lost connection to MySQL server during query
    --------------
    COMMIT
    --------------
     
    ERROR 2013 (HY000) at line 17 in file: 'E:\30.MySql\20.Basic\21.Optimisation\Ex_02\Prog\05.Base.sql': Lost connection to MySQL server during query
    Heure Fin ..:  0:52:50,71
    Le traitement dure à peine 12,1 secondes et je perds la connexion.
    Normalement, j'ai paramétré le timeout à 15 Minutes (900 secondes). Mais a priori, ce n'est pas ce type de problème que je rencontre.
    Les deux tables ont 1 millions de lignes. La première fait 24Mo et la seconde 40Mo.
    Je ne comprends pas l'origine de ce problème.

    J'ai fait des recherches sur le net et je tombe fréquemment sur le timeout, ou sur "max_allowed_packet", mais ce n'est pas ça.
    Quel serait l'origine de ce problème ?

    Cordialement.
    Artemus24.
    @+

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 310
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 310
    Billets dans le blog
    17
    Par défaut
    C'est la création de la clef étrangère qui provoque cela ?
    Le serveur MySQL plante où est-ce juste la connexion au serveur qui tombe ?
    La requête continue-t-elle son exécution un temps après l'erreur ?

    Si tu peux transmettre le jeu de données je suis preneur pour tester de mon côté.

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut Seb..

    Citation Envoyé par Seb.
    C'est la création de la clef étrangère qui provoque cela ?
    Oui, à la création de deux clefs étrangères.

    Citation Envoyé par Seb.
    Le serveur MySQL plante où est-ce juste la connexion au serveur qui tombe ?
    Le serveur est encore opérationnel après cela, et je n'ai aucun message dans "MySql_error.log".
    C'est seulement la connexion qui a disparu dans la session du script.

    Citation Envoyé par Seb.
    La requête continue-t-elle son exécution un temps après l'erreur ?
    Tout se trouve dans le compte-rendu de l'exécution de mon premier message.
    Je pense que l'erreur se produit sur la première création des clefs étrangères.
    Puis ayant perdu la connexion, le script continue et va jusqu'au bout en indiquant à chaque fois la même erreur.

    J'ai fait un recherche sur l'erreur 2013, mais je n'ai rien trouvé de probant.

    Citation Envoyé par Seb.
    Si tu peux transmettre le jeu de données je suis preneur pour tester de mon côté.
    J'ai trouvé l'origine de l'erreur.
    A l'origine, le script était dans un seul fichier et j'ai séparé le tout en cinq scripts plus court.
    Sauf que j'ai oublié de modifier les lignes où je désactive les index et le mode transaction automatique.
    Il y avait "SESSION" et quand j'ai modifié en mettant "GLOBAL", l'erreur à disparue.

    Je ne comprends pas pourquoi cela a provoqué l'erreur 2013.

    Cordialement.
    Artemus24.
    @+

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Comme demandé, voici les scripts MySql :
    Code mysql : 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
    START TRANSACTION;
     
    -- ===========
    -- Paramétrage
    -- ===========
     
    ALTER INSTANCE DISABLE InnoDB REDO_LOG;
     
    SET GLOBAL autocommit         = 0;
    SET GLOBAL unique_checks      = 0;
    SET GLOBAL foreign_key_checks = 0;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE `base`
    	DEFAULT CHARACTER SET `latin1`
    	DEFAULT COLLATE       `latin1_general_ci`;
     
    USE `base`;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    Création de la table des médecins :
    Code mysql : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    START TRANSACTION;
    USE `base`;
     
    -- ===============
    -- Table `medecin`
    -- ===============
     
    DROP TABLE IF EXISTS `medecin`;
     
    CREATE TABLE `medecin`
    ( `id`          integer unsigned auto_increment NOT NULL primary key,
      `nom`         varchar(255)                    NOT NULL,
      `prenom`      varchar(255)                    NOT NULL,
      `mail`        varchar(255)                    NOT NULL,
      `specialite`  smallint unsigned               NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =====================
    -- Procédure `ajout_med`
    -- =====================
     
    DROP PROCEDURE IF EXISTS ajout_med;
     
    DELIMITER $$
    CREATE PROCEDURE ajout_med
    (
    	IN In_Qte   INTEGER UNSIGNED,
    	IN In_Start INTEGER UNSIGNED,
    	IN In_End   INTEGER UNSIGNED
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _max  INTEGER UNSIGNED DEFAULT 100;
      DECLARE _ind1 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _ind2 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _nbr  INTEGER UNSIGNED DEFAULT 0;
     
      DECLARE _nom  VARCHAR(255)     DEFAULT NULL;
      DECLARE _pre  VARCHAR(255)     DEFAULT NULL;
      DECLARE _mail VARCHAR(255)     DEFAULT NULL;
      DECLARE _spe  INTEGER UNSIGNED DEFAULT 0;
     
      SET _nbr  = 1;
      SET _ind1 = floor(In_Qte / _max);
     
      ALTER TABLE `medecin` DISABLE KEYS;
     
      WHILE _ind1 > 0
      DO
        START TRANSACTION;
        SET _ind2 = _max;
     
        WHILE _ind2 > 0
        DO
          SET _nom  =         concat('nom',    right( concat('00000', _nbr), 5));
          SET _pre  =         concat('prenom', right( concat('00000', _nbr), 5));
          SET _mail = concat( concat('id',     right( concat('00000', _nbr), 5)), '@docteur.com');
          SET _spe  = round( cast(rand() * (In_End - In_Start) as unsigned) + In_Start);
     
          INSERT INTO `medecin` (`nom`,`prenom`,`mail`,`specialite`) VALUE (_nom, _pre, _mail, _spe);
     
          SET _ind2 = _ind2 - 1;
          SET _nbr  = _nbr  + 1;
        END WHILE;
     
        COMMIT;
        SET _ind1 = _ind1 - 1;
      END WHILE;
     
      ALTER TABLE `medecin` ENABLE KEYS;
    END$$
    DELIMITER ;
     
    -- ========================
    -- Remplissage de `medecin`
    -- ========================
     
    call ajout_med(4000, 1, 8);
     
    -- ===================
    -- Vidage de `medecin`
    -- ===================
     
    select count(*) from medecin;
     
    select * from medecin limit 10;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    Création de la table des patients :
    Code mysql : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    START TRANSACTION;
    USE `base`;
     
    -- ===============
    -- Table `patient`
    -- ===============
     
    DROP TABLE IF EXISTS `patient`;
     
    CREATE TABLE `patient`
    ( `id`      integer unsigned auto_increment NOT NULL primary key,
      `nom`     varchar(255)                    NOT NULL,
      `prenom`  varchar(255)                    NOT NULL,
      `mail`    varchar(255)                    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =====================
    -- Procédure `ajout_pat`
    -- =====================
     
    DROP PROCEDURE IF EXISTS ajout_pat;
     
    DELIMITER $$
    CREATE PROCEDURE ajout_pat
    (
    	IN In_Qte   INTEGER UNSIGNED
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _max  INTEGER UNSIGNED DEFAULT 100;
      DECLARE _ind1 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _ind2 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _nbr  INTEGER UNSIGNED DEFAULT 0;
     
      DECLARE _nom  VARCHAR(255)     DEFAULT NULL;
      DECLARE _pre  VARCHAR(255)     DEFAULT NULL;
      DECLARE _mail VARCHAR(255)     DEFAULT NULL;
     
      SET _nbr  = 1;
      SET _ind1 = floor(In_Qte / _max);
     
      ALTER TABLE `patient` DISABLE KEYS;
     
      WHILE _ind1 > 0
      DO
        START TRANSACTION;
        SET _ind2 = _max;
     
        WHILE _ind2 > 0
        DO
          SET _nom  =         concat('nom',    right( concat('0000000', _nbr), 7));
          SET _pre  =         concat('prenom', right( concat('0000000', _nbr), 7));
          SET _mail = concat( concat('id',     right( concat('0000000', _nbr), 7)), '@patient.com');
     
          INSERT INTO `patient` (`nom`,`prenom`,`mail`) VALUE (_nom, _pre, _mail);
     
          SET _ind2 = _ind2 - 1;
          SET _nbr  = _nbr  + 1;
        END WHILE;
     
        COMMIT;
        SET _ind1 = _ind1 - 1;
      END WHILE;
     
      ALTER TABLE `patient` ENABLE KEYS;
    END$$
    DELIMITER ;
     
    -- ========================
    -- Remplissage de `patient`
    -- ========================
     
    call ajout_pat(1000000);
     
    -- ===================
    -- Vidage de `patient`
    -- ===================
     
    select count(*) from patient;
     
    select * from patient limit 10;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    Création de la table charnières :
    Code mysql : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    START TRANSACTION;
    USE `base`;
     
    -- =================
    -- Table `charniere`
    -- =================
     
    DROP TABLE IF EXISTS `charniere`;
     
    CREATE TABLE `charniere`
    ( `id`       integer unsigned auto_increment NOT NULL primary key,
      `medecin`  integer unsigned                NOT NULL,
      `patient`  integer unsigned                NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ======================
    -- Procédure `ajout_char`
    -- ======================
     
    DROP PROCEDURE IF EXISTS ajout_char;
     
    DELIMITER $$
    CREATE PROCEDURE ajout_char
    (
    	IN In_Qte   INTEGER UNSIGNED,
    	IN In_Start INTEGER UNSIGNED,
    	IN In_End   INTEGER UNSIGNED
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _max  INTEGER UNSIGNED DEFAULT 100;
      DECLARE _ind1 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _ind2 INTEGER UNSIGNED DEFAULT 0;
      DECLARE _nbr  INTEGER UNSIGNED DEFAULT 0;
     
      DECLARE _med  INTEGER UNSIGNED DEFAULT 0;
     
      SET _nbr  = 1;
      SET _ind1 = floor(In_Qte / _max);
     
      ALTER TABLE `charniere` DISABLE KEYS;
     
      WHILE _ind1 > 0
      DO
        START TRANSACTION;
        SET _ind2 = _max;
     
        WHILE _ind2 > 0
        DO
          SET _med  = round( cast(rand() * (In_End - In_Start) as unsigned) + In_Start);
     
          INSERT INTO `charniere` (`medecin`,`patient`) VALUE (_med, _nbr);
          SET _ind2 = _ind2 - 1;
          SET _nbr  = _nbr  + 1;
        END WHILE;
     
        COMMIT;
        SET _ind1 = _ind1 - 1;
      END WHILE;
     
      ALTER TABLE `charniere` ENABLE KEYS;
    END$$
    DELIMITER ;
     
    -- ==========================
    -- Remplissage de `charniere`
    -- ==========================
     
    call ajout_char(1000000, 1, 4000);
     
    -- =====================
    -- Vidage de `charniere`
    -- =====================
     
    select count(*) from charniere;
     
    select * from charniere limit 10;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    La création des clefs étrangères :
    Code mysql : 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
    START TRANSACTION;
    USE `base`;
     
    -- ======================================
    -- Création des contraintes et de l'index
    -- ======================================
     
    ALTER TABLE charniere ADD CONSTRAINT `FK_01` FOREIGN KEY (`medecin`) REFERENCES `medecin` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
    ALTER TABLE charniere ADD CONSTRAINT `FK_02` FOREIGN KEY (`patient`) REFERENCES `patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    Et le final :
    Code mysql : 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
    START TRANSACTION;
    USE `base`;
     
    -- ===========
    -- Paramétrage
    -- ===========
     
    SET GLOBAL foreign_key_checks = 1;
    SET GLOBAL unique_checks      = 1;
    SET GLOBAL autocommit         = 1;
     
    ALTER INSTANCE ENABLE InnoDB REDO_LOG;
     
    -- ============
    -- Compte-rendu
    -- ============
     
    describe `medecin`;
    describe `patient`;
    describe `charniere`;
     
    COMMIT;
    EXIT
    a) création de la base de données vide.
    b) création de la table des médecins.
    c) création de la table des patients.
    d) création de la table charnière.
    e) création des clefs étrangères.
    f) remise en état du paramétrage et affichage de la description des tables.

    Et voici le temps elaps de l'exécution de mes six scripts :

    a) Heure Début : 16:50:42,22 / Heure Fin ..: 16:50:43,36 / Durée : 1,14 secondes.
    b) Heure Début : 16:50:46,29 / Heure Fin ..: 16:50:47,57 / Durée : 1,28 secondes.
    c) Heure Début : 16:50:50,60 / Heure Fin ..: 16:51:28,91 / Durée : 38,31 secondes.
    d) Heure Début : 16:51:31,83 / Heure Fin ..: 16:52:06,69 / Durée : 34,86 secondes.
    e) Heure Début : 16:52:10,00 / Heure Fin ..: 16:52:15,36 / Durée : 5,36 secondes.
    f) Heure Début : 16:52:18,66 / Heure Fin ..: 16:52:19,88 / Durée : 1,22 secondes

    Soit un total de 82,17 secondes, soit 1 minute 22,17 secondes.

    Cordialement.
    Artemus24.
    @+

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut à tous.

    Je pensais avoir résolu mon problème mais cela recommence sur la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into new_charniere select * from charniere;
    J'ai le même message d'erreur que le titre de ce sujet.

    Si le temps d'exécution d'une requête dépasse les 10 secondes, elle se plante.
    Le message "Lost connection to MySQL server during query" est trop vague pour déterminer la cause de l'erreur.
    J'ai pourtant mis partout 900 secondes (=15 minutes) dans les variables contenant le mot "timeout".
    (Voir mon premier message.)

    J'ai passé la matinée à chercher sur le net mais je n'ai rien trouvé.
    Il me semble que le problème vient de la connexion SSH, mais je n'en suis pas sûr.
    C'est très proche de la même erreur concernant le workbench MySql, que je n'utilise pas.

    J'ai pensé à mettre 1Go à la variable "max_allowed_packet", mais ce n'est pas ça.
    Je pense que le problème concerne bien un timeout, mais je ne sais pas lesquel.

    Cordialement.
    Artemus24.
    @+

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Les joies de MySQmerde...
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    J'ai déjà eu des problèmes dans le passé avec des grosses copies de tables Innodb, des fichiers temporaires remplissaient le disque dur qui avait atteint sa capacité (c'était une petite VM...). De mémoire j'avais aussi ajusté innodb_buffer_pool (de mémoire ça devrait être un peu moins que la quantité de RAM disponible).

    Citation Envoyé par Artemus24 Voir le message
    Il me semble que le problème vient de la connexion SSH, mais je n'en suis pas sûr.
    Certes SSH est sensible aux microcoupures, mais je ne vois pas vraiment le rapport ici, car même si vous êtes connecté au serveur de DB en console via SSH il me semble que la copie de données se fait sur le serveur même et non via un transfert de données sur le réseau n'est ce pas ? Pouvez-vous clarifier si vous lancez ce script sur le serveur même ou via un client installé sur votre PC ?

    Citation Envoyé par Artemus24 Voir le message
    J'ai pensé à mettre 1Go à la variable "max_allowed_packet", mais ce n'est pas ça.
    Je pense effectivement que ce n'est pas là le problème.
    Si je relis la doc: B.3.2.8 Packet Too Large
    (les points intéressants soulignés par moi-même)
    A communication packet is a single SQL statement sent to the MySQL server, a single row that is sent to the client, or a binary log event sent from a replication source server to a replica.

    The largest possible packet that can be transmitted to or from a MySQL 8.0 server or client is 1GB.

    When a MySQL client or the mysqld server receives a packet bigger than max_allowed_packet bytes, it issues an ER_NET_PACKET_TOO_LARGE error and closes the connection. With some clients, you may also get a Lost connection to MySQL server during query error if the communication packet is too large.

    Both the client and the server have their own max_allowed_packet variable, so if you want to handle big packets, you must increase this variable both in the client and in the server.
    Si vous ne voyez rien dans les logs Mysql, regardez quand même dans /var/log/messages par exemple ou /var/log/syslog, au cas où il y aurait un manque de mémoire signalé ou autre chose. A la limite, faites tourner cette commande en root: journalctl -f dans une console avant d'exécuter le script.

  8. #8
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut à tous.

    Citation Envoyé par SQLPRO
    Les joies de MySQmerde...
    Pas du tout, c'est juste un paramétrage dans MySql que je ne connais pas.

    Citation Envoyé par BinaryGirl
    De mémoire j'avais aussi ajusté innodb_buffer_pool (de mémoire ça devrait être un peu moins que la quantité de RAM disponible).
    Ce n'est pas la variable "innodb_buffer_pool_size" qui pose problème car chez moi, elle est à 5Go.
    Je ne l'ai pas configuré dans mon fichier "my.ini". J'ai laissé MySql mettre la bonne valeur.

    Citation Envoyé par BinaryGirl
    Pouvez-vous clarifier si vous lancez ce script sur le serveur même ou via un client installé sur votre PC ?
    Je suis sur le même ordinateur qui fait à la fois serveur et client MySql. L'adresse IP que j'utilise est 127.0.0.1.

    Pourquoi ai-je parlé de SSH ? C'est en référence à Workbench où il est question des timeout :
    --> Workbench Edit ? Preferences ? SQL Editor ? DBMS
    --> Workbench Edit ? Preferences ? SSH ? Timeouts

    Je ne pense que le problème concerne les timeout. Ils ont tous 900 secondes soit 15 minutes. Oui, j'ai vu large.

    Citation Envoyé par Doc MySql
    With some clients, you may also get a Lost connection to MySQL server during query error if the communication packet is too large.
    J'ai essayé de modifier la variable "max_allowed_packet" dans le script Client, sans que cela change quoi que ce soit.

    J'ai cherché à connaitre la valeur de l'id à partir de laquelle j'obtiens ce message d'erreur.
    Hier, j'avais trouvé 478456 et aujourd'hui, c'est 497457. C'est un problème de stockage.

    Si je fais des insert avec des intervalles, je n'ai aucun problème :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO `new_charniere` select * from `charniere` where id<=400000;
    INSERT INTO `new_charniere` select * from `charniere` where id >400000 and id <=800000;
    INSERT INTO `new_charniere` select * from `charniere` where id >800000;
    Je n'ai aucun message dans les log de MySql.
    En dehors de MySql, je ne sais pas où chercher des informations sur la nature de mon problème.

    Je suis sous Windows et non sous Linux.
    La taille de la table sur disque est de 40 960Ko soit 40Mo.

    Cordialement.
    Artemus24.
    @+

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    En dehors de MySql, je ne sais pas où chercher des informations sur la nature de mon problème.

    Je suis sous Windows et non sous Linux.
    A tout hasard, le journal d'événements de Windows ?

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut BinaryGirl et merci de m'aider.

    Je l'ai consulté mais je n'ai rien trouvé d'intéressant. Je continue de chercher.

    Si je réduis le nombre d'insert et que je fais juste après un commit, les insert suivants ne sont pas rejetés.
    Je pense qu'il s'agit de la capacité de stockage du journal des transactions.
    Sauf que je n'ai toujours pas trouvé la variable qui gère cela.

    Cordialement.
    Artemus24.
    @+

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut à tous.

    Quand je détruis le répertoire "/data" de mon instance MySql et que je le recrée, je n'obtiens pas l'erreur.
    Je peux lancer plusieurs fois mon script, l'erreur ne se reproduit pas.
    Mais si je redémarre WampServer, et si je lance à nouveau mon script, l'erreur revient.

    Comme j'avais désactivé le "redo log", j'ai pensé que le problème venait de là. A vrai dire, je n'en sais rien.
    L'erreur est indépendante du paramétrage du fichier "my.ini", puisque durant ce test, je n'ai rien modifié.
    Je n'ai eu aucune erreur dans le fichier "mysql_error.log" durant ces tests.
    J'en suis toujours au même point.

    Cordialement.
    Artemus24.
    @+

  12. #12
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 778
    Par défaut
    Salut à tous.

    J'ai enfin trouvé l'origine de mon problème.
    Oups, j'en suis à l'origine et je ne m'en souvenais plus du tout.

    MySql n'est pas en cause, ni mon paramétrage, ni redo log et encore moins mes scripts mysql.

    J'ai dans l'une de mes bases de données un événement qui se déclenchait toutes les secondes.
    Celui-ci devait tuer tous les tâches MySql qui durent plus de dix secondes.

    Comme j'ai réparé ma bêtise, je peux affirmer que je mets que 22 secondes environ pour recopier une table de 1 million de lignes.

    Cordialement.
    Artemus24.
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/06/2009, 17h25
  2. Lost connection to MySQL server during query
    Par msow dans le forum Outils
    Réponses: 4
    Dernier message: 12/06/2009, 18h07
  3. "Lost connection to MySQL server during query"
    Par berceker united dans le forum Requêtes
    Réponses: 7
    Dernier message: 08/12/2007, 02h07
  4. [MySQL] Warning: mysql_connect(): Lost connection to MySQL server during query
    Par manaboko dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/07/2007, 06h48
  5. Lost connection to MySQL server during query
    Par Huntress dans le forum Outils
    Réponses: 3
    Dernier message: 20/09/2005, 15h23

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