wait_timeout - MySQL server has gone away

  • Hallo Zusammen,

    ich baue gerade an einem Zeiterfassungsgerät. Soweit läuft alles gut. Das Problem was ich habe, dass wenn das python Skript
    mehrere Stunden läuft bekomme ich folgende Meldung :

    Ein Fehler ist geschehen: (2006, 'MySQL server has gone away')

    Ich vermute es liegt an der wait_timeout variable in der mysql DB. Es sind ja einige Lösungen unterwegs die hier 7x24 laufen. Habt ihr
    einfach die Variable angepasst oder wie habt ihr das gelöst.

  • Hallo,

    also normalerweise läuft der MySQL Server - wie jeder andere DB-Server auch - 24/7 ohne Problem.

    Die Fehlermeldung kommt zwar in der Tat von MySQL-Server, aber die Ursache liegt wahrscheinlich im Skript, wie z.B.
    * Connection geschlossen, trotzdem einen Zugriff probiert
    * fehlende Rechte
    Eine ganz gute Auflisting findest du bei [url=http://stackoverflow.com/questions/12444272/error-2006-mysql-server-has-gone-away-using-python-bottle-microframework-and]Stack Overflow[/quote]

    Verwendest du ein ORM? Macht bei sowas sehr viel Sinn. Und zeig' doch mal deinen Code.

    Gruß, noisefloor

  • noisefloor wie kommst du darauf, dass die Ursache beim Skript liegt? Das vom TE beschriebene Szenario legt das ueberhaupt nicht nahe - im Gegenteil, es klingt nach genau dem, was die Variable provoziert, wenn man eine Anwendung hat, die mit grossen Zeitintervallen beim Zugriff arbeitet - also zB in der Zeit von 18:00 - 8:00 ueber Nacht.

    blende8 Du kannst natuerlich den Timeout hochdrehen, und dann wird das Problem verschwinden - unter Unix bis zu einem Jahr, das sollte reichen.

    Alternativ (und so wuerde ich das machen) solltest du einfach timer-gesteuert immer wieder mal auf die DB zugreifen. ZB kannst du in eine Tabelle einfach einen Eintrag machen, alle 5 oder 20 Minuten, der dokumentiert, dass das Skript lief.

  • Hallo,

    @__deets__: wie kommst du denn darauf, dass `Du kannst natuerlich den Timeout hochdrehen, und dann wird das Problem verschwinden` das hilft? Das ist doch genau so spekulativ wie meine Aussage. Es sei denn, du weißt mehr als hier geschrieben steht...

    Wenn du anderer Meinung bist. ist das ja ok. Aber gerade mal pauschal andere Meinung als falsch abtun, ist auch keine Vorgehen.

    Gruß, noisefloor

  • Ich habe deine Meinung nicht pauschal abgetan, ich habe dich gefragt, warum du die Ursache im Skript siehst. "Fehlende Rechte" sind ueblichereweise kein fluktuierendes Problem, das zu vermuten ist schon ungewoehnlich. Und das arbeiten auf einer schon geschlossenen Verbindung ist natuerlich nicht auszuschliessen, aber die Existenz eins mehrstuendigen Timeouts und eines nach mehreren Stunden auftretenden Fehlverhaltens legt auch das als Ursache zumindest nicht nahe.

    Warum also haelst du das fuer die "wahrscheinliche Ursache" - das ist und bleibt die Frage, musst du ja nicht beantworten, aber sich davon angefressen zu fuehlen verstehe ich nicht.

  • Einfach kopieren, und zwischen code-tags setzen [ code ] Mein Python [ / code ] - mit ein paar weniger Leerzeichen um die eckigen Klammern rum ;)

    Zu deinem Skript: das ist nicht schoen, aber hat auch keine Fehler bezueglich des Verbindungsmanagements. Das Ding haengt halt endlos in UART.read, und wenn das erst zurueckkehrt nachdem die MySQLdb die Verbindung geschlossen hat durch den Timeout - dann ist halt essig.

    Entweder also erhoehst du den Timeout, oder du verlagerst das verbinden *in* die Hauptschleife, und schliesst die Verbindung wieder. Das ist bei der zu erwartenden niedrigen Frequenz der Nutzung wirklich kein Problem - eine Webanwendung mit dutzenden Zugriffen pro Sekunde stoesst da auf, aber hier ist das egal.

    Um meinen Vorschlag mit einem periodischen Zugriff auf das Skript umzusetzen musst du allerdings deinen Ablauf aendern. Dazu braucht man das Modul select, mit dem sich darauf warten laesst, dass ein Eingabestrom tatsaechlich Daten hat. Dann kann man die einlesen, so wie du das schon tust, oder man bekommt einen Timeout, so das man erst mal etwas anderes machen kann - zB einen Log-Eintrag in die DB schreiben.

  • Vielen Dank deets, habe die Verbindung in die Schleife gepackt. Bei einer Änderung wird die DB connected und im Anschluss geschlossen. System läuft jetzt zum ersten Mal 2 Tage durch.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!