it-swarm.com.de

Client läuft ab, während die MySQL-Abfrage weiterhin ausgeführt wird?

Wir hatten ein Problem, bei dem eine schreibgeschützte Abfrage, die über die MySQL-Workbench ausgeführt wurde, aus Sicht der Benutzeroberfläche eines Benutzers eine Zeitüberschreitung aufwies und auf dem Server ausgeführt wurde (und anscheinend immer mehr Ressourcen verbrauchte), bis wir einen Ausfall hatten.

Fragen

  • Gibt es eine Standardmethode, um mit solchen Problemen in MySQL umzugehen?
  • Gibt es eine grundlegende Ursache, die wir vermeiden müssen?
9
asthasr

Sie müssen sich ansehen, welche Standardwerte für Zeitüberschreitungen vorhanden sind:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

Normalerweise achte ich auf mehrere Timeout-Variablen. Dies ist sehr wichtig, wenn Sie MySQL remote von MySQL Workbench, MySQL-Client oder PHP App auf einem App-Server, der MySQL auf einem DB-Server kontaktiert) verwenden.

In der MySQL-Dokumentation steht eine der folgenden Einstellungen:

  • wait_timeout (Standard 28800 [8 Stunden]): Die Anzahl der Sekunden, die der Server auf die Aktivität einer nicht interaktiven Verbindung wartet, bevor er diese schließt. Dieses Zeitlimit gilt nur für TCP/IP- und Unix-Socket-Dateiverbindungen, nicht für Verbindungen, die über Named Pipes oder gemeinsam genutzten Speicher hergestellt wurden. Beim Start des Threads wird der Wert für "wait_timeout" der Sitzung je nach Clienttyp aus dem globalen Wert "wait_timeout" oder aus dem globalen Wert "interaktives Zeitlimit" initialisiert (wie durch die Verbindungsoption CLIENT_INTERACTIVE zu mysql_real_connect () definiert). Siehe auch interactive_timeout.
  • interaktives_Zeitlimit (Standard 28800 [8 Stunden]): Die Anzahl der Sekunden, die der Server auf die Aktivität einer interaktiven Verbindung wartet, bevor er diese schließt. Ein interaktiver Client ist als Client definiert, der die Option CLIENT_INTERACTIVE für mysql_real_connect () verwendet. Siehe auch wait_timeout.
  • net_read_timeout (Standard 30): Die Anzahl der Sekunden, die auf weitere Daten von einer Verbindung gewartet werden muss, bevor der Lesevorgang abgebrochen wird. Wenn der Server vom Client liest, ist net_read_timeout der Timeout-Wert, der steuert, wann abgebrochen werden soll. Wenn der Server auf den Client schreibt, ist net_write_timeout der Timeout-Wert, der steuert, wann der Vorgang abgebrochen werden soll. Siehe auch Slave_net_timeout.
  • net_write_timeout (Standard 60): Die Anzahl der Sekunden, die gewartet werden muss, bis ein Block in eine Verbindung geschrieben wurde, bevor der Schreibvorgang abgebrochen wird. Siehe auch net_read_timeout.

Stellen Sie sicher, dass diese Zeitlimits hoch genug sind, um Abfragen zu berücksichtigen, die möglicherweise sehr lange ausgeführt werden. Dazu gehören:

  • Masse UPDATEs
  • Masse DELETEs
  • ENABLE KEYS auf einem großen MyISAM

Um Abfragen zu bearbeiten, die weiter ausgeführt werden, nachdem Sie den Kontakt verloren haben, müssen Sie [~ # ~] kill [~ # ~] gegen die Prozess-ID der lang laufenden Abfrage. Selbst mit dem Befehl KILL müssen Sie auf alle Abfragen warten, die sich mitten in festplattenintensiven Schritten befinden oder interne Mutexe ausführen.

11
RolandoMySQLDBA