web-dev-qa-db-ja.com

MySQLコマンドでSHOW PROCESSLIST:スリープ

MySQLデータベースでSHOW PROCESSLISTを実行すると、次の出力が表示されます。

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 | 
+--------+------+-----------+-------+---------+-------+-------+------------------------+

指揮下にあるプロセス「スリープ」について知りたい。どういう意味ですか?なぜ長い間実行されていて、NULLを示しているのですか?データベースが遅くなり、プロセスを強制終了すると、正常に動作します。私を助けてください。

73
gthm

接続を待機しているクエリではありません。これは、タイムアウトが終了するのを待っている接続ポインタです。

パフォーマンスには影響しません。使用しているのは、すべての接続と同様に数バイトです。

本当に最悪の場合:プールの1つの接続を使用しています。コンソールクライアントを介して複数回接続し、接続を閉じずにクライアントを閉じる場合、すべての接続を使い果たし、タイムアウトが再び接続できるようになるまで待つ必要があります...しかし、これはほとんどありません:-)

「接続が多すぎる」につながる「スリープ」エントリで埋められたMySql Proccesslist? および https://dba.stackexchange.com/questions/1558/how-long-is-too -long-for-mysql-connections-to-sleep 詳細については。

57
Rufinus

「スリープ」状態の接続は、ほとんどの場合、データベースへの永続的な接続を維持するコードによって作成されます。

これには、アプリケーションフレームワークによって作成された接続プール、またはクライアント側のデータベース管理ツールが含まれます。

上記のコメントで述べたように、これらの接続を心配する理由は本当にありません...もちろん、接続がどこから来ているのかわからない場合を除きます。

(警告:これらの種類の接続のリストが長い場合、同時接続が不足する危険性があります。)

21
Drew

私はここでこの答えを見つけました: https://dba.stackexchange.com/questions/1558 。要するに、以下を使用して(またはmy.cnf内で)タイムアウトの問題を削除します。

SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180;

これにより、3分間(またはユーザーが定義したもの)スリープ状態のままになっている場合、接続を終了できます。

1
Antony

スレッドは何もしないことを意味するスリープ。アンサースレッドクエリのために時間が大きすぎますが、サーバーを切断しないでください。デフォルトのwait_timeout = 28800。

0
ding