MySQLエラー“接続が多すぎます”
-
05-07-2019 - |
質問
GoDaddy(Linux)でホストされているサイトにMySQL 5.0を使用しています。
ウェブアプリでテストを行っていたところ、突然ページの更新が非常に遅いことに気付きました。最後に、長い待ち時間の後、「MySQLエラー、接続が多すぎます...」という行に沿って何かを言っているページに行き、データベースに接続するconfig.phpファイルを指しています。
データベースに接続しているだけで、他のユーザーはいません。各ページの上部にconfig.phpファイルを含め、ページの最後でmysql接続を閉じます。間にいくつかのクエリがある場合があります。 mysql接続を十分に閉じていないのではないかと心配しています(mysql_close())。
ただし、クエリの実行後にそれらを閉じようとすると、ページで接続エラーが表示されます。私のページはPHPとHTMLです。クエリを閉じようとすると、次のクエリは接続されないようです。接続するには、終了後にconfig.phpを再度含める必要がありますか?
2週間で約84人がこのWebアプリケーションの使用を開始したため、このエラーは私を怖がらせました。
ありがとう。
編集:
ここに私のページのいくつかの擬似コードがあります:
require_once('../scripts/config.php');
<?php
mysql_query..
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
if(this button is pressed){
mysql_query...
}
?>
some html..
..
..
..
..
<?php
another mysql_query...
?>
some more html..
..
..
<?php mysql_close(); ?>
このように、ページが開くたびに接続が開き、ページの読み込みが完了すると接続が閉じると考えました。その後、誰かがページ上のボタンをクリックすると、接続が再び開きます...
編集:
さて、GoDaddyで電話を切ったところです。どうやら、エコノミーパッケージでは、一度に50の接続に制限されています。今日の私の問題は、サイトにアクセスしている私だけで発生しましたが、彼らは以前にサーバーの問題を抱えていたと言いました。ただし、Webアプリに84人のユーザーを含める方法を考えて、一度に100の接続を許可する「Deluxe」にアップグレードする必要があります。特定の日には、一度に約30人のユーザーが私のサイトにアクセスする可能性があるため、100人の方が安全な賭けになると思います。同意しますか?
解決
共有ホスティングプロバイダーは、通常、同じユーザーに対して非常に少量の同時接続を許可します。
あなたのコードが行うことは:
- MySQLサーバーへの接続を開く
- それを行う(ページを生成する)
- ページの最後で接続を閉じます。
最後のステップは、ページの最後で行う場合、必須ではありません:( < code> mysql_close のマニュアル):
mysql_close()の使用は通常はありません 非永続的なオープンとして必要 リンクは自動的に閉じられます スクリプトの実行の終了。
ただし、とにかく永続的な接続を使用しないでください...
2つのヒント:
-
mysql_pconnect
の代わりにmysql_connect
を使用します(すでにOKです) - mysql_connectの4番目のパラメーターをfalseに設定します(デフォルト値なのですでに問題ありません):(マニュアルを引用):
次の呼び出しが行われた場合 mysql_connect()と同じ 引数、新しいリンクはありません 確立されたが、代わりに、リンク すでに開いているリンクの識別子 返されます。
new_link パラメーターはこの動作を変更し、 mysql_connect()を常に開きます mysql_connect()があったとしても、新しいリンク 同じで前に呼び出された パラメータ。
問題の原因は何ですか?
複数のページに並行してアクセスしようとしている可能性があります(たとえば、ブラウザで複数のタブを使用)、これは同時にウェブサイトを使用する複数のユーザーをシミュレートしますか?
多数のユーザーが同時にサイトを使用しており、 mysql_connect
と接続のクローズの間のコードに多くの時間がかかる場合、同時に多くの接続が開かれていることを意味します。 ..そして、限界:-(
それでも、あなたはアプリケーションの唯一のユーザーなので、最大200の同時接続が許可されていることを考えると、奇妙なことが起こっています...
さて、&quot; 接続が多すぎる&quot;および&quot; max_connections
&quot; ...
正しく覚えていれば、 max_connections
はMySQLサーバーに対して開くことができるあなたの接続数を制限しませんが、合計接続数 >それは、そのサーバーに対してサーバーに接続している誰でも開くことができます。
接続が多すぎる場合 接続しようとするとエラー mysqldサーバー、これはすべて 利用可能な接続は 他のクライアント。
許可される接続の数は max_connectionsによって制御されます システム変数。デフォルト値は 100.より多くの接続をサポートする必要がある場合は、より大きな値を設定する必要があります この変数の値。
したがって、実際には、問題はあなたからもコードからも発生していない可能性があります(実際には問題ないように見えます):そのMySQLサーバーに接続しようとしているのはあなただけではない(&quot;共有ホスティング&quot;)であり、同時に使用している人が多すぎる...
...そして私が正しいなら、それは、あなたが問題を解決するためにできることは何もありません:そのサーバーとその max_connection
が200に設定されているので、苦しみ続けます...
補足として:GoDaddyに戻ってそれについて尋ねる前に、誰かが今言ったことを検証できるといいですね^^
他のヒント
これに対処するのに約18か月かかりました( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-エラー/ )
最終的に私が持っていた(あなたに当てはまる)ソリューションは次のとおりです。
- MySQLTuner に従ってデータベースを調整します。
- この投稿に基づいて、テーブルを毎週デフラグします
投稿からのbashスクリプトの最適化:
#!/bin/bash
# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"
for fragment in $FRAGMENTED_TABLES; do
database="$( echo $fragment | cut -d. -f1 )"
table="$( echo $fragment | cut -d. -f2 )"
[ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
OPTIMIZE TABLE $table;" > /dev/null 2>&1
done
永続的な接続を使用していないことを確認してください。これは通常、悪い考えです。
あなたがそれを持っているなら..せいぜい、Apacheプロセスがあるのと同じくらい多くの接続をサポートする必要があります。 max_connections設定を変更できますか?
データベースサーバーが完全にあなた専用であることを完全に確信していますか?
ルートとしてdatbaseにログオンし、&quot; SHOW PROCESSLIST&quot;を使用します。接続している人を確認します。理想的には、これを監視システムにフックして、時間とともに存在する接続の数を表示し、接続が多すぎる場合にアラートを出します。
最大データベース接続はmy.cnfで設定できますが、メモリまたはアドレススペースが不足することに注意してください。
シェルアクセスがある場合は、netstatを使用して、データベースに対して開かれているソケットの数とその発信元を確認します。
Linuxでは、次のように入力します:
netstat -n -a |grep 3306
Windowsで次のように入力します:
netstat -n -a |findstr 3306
解決策はこれらのうちの1つであり、MCQAテストでこれに遭遇しましたが、どれが正しいか理解していませんでした!
my.cnfでこれを設定&quot; set-variable = max_connections = 200&quot;
コマンド&quot; SET GLOBALmax_connections = 200&quot;を実行します
mysqlサーバーに接続するには、常にmysql_connect()関数を使用します
mysqlサーバーに接続するには、常にmysql_pconnect()関数を使用します
次の解決策が考えられます。
1) mysqlでグローバル変数を設定して、最大接続設定を増やします。
set global max_connection=200;
注:サーバーの負荷が増加します。
2)以下のように接続プールを空にします:
フラッシュホスト;
3) processListを確認し、特定のプロセスリストが必要ない場合は強制終了します。
あなたはこれを参照するかもしれません:-