Läuft meine MySQL-Abfrage auch dann weiter, wenn meine SSH-Verbindung unterbrochen wird?


16

Ich habe über SSH eine Verbindung zu einem Server hergestellt, mich bei mysql angemeldet und ihn gebeten, eine Abfrage auszuführen (deren Ergebnisse in einer CSV-Datei gespeichert werden), die weit über eine Stunde dauern kann. Obwohl ich meinen Client angewiesen habe, alle 60 Sekunden Null-Pakete zu senden, um die Sitzung aktiv zu halten, bin ich immer noch paranoid, dass die mysql-Abfrage / der mysql-Prozess abgebrochen werden könnte. Meine Fragen lauten also:

  1. Bricht eine abgebrochene SSH-Sitzung (aufgrund von Inaktivität) den Mysql-Abfrageprozess ab?
  2. Wie kann ich sicherstellen, dass dies nicht passiert? Reicht der Null-Paketversand alle 60 Sekunden aus?

Antworten:


9

Die meisten Shells senden SIGHUP beim Beenden an die Vordergrund-Prozessgruppe (und in einigen Hintergrundprozessen wird dies in bash mit der Shell-Option gesteuert huponexit), was dazu führen kann, dass es abstürzt, abhängig davon, wie Ihr mysql-Client damit umgeht.

Sie können Ihren Befehl mit nohupdem Präfix ausführen , damit er von init repariert wird, wenn Ihre Shell beendet wird, unabhängig davon, ob Ihre Shell SIGHUP sendet oder nicht (von init repariert zu werden, hat nichts mit nohup zu tun - es ist nur so, dass die übergeordnete Shell überlebt hat).

Möglicherweise ist die Verwendung oder Ausführung des Clients, der von Ihrer Shell und dem steuernden Terminal abstrahiert tmuxist screen, eine angenehmere Lösung dtach. Auf diese Weise stellen Sie die Verbindung zu der Sitzung, in der Sie die Abfrage ausgeführt haben, wieder her, wenn Ihre Shell die Verbindung trennt.

Im Allgemeinen spielen Keepalive-Pakete keine Rolle, die Verbindung wird nicht ohne Grund beendet. Ein dringenderes Anliegen wäre der Verlust der Verbindung zwischen dem Client und dem Server aus anderen Gründen (Netzwerkfehler usw.).


Vielen Dank! Nur zur Verdeutlichung, ich führe die eigentliche Abfrage in MySQL aus. Solange ich mich bei MySQL nohupanmelde, bleiben die darin ausgeführten Abfragen bestehen.
njp

1
@njp Wenn Sie interaktiv ausführen möchten, nohupist dies für Sie nicht von großem Nutzen, da die mysql-REPL nicht an das Terminal angehängt wird. Versuchen Sie es mit einem der oben genannten Multiplexer (oder dtach), die Ihren Anforderungen wahrscheinlich besser entsprechen.
Chris Down

2

Ich habe angefangen, screenSessions zu starten, wenn ich in eine Box gehe, teilweise um dies zu verhindern, und als zusätzlichen Bonus bekomme ich mehrere Tabs, die ich nicht übertreffen kann. Wenn ich aus irgendeinem Grund nicht verbunden bin, kann ich eine neue Verbindung zu meiner Bildschirmsitzung herstellen.

Aktualisieren

Um # 2 zu beantworten, würde ich mysqlaus einer Bash-Shell durch eine Bildschirmsitzung laufen . Klingt kompliziert, ist aber nur:

$: screen
$: mysql

Sie können Ihre ~ / .screenrc-Datei bearbeiten, um am unteren Rand der Bildschirmsitzung Beschriftungen hinzuzufügen, damit Sie Ihre Registerkarten nachverfolgen, Ihre Registerkarten umbenennen usw. Wenn Sie jemals die Verbindung getrennt haben, führen Sie sie einfach aus, wenn Sie die Verbindung wiederherstellen

$: screen -d

und das zeigt alle getrennten Sitzungen. Zum erneuten Anschließen einfach so etwas wie ausführen

$: screen -r 551.pts-0.git

Oder wie auch immer die ID der Bildschirmsitzung lautete. Sie sind wieder da, wo Sie aufgehört haben. Sie müssen jedoch screen -dals derselbe Benutzer ausgeführt werden, der die Bildschirmsitzung gestartet hat, nur zu Ihrer Information, oder natürlich als root. Ich bin mir nicht wirklich sicher, weil ich nach dem Einspielen immer sudo su -so nicht jeden Befehl sudo muss.


1
Der Ratschlag screenist zwar gut, beantwortet aber nicht direkt die beiden vom OP aufgeführten Fragen.
Barun
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.