現在、スリープ状態で100を超える接続があります。
一部の接続は永続的な接続であるため、スリープ状態のままである必要があります(閉じないでください)が、一部の接続(異なるユーザー名)はいくつかのphpスクリプトからのものであり、非常に高速にタイムアウトする必要があります。
ユーザーごとにwait_timeoutを設定することは可能ですか?はいの場合、どのように?
ユーザーごとのタイムアウト設定はありませんが、wait_timeout
値を動的に設定できます。つまり、特定のユーザーとして接続を確立した後、ステートメントを発行して、タイムアウト値をそのユーザーのセッションで必要な値に変更できます。
Mysqlコマンドラインクライアントで次の実験を試してください。
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...デフォルトのwait_timout
である28800(つまり、8時間)を表示します。
mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';
... 60を示しています。
その後、セッションを終了して再接続すると、デフォルトのwait_timeout
は28800になります。したがって、現在のセッションのスコープに制限されます。
2番目のウィンドウを開いて別のmysqlクライアントセッションを開始し、1つのセッションでwait_timeout
を変更しても、他の同時セッションに影響がないことを証明することもできます。
my.conf
に次の変数を設定する必要があります。
[mysqld]
interactive_timeout=180
wait_timeout=180
wait_timeout
は自動接続のタイムアウトです(私の意見では、Webサーバーで30を超えると多すぎます)。interactive_timeout
は、アイドルセッションのコンソールインタラクションタイムアウトです。
別の可能性:MySQLは、非対話型クライアント用の_wait_timeout
_と対話型クライアント用の_interactive_timeout
_の2つの異なるタイムアウト変数をサポートします。
対話型クライアントと非対話型クライアントの違いは、接続時に_CLIENT_INTERACTIVE
_オプションを指定したかどうかだけのようです。
どういうわけかmysql_real_connect()
にそのオプションを_client_flag
_パラメータに渡させる必要があるため、これが役立つかどうかはわかりません。使用している言語またはインターフェースがわからないため、この接続フラグを指定できるかどうかはわかりません。
とにかく、そのクライアントフラグを渡すことができ、2つの異なるタイプのユーザーのみが必要な場合は、MySQLサーバー構成で_wait_timeout
_と_interactive_timeout
_を異なる方法で構成し、値が短い方を使用できます。特定のセッションをすぐにタイムアウトさせたい場合。
Connector/J を使用する場合、次のようにクライアントのJDBC URLでsessionVariablesを使用できます。jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600
他の言語用の他のコネクタはおそらく同じことを可能にします。
init_connectは、ユーザーがログインするたびに実行されるため、小さなcaseステートメントを記述して、ユーザーに基づいて値を設定できます。 init_connectはスーパーユーザーに対しては実行されないことに注意してください。
mysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE 'app1@%' THEN '30' ELSE @@wait_timeout END";
mysql.user
テーブルを確認しましたが、設定がないようです。
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | | |
| x509_issuer | blob | NO | | | |
| x509_subject | blob | NO | | | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.00 sec)
MySQLiとPDOのどちらを使用しているかに応じて、PHP MySQL接続は、リクエストが発生したときにハングアップするか、Apacheプロセスのプールで共有される必要があります。
たとえば、PDOを使用して、持続的接続をオフにするには(これがデフォルトだと思います)、次の方法でDBに接続します。
$ pdo = new PDO($ dsn、$ user、$ pass、Array(PDO :: ATTR_PERSISTENT => false));
スクリプトで持続的接続を使用したいが、スリープモードでデータベースに対して開いている接続が多すぎる場合は、ApacheのMaxServers
、MaxSpareServers
、MinSpareServers
、およびStartServers
を構成して、そうでないときにあまり多くの接続がハングアップしないようにすることを検討する必要があります。必要です。
http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html
Pt-killを使用して、ユーザーごとに接続を強制終了することができます。これをスケジュールするか、これを処理するためのバックグラウンドジョブを設定できます。