web-dev-qa-db-ja.com

MySQLエラー「接続が多すぎます」

GoDaddy(linux)でホストされているサイトにMySQL 5.0を使用しています。

Webアプリでテストを行っていたところ、突然ページの更新が非常に遅いことに気付きました。最後に、長い間待った後、「MySQLエラー、接続が多すぎます...」という行に沿って何かを示しているページが表示され、データベースに接続するconfig.phpファイルが示されていました。

私はデータベースに接続するだけで、他のユーザーは接続していません。各ページの上部にconfig.phpファイルを含め、ページの最後でmysql接続を閉じます。間にいくつかのクエリがある場合があります。 mysql接続を十分に閉じていないのではないかと心配です(mysql_close())。

しかし、クエリを実行した後でそれらを閉じようとすると、ページに接続エラーが表示されます。私のページはPHPおよびHTMLです。クエリを閉じようとすると、次のページが接続されないようです。閉じるためにconfig.phpを再度含める必要があります。接続しますか?

2週間で約84人がこのウェブアプリケーションを使い始めたので、このエラーは私を怖がらせました。

ありがとう。

編集:

これが私のページの疑似コードです:

 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人がより安全な賭けになると思います。皆さんは同意しますか?

22
littleK

共有ホスティングプロバイダーは、通常、同じユーザーに対してかなり少量の同時接続を許可します。

あなたのコードがすることは:

  • mySQLサーバーへの接続を開く
  • それはものです(ページを生成する)
  • ページの最後で接続を閉じます。

最後のステップは、ページの最後で行われたときにmandatory:(quoting mysql_close のマニュアル):

永続的でないオープンリンクはスクリプトの実行の最後に自動的に閉じられるため、mysql_close()を使用する必要は通常ありません。

ただし、とにかく永続的な接続を使用しないでください。

2つのヒント:

  • 使用する mysql_connect insead of mysql_pconnect(すでに問題ありません)
  • Mysql_connectの4番目のパラメーターをfalseに設定します(デフォルト値なので、もう大丈夫です):(マニュアルの引用):

同じ引数を使用してmysql_connect()に2回目の呼び出しが行われた場合、新しいリンクは確立されませんが、代わりに、すでに開いているリンクのリンク識別子が返されます。

New_linkパラメータはこの動作を変更し、同じパラメータを使用してmysql_connect()が以前に呼び出された場合でも、mysql_connect()が常に新しいリンクを開くようにします。



それでは何が問題を引き起こす可能性がありますか?

たぶん、あなたは複数のページに並行してアクセスしようとしています(たとえば、ブラウザの複数のタブを使用して)、これは同時に複数のユーザーがウェブサイトを使用することをシミュレートしますか?

多くのユーザーが同時にサイトを使用していて、mysql_connectと接続のクローズには多くの時間がかかります。つまり、同時に多くの接続がオープンされることを意味します...そして、限界に達します

それでも、あなたがアプリケーションの唯一のユーザーであるため、最大200の同時接続が許可されていることを考えると、奇妙なことが起こっています...



too many connections」と「max_connections "...

もし私が正確に覚えていれば、 max_connectionsはMySQLサーバーに対して開くことができるあなたの接続数を制限しませんが、接続の合計数そのサーバーに接続できますサーバーに接続している誰もが

MySQLのドキュメントを引用---(Too many connections

Mysqldサーバーに接続しようとすると多すぎる接続エラーが発生する場合、これは利用可能なすべての接続が他のクライアントによって使用されていることを意味します。

許可される接続の数は、max_connectionsシステム変数によって制御されます。デフォルト値は100です。より多くの接続をサポートする必要がある場合は、この変数により大きな値を設定する必要があります。

したがって、実際には、問題はあなたやあなたのコードからではない可能性があります(実際には問題ありません):接続しようとしているのはあなただけではないということですそのMySQLサーバーに(「共有ホスティング」を思い出してください)、そして同時にそれを使用している人が多すぎます...

...そしてもし私が正しいなら、問題を解決するためにあなたができることは何もありません:データベースが多すぎる限り/そのサーバー上のユーザーとそのmax_connectionを200に設定すると、引き続き苦しみます...


補足として:GoDaddyに戻ってそれについて尋ねる前に、誰かが私が言ったことを検証できたらいいです^^

33
Pascal MARTIN

私はこれに対処するために約18か月ありました( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-エラー/

私が最後に持っていた(あなたに当てはまるであろう)解決策は:

  1. MySQLTuner に従ってデータベースを調整します。
  2. これに基づいて毎週テーブルをデフラグします post

投稿からの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
3
icc97

シェルアクセス権がある場合は、netstatを使用して、データベースに対して開かれているソケットの数とそれらのソケットを確認します。

Linuxでは、次のように入力します。

netstat -n -a |grep 3306

Windowsでは、次のように入力します。

netstat -n -a |findstr 3306

データベースサーバーが完全に専用であることを完全に確信していますか?

Rootとしてdatbaseにログオンし、「SHOW PROCESSLIST」を使用して誰が接続しているかを確認します。理想的には、これを監視システムに接続して、時間の経過とともに接続数を表示し、接続数が多すぎる場合は警告を発します。

最大データベース接続はmy.cnfで構成できますが、メモリまたはアドレス空間が不足しないように注意してください。

2
MarkR

永続的な接続を使用していないことを確認してください。これは通常悪い考えです。

もしそれができたら、せいぜい、Apacheプロセスと同じくらい多くの接続をサポートする必要があります。 max_connections設定を変更できますか?

2
Evert

ソリューションはこれらの1つである可能性があります。MCQAテストでこれに遭遇しました。どちらが正しいかわからなかったのですが!

これをmy.cnfに設定します "set-variable = max_connections = 200"

コマンド「SET GLOBALmax_connections = 200」を実行します

Mysqlサーバーに接続するには、常にmysql_connect()関数を使用します

Mysqlサーバーに接続するには、常にmysql_pconnect()関数を使用します

1
Nitesh

以下は可能な解決策です:

1)mysqlでグローバル変数を設定して、最大接続設定を増やします。

set global max_connection=200;

注:サーバーの負荷が増加します。

2)次のように接続プールを空にします。

FLUSH HOSTS;

3)プロセスリストを確認し、必要がない場合は特定のプロセスリストを強制終了します。


これを参照してください:-

記事リンク

0
dilraj singh