web-dev-qa-db-fra.com

MySQL Workbench interrompt sa connexion lorsqu'il est inactif

J'utilise MySQL Workbench 6.3 sur OS X 10.9.5 pour gérer plusieurs bases de données cloud (hébergées sur Rackspace). Le problème suivant se pose alors:

Lorsqu'ils sont inactifs pendant 5 minutes, les problèmes suivants se produisent:

  • Je ne peux exécuter aucune requête (erreur 2013: connexion perdue au serveur MySQL lors de la requête)
  • lorsque j'essaie de parcourir les tables de ma base de données, des messages du type "Les tables ne peuvent pas être extraites", "Les vues ne peuvent pas être extraites", etc.
  • lors de l'actualisation du panneau de gauche, le message suivant s'affiche: "Code d'erreur: Le serveur MySQL 2006 est parti"

Donc, fondamentalement, la connexion a disparu.

C'est vraiment ennuyeux car cela se produit après seulement 5 minutes d'inactivité. Par conséquent, je dois fermer la connexion et la rouvrir à chaque fois.

J'ai aussi essayé ceci: MySQL Workbench: Comment garder la connexion vivante , qui n'a rien changé . Dans l'onglet Préférences de Workbench, j'ai la configuration suivante:

  • Intervalle persistant de la connexion à un SGBD (en secondes): 600
  • Délai de lecture de la connexion au SGBD (en secondes): 600
  • Délai de connexion au SGBD (en secondes): 60

Notez que ce problème se produit précisément après 5 minutes d’inactivité! Si j'exécute deux requêtes dans un intervalle de 4 minutes 59 minutes, tout fonctionne parfaitement ..__ De plus, mes collègues qui se connectent à la même base de données sur leur Workbench n'ont pas ce problème.

Quelqu'un at-il une solution pour cela?

32
Michel Y

Allez dans Edition -> Préférences -> Editeur SQL et vous verrez:

DBMS connection keep-alive interval (in seconds): 600
DBMS connection read time out (in seconds): 600
DBMS connection time out (in seconds): 60

L'intervalle Keep-Alive de la connexion au SGBD indique la fréquence à laquelle Workbench envoie une demande Keep-Alive au serveur pour maintenir la connexion active.

Depuis 5 minutes == 300 secondes, Définir un intervalle de maintien de la connexion à un SGBD <300 (par exemple 250).

Cela signifiera "envoyer une demande de maintien en vie toutes les 250 secondes". Cliquez sur OK.

Quittez ensuite MySQL Workbench et relancez-le pour que les modifications prennent effet.

Si vous utilisez la méthode de connexion TCP/IP sur SSH standard, il peut également être utile de configurer ssh ServerAliveInterval.

24
Kosh Very

Ce bogue existe dans toutes les versions de MySQL Workbench au-delà de 6.0 (actuellement, 6.1, 6.2 et 6.3 ont le bogue).

Passer à MySQL Workbench 6.0.x semble être le seul moyen de résoudre ce problème.

Téléchargez MySQL Workbench 6.0.x: http://dev.mysql.com/downloads/workbench/6.0.html

14
lepix

FWIW: À la suite de la recommandation de Kosh, j’ai modifié les paramètres comme suit et il semble avoir éliminé le problème sous WB 6.3 fonctionnant sous Ubuntu 16:

DBMS connection keep-alive interval (in seconds): 60
DBMS connection read time out (in seconds): 60
DBMS connection time out (in seconds): 30

C'est peut-être exagéré, mais cela fonctionne.

2
Max

Cela m'a résolu en fixant tcp_keepalive_time à 120 secondes sur Ubuntu 14.04 hébergé sur Windows Azure.

La valeur de maintien TCP sur l'équilibreur de charge Azure est de 240 secondes par défaut, ce qui peut entraîner la perte de connexions en mode silencieux si le maintien TCP sur vos systèmes Azure est supérieur à cette valeur. Vous devez définir tcp_keepalive_time sur 120 pour résoudre ce problème.

  1. Pour vérifier le temps tcp_keepalive_time

    cat/proc/sys/net/ipv4/tcp_keepalive_time

7200 (par défaut 2 heures)

Valeur 2.set de 2 heures à 120 secondes.

Sudo sysctl -w net.ipv4.tcp_keepalive_time = 120

net.ipv4.tcp_keepalive_time = 120

  1. revérifier la valeur après avoir changé .

    cat/proc/sys/net/ipv4/tcp_keepalive_time

120

4. Définissez la valeur dans le fichier sysctl pour qu'elle reste la même après le redémarrage.

vi /etc/sysctl.conf

Appuyez sur i (Pour insérer dans un fichier) Net.ipv4.tcp_keepalive_time = 120 (Ajoutez cette ligne au bas du fichier) : wq (Enregistrer et quitter)

1
Srikanth P

Cela m'avait rendu mental pendant des mois. Mes connexions étaient sur un serveur Hostgator. Je me connectais et je pouvais éditer une table pendant 10 secondes environ après la connexion, puis je ferais, par exemple, une validation de table et la table passerait à "Lecture seule" avec un message de survol de détermine un identifiant de ligne unique (le serveur MySQL a été supprimé) ou "(Connexion perdue avec le serveur MySQL lors d'une requête).

Comme indiqué dans les autres suggestions, la solution consistait à REDUIRE le paramètre de maintien en activité. Dans mon cas, il fallait descendre à 10s (évidemment, Hostgator si assez miséreux avec leur bande passante!)

J'ai d'abord essayé de réduire SSH KeepAlive (sous Préférences/Autres/Délais), mais cela n'a pas fonctionné.

En quoi l’astuce consistait à réduire le DBMS connection keep-alive interval (sous Preferences/SQL Editor/MySQL Session). Je devais le réduire à 10 secondes jusqu'à ce que la connexion reste stable. Votre hôte pourrait être différent.

Enfin, plus besoin de "Refresh All", attendez, faites quelque chose, rincez et répétez.

0
SteveCinq

La réponse de Kosh Very n'a pas fonctionné pour moi alors j'ai trouvé une solution différente pour cela:

changez max_allowed_packet dans le fichier my.ini. (C:\ProgramData\MySQL\MySQL Server 5.6)

max_allowed_packet = 16M

redémarrez maintenant le service MySQL une fois que vous avez terminé.

0
JerryGoyal

Kosh Very est la bonne réponse. Pour ceux qui ne pourraient pas le faire fonctionner, voici une autre solution:

Si je dois modifier une table volumineuse (supprimer ou ajouter une colonne ou autre), c’est d’exécuter la ou les requêtes par terminal:

  1. Connect : mysql -u myusername -p 

  2. On vous demandera un mot de passe

  3. Exécuter la (les) requête (s) de longue durée dont vous avez besoin. Remarque: l'écriture d'une requête dans un terminal nécessite un point-virgule final (;) pour chacun. Exemple: ALTER TABLE mydb.mytable DROP COLUMN mycol;
0
evilReiko