MySQL Linux Client Timeout / Keepalive

7

Gibt es eine Möglichkeit, ein Keepalive im Befehlszeilen-MySQL-Client unter Linux festzulegen?

Unser Netzwerk wurde kürzlich auf ein VLAN-Setup umgestellt, und unsere Systemabteilung hat keine Kontrolle mehr über die Firewall. Die Machthaber haben beschlossen, in ihrer Firewall eine Regel festzulegen, nach der alle Verbindungen nach 30 Minuten abgebrochen werden, wenn keine Daten durchgelassen wurden (etwas über das Verfolgen von Verbindungen und begrenzten Ressourcen). Ich habe keine Kontrolle darüber.

Als Serveradministrator und Programmierer besteht mein Problem darin, dass ich während der Programmierung keinen MySQL-Befehlszeilenclient im Hintergrund ausführen kann. Wenn ich keine Abfrage sende (oder auf andere Weise Daten sende), stellt der Client beim Versuch 35 Minuten später fest, dass keine Verbindung mehr besteht. Ich muss mich jedes Mal wieder verbinden.

In SSH kann ich ein Keepalive festlegen, damit die Verbindungen den ganzen Tag offen bleiben. Gibt es eine ähnliche konfigurierbare Option für den MySQL-Befehlszeilenclient? Ich habe Probleme, etwas zu finden, da "Mysql Keepalive" und ähnliche Suchvorgänge alle Rückgabeergebnisse für eine Backend-Verbindung innerhalb einer Programmiersprache liefern.

Stephen Schrauger
quelle

Antworten:

4

Sie können generische TCP-Keepalives festlegen. Ich denke, dafür gibt es eine Kerneleinstellung. Aber sie sind normalerweise viel seltener (Stunden). Es gibt ein TCP Keepalive HOWTO, das Details zu enthalten scheint.

Alternativ können Sie die MySQL-Verbindung auch einfach über SSH tunneln und dann SSH-Keepalives verwenden.

$ ssh -L1234:127.0.0.1:3306 -o ServerAliveInterval=300 user@mysql-server
... (in another terminal)
$ mysql -u user -p -h 127.0.0.1 -P 1234

Die dritte Option wäre, einen Tunnel (z. B. OpenVPN) zu Ihrem Server einzurichten, der dann Keepalive (und transparentes Wiederverbinden usw.) übernimmt.

PS: Das Argument "Unsere wertvollen Ressourcen" für den Ablauf etablierter TCP-Verbindungen in 30 Minuten ist BS. Leider - ich war schon in ihren Schuhen - ist einige Ausrüstung auch BS. Zum Beispiel gibt BCP 142 / RFC 5382 eine Mindestzeit von 2 Stunden 4 Minuten an (und das nur, wenn die Firewall nicht feststellen kann, ob der Host noch aktiv ist).

derobert
quelle
Ich hatte auch daran gedacht, SSH-Tunneling zu verwenden, und ich hatte vor, dies zu verwenden. Es erfordert, dass ich einen Benutzer auf dem Server habe (das tue ich, aber das ist nicht immer der Fall). Und ich denke, es beschränkt Sie auf eine SQL-Verbindung (es sei denn, Sie leiten mehrere Ports weiter und geben sie im Befehl mysql an).
Stephen Schrauger
Die Idee, das TCP-Keepalive in meinem Kernel zu ändern, gefällt mir sehr gut. Weißt du, wo ich das einstellen kann? Dies würde das Keepalive-Problem für jeden anderen Dienst lösen, den ich auch benutze.
Stephen Schrauger
@dymutaos nein, Sie können mehrere Verbindungen über dieselbe SSH-Verbindung weiterleiten. Führen Sie einfach einen anderen MySQL-Client aus und stellen Sie eine Verbindung zum selben Port her. Und Sie benötigen kein Konto auf dem MySQL-Server, sondern nur ein Konto außerhalb Ihrer Firewall. Ich muss nachsehen, ob TCP Keepalive eingestellt ist.
Derobert
1
@dymutaos hat einen Link zu einem Howto hinzugefügt, in dem erklärt wird, wie Keepalives eingerichtet werden. Es ist ein wenig alt, daher haben sich die Namen der / proc-Dateien möglicherweise ein wenig geändert ...
derobert
3

Der MySQL CLI-Client verwendet standardmäßig die automatische Verbindung, wenn während einer Sitzung eine Verbindung unterbrochen wird. Dokumentation: MySQL-Tipps und Steuern des automatischen Wiederverbindungsverhaltens .

Die wirkliche Lösung wäre, mit den Machthabern zu arbeiten und eine Lösung zu finden, die für Mitglieder des Entwicklungsteams funktioniert.

Das würde natürlich einige Zeit dauern, daher muss möglicherweise eine vorübergehende Lösung ausgearbeitet werden. Ich würde empfehlen, MySQLs auto-connect ( --skip-reconnect) zu deaktivieren und ein einfaches Bash-Skript zu erstellen, um die Wiederverbindung zu handhaben. Keine gute Idee, könnte aber helfen.

#!/bin/bash

PROGRAM="/path/to/mysql"
ARGS="--skip-reconnect"

while [ 1 ]; do
 $PROGRAM $ARGS
 sleep 1
 echo -n "Lost Connection... Reconnect[Y]"
 read USER_INPUT
 case x$USER_INPUT in
  x)
   echo "Reconnecting..."
   ;;
  x[yY])
   echo "Reconnecting..."
   ;;
  *)
   echo "Stopping..."
   break
   ;;
 esac
done
Emcconville
quelle
3

Sie können libkeepalive verwenden , um ein Programm vorab zu ladenlibkeepalive.so , das socket()Anrufe abfängt und automatisch setsockopt()mit Ihren bevorzugten Keepalive-Einstellungen am Socket anruft, bevor Sie es zurückgeben.

Dazu müssen Sie die Anwendung nicht neu kompilieren (in diesem Fall MySQL), sie ist vollständig transparent.

Siehe auch das TCP Keepalive HOWTO .

Vegard
quelle