質問

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サーバーに対して開くことができるあなたの接続数を制限しませんが、合計接続数 >それは、そのサーバーに対してサーバーに接続している誰でも開くことができます。

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-エラー/

最終的に私が持っていた(あなたに当てはまる)ソリューションは次のとおりです。

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

投稿からの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を確認し、特定のプロセスリストが必要ない場合は強制終了します。


あなたはこれを参照するかもしれません:-

記事リンク

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top