あまりにも多くのMySQLスリープ接続を解決する
showprocesslistを実行します;スリープ状態で多数の接続を印刷した後,200または300があるかもしれません, これらはクライアントであり、
データベース通信後はリリースされません。接続数が多いと、システムの速度が大幅に低下します,新しいMySQL接続の確立をブロックする,
MySQLにエラーを報告させることさえ, 応答できません。
問題の根本的な原因は次のとおりです。
1.使用されている持続的接続が多すぎます
2.プログラムで,時間内にmysql接続を閉じませんでした
3.データベースクエリが十分に最適化されていません,時間がかかりすぎる
最も基本的な方法は、上記の3つの状況から確認することです
1.プログラムで,永続的なリンクを使用しないでください,つまり、pconnectの代わりにmysql_connectを使用します
2.プログラムが実行されます,Mysql_closeは明示的に呼び出す必要があります
3.システムのSQLクエリを段階的に分析することしかできません,遅いクエリログを有効にする,非効率的なSQLステートメントを特定する,次に最適化
研究開発の観点からの調査です,コードを変更するのが不便な場合, もう一度問題を解決したい,
次に、mysql自体のタイムアウト関数に依存して解決する必要があります,コマンドラインタイピング
mysql> 次のようなグローバル変数を表示します “%タイムアウト%”;
+—————————-+———-+
| Variable_name | 値 |
+—————————-+———-+
| connect_timeout | 10 |
| delayd_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | オフ |
| Interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+—————————-+———-+
10 セット内の行 (0.00 秒)
wait_timeoutとinteractive_timeout28800の値から、タイムアウト期間は8時間であることがわかります。
wait_timeoutとinteractive_timeoutの値を減らすことができます,タイムアウト切断の処理,といった
9002番目,つまり、15分
グローバルwait_timeout =を設定します 900;
グローバルinteractive_timeout = 900を設定します;
ただし、この構成は再起動後に無効になります。
構成ファイルmy.cnfに追加できます
[mysqld]
wait_timeout = 900
Interactive_timeout = 900
保存して終了,MySQLを再起動して有効にします
もう1つの方法は、スリープ接続を強制的に切断するシェルスクリプトを作成することです。
スクリプトは次のとおりです:
#!/bin / sh
user = user
passwd = passwd
ホスト= 127.0.0.1
一方 :
行う
n = `mysqladmin processlist -u $ user -p $ passwd -h $ host | grep -i sleep | wc -l`
日付= `日付+%Y%m%d[%H:%M:%S]`
エコー$ n
もし [ “$n” -gt 50 ]
その後
`mysqladmin processlist -u $ user -p $ passwd -h $ hostのiの場合 | grep -i sleep | awk ‘{印刷 $2}’`
mysqladmin -u $ user -p $ passwd -h $ host kill $ iを実行します
完了
エコー “睡眠が多すぎる ,そして殺された” >> /tmp / sleep.log
エコー “$日付 : $n” >> /tmp / sleep.log
そうしないと
出口 0
あります
睡眠 1
完了
cls_sleep.shとして保存,複合ミッション計画,定期的にスリープ接続をクリアできます。