SHOW PROCESSLIST im MySQL-Befehl: sleep


83

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.


es tut nichts, es sitzt nur da und "wartet" auf eine Verbindung.
Rufinus

1
Können wir herausfinden, welche Abfrage auf die Verbindung wartet? macht meine que einen sinn? Und warum verlangsamt es meine Datenbank?
gthm

8
Es ist keine Abfrage, die auf eine Verbindung wartet. Es ist ein Verbindungszeiger, der darauf wartet, dass das Timeout beendet wird. und es hat keinen Einfluss auf die Leistung. Das einzige, was es verwendet, sind ein paar Bytes, wie es jede Verbindung tut. Der schlimmste Fall ist die Verwendung einer Verbindung Ihres Pools. Wenn Sie eine Verbindung über den Konsolenclient mehrmals herstellen und den Client einfach schließen würden, ohne die Verbindung zu schließen, könnten Sie alle Ihre Verbindungen verbrauchen und müssen auf das Zeitlimit warten, um wieder eine Verbindung herstellen zu können ... aber das ist höchst unwahrscheinlich :-)
Rufinus

2
@ Rufinus, ich habe das gleiche Problem. Warum sagst du, aber das ist höchst unwahrscheinlich ? Und welche Parameter beziehen sich auf schlafende Verbindungen mit Konfigurationszeitlimit in my.cnf?
Hamidreza

Antworten:


75

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.


2
Das Problem kann sein, wenn Sie nur begrenzte Verbindungen zur Datenbank haben. Da selbst diese Verbindungen keinen Einfluss auf die Leistung haben, gelten sie dennoch als Verbindung.
Herr

26

"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.)


5

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).


0

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.

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.