Wenn ich SHOW PROCESSLIST in der MySQL-Datenbank ausführe, erhalte ich folgende Ausgabe:
mysql> show full processlist;
+--------+------+-----------+--------+---------+-------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------+-------+---------+-------+-------+-----------------------+
| 411665 | root | localhost | somedb | Sleep | 11388 | | NULL |
| 412109 | root | localhost | somedb | Query | 0 | NULL | show full processlist |
+--------+------+-----------+-------+---------+-------+-------+------------------------+
Ich möchte den Prozess "Schlaf" kennen, der unter Befehl steht. Was bedeutet das? Warum läuft es schon lange und zeigt NULL an? Es macht die Datenbank langsam und wenn ich den Prozess beende, dann funktioniert es normal. Bitte hilf mir.
mysql
processlist
gthm
quelle
quelle
Antworten:
Es ist keine Abfrage, die auf eine Verbindung wartet. Es ist ein Verbindungszeiger, der darauf wartet, dass das Timeout beendet wird.
Dies hat keinen Einfluss auf die Leistung. Das einzige, was es verwendet, sind ein paar Bytes, wie es jede Verbindung tut.
Der wirklich schlimmste Fall: Es wird eine Verbindung Ihres Pools verwendet; Wenn Sie mehrmals eine Verbindung über den Konsolenclient herstellen und den Client schließen würden, ohne die Verbindung zu schließen, könnten Sie alle Ihre Verbindungen verbrauchen und auf das Zeitlimit warten müssen, um wieder eine Verbindung herstellen zu können ... aber das ist höchst unwahrscheinlich :-)
Siehe MySql Proccesslist mit "Sleep" -Einträgen, die zu "Too many Connections" führen? und /dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep für weitere Informationen.
quelle
"Sleep" -Statusverbindungen werden meistens durch Code erstellt, der dauerhafte Verbindungen zur Datenbank aufrechterhält.
Dies kann entweder Verbindungspools umfassen, die von Anwendungsframeworks erstellt wurden, oder clientseitige Datenbankverwaltungstools.
Wie oben in den Kommentaren erwähnt, gibt es wirklich keinen Grund, sich über diese Verbindungen Sorgen zu machen ... es sei denn, Sie haben natürlich keine Ahnung, woher die Verbindung kommt.
(CAVEAT: Wenn Sie eine lange Liste dieser Arten von Verbindungen hatten, besteht die Gefahr, dass Ihnen die gleichzeitigen Verbindungen ausgehen.)
quelle
Ich habe diese Antwort hier gefunden: /dba/1558 . Kurz gesagt, wenn Sie Folgendes verwenden (oder in my.cnf), wird das Timeout-Problem behoben.
SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180;
Dadurch können die Verbindungen beendet werden, wenn sie 3 Minuten lang im Ruhezustand bleiben (oder was auch immer Sie definieren).
quelle
Schlaf bedeutet, dass Thread nichts tut. Die Zeit ist zu groß, da die Thread-Abfrage nicht unterbrochen wird, der Server jedoch nicht getrennt wird. Standardmäßig ist wait_timeout = 28800, sodass Sie kleinere Werte festlegen können, z. B. 10. Außerdem können Sie den Thread beenden.
quelle