あまりにも多くの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として保存,複合ミッション計画,定期的にスリープ接続をクリアできます。

返信を残します