web-dev-qa-db-ja.com

ユーザー接続とは-作成および破棄されるのはいつですか?

外部サイトで断続的なエラーが発生しています。

警告:mysql_connect()[function.mysql-connect]:ユーザー '557574_prod'が 'max_user_connections'リソースを超えました(現在の値:10)

これは、サイトへのアクセスを防ぎ、事実上ダウンしています。

(明らかに 'max_user_connections'を増やすと問題が解決しますが、ホスティングスキームではオプションではありません)

私はそれを「修正」したかもしれませんが、問題を理解していることを100%確信していないので、明確にしたいと思います。問題の原因は、接続を使い切っているcronジョブが多すぎるためだと思いました(毎分2つ実行しています)。cronジョブの数を減らし、エラーの量が少なくなったようです。 cronジョブ用に別のユーザーアカウントを作成したので、それが問題であった場合は、今すぐ解決する必要があります。

しかし、私たちのロギングシステムはエラーが発生したときにそれを記録しないので、私はまだ心配しています。

MySQLで「user_connection」を構成するものは何ですか?

  • dB呼び出しごとに個別の接続はありますか?
  • そうでない場合、DB呼び出しに別の接続が必要になるのはいつですか?
  • このエラーがライブの本番サイトでのみ発生するのはなぜですか?おそらく、一意のIPまたはシミュレーターごとに個別の接続がありますか?

考えすぎだと思います。 。 。

7
JIStone

Mysql.userの構成に注意してください。

mysql> show create table mysql.user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
  `ssl_cipher` blob NOT NULL,
  `x509_issuer` blob NOT NULL,
  `x509_subject` blob NOT NULL,
  `max_questions` int(11) unsigned NOT NULL DEFAULT '0',
  `max_updates` int(11) unsigned NOT NULL DEFAULT '0',
  `max_connections` int(11) unsigned NOT NULL DEFAULT '0',
  `max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
  `plugin` char(64) COLLATE utf8_bin DEFAULT '',
  `authentication_string` text COLLATE utf8_bin,
  PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
1 row in set (0.00 sec)

列max_user_connectionsに注目してください。これは、ユーザーが1時間に作成できる接続数に一時停止を課します。ユーザー '557574_prod'がmysqlに1時間以内に何回も接続していないことを確認してください。

これは、/ etc/my.cnfで設定できるオプションmax_user_connectionsと組み合わせて使用​​されます

/etc/my.cnfのmax_user_connectionsを変更するか、個々のユーザーがこの列を設定している場合は、その列mysql.user.max_user_connectionsを変更してください。 my.cnfに対する構成制御がなく、mysqlスキーマに対してSQLを実行できない場合は、ホスティング会社にこれらの制限を引き上げるように頼み、要請してください。

Max_user_connectionsをセッション変数として設定できると思いますが、特定の特権、おそらくSUPERが必要になる場合があります。

接続の確立に関しては、それらの接続を開いたままにする必要があります。おそらく、SELECTを実行して、何らかのハートビートを送信します。しかし、何を推測しますか??? db列のmax_questionsは1時間あたりのSELECTクエリを監視し、max_updatesは1時間あたりのINSERT、UPDATE、DELETEを監視します。 mysql.userでこれらの列を確認する必要がある場合があります。あなたはすぐにそれらの数をチェックすることができます:

SHOW GRANTS;

ユーザーの1時間あたりの接続制限がスレッドごとかユーザーごとかはわかりません。 2つまたは3つのDB接続を同時に使用して積極的にDBに接続することで、すばやく応答でき、エラーメッセージが表示されます。おそらく「SHOW STATUS LIKE 'Connections';」のように、接続の数を数える方法はあなた次第です。 1つの接続内の接続の最大制限に達するか、またはすべての接続の接続ステータス値の合計である必要があります。

Wait_timeoutとinteractive_timeoutの値も確認してください。スタンドアロンサーバーでは、デフォルトは28800です。すでに設定されている可能性があります。現在の接続では設定できません。次のようにそれらを設定できる必要があります:(今後の新しい機能の場合)

SET GLOBAL interactive_timeout = 86400;
SET GLOBAL wait_timeout = 86400;

これらのコマンドも実行できない場合は、お悔やみ申し上げます!!! :(

10
RolandoMySQLDBA