web-dev-qa-db-ja.com

MySQLでのユーザーログインに応じて接続タイムアウトを設定する方法

現在、スリープ状態で100を超える接続があります。

一部の接続は永続的な接続であるため、スリープ状態のままである必要があります(閉じないでください)が、一部の接続(異なるユーザー名)はいくつかのphpスクリプトからのものであり、非常に高速にタイムアウトする必要があります。

ユーザーごとにwait_timeoutを設定することは可能ですか?はいの場合、どのように?

19
acemtp

ユーザーごとのタイムアウト設定はありませんが、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を変更しても、他の同時セッションに影響がないことを証明することもできます。

27
Bill Karwin

my.confに次の変数を設定する必要があります。

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout自動接続のタイムアウトです(私の意見では、Webサーバーで30を超えると多すぎます)。
interactive_timeoutは、アイドルセッションのコンソールインタラクションタイムアウトです。

5
Sych

別の可能性:MySQLは、非対話型クライアント用の_wait_timeout_と対話型クライアント用の_interactive_timeout_の2つの異なるタイムアウト変数をサポートします。

対話型クライアントと非対話型クライアントの違いは、接続時に_CLIENT_INTERACTIVE_オプションを指定したかどうかだけのようです。

どういうわけかmysql_real_connect()にそのオプションを_client_flag_パラメータに渡させる必要があるため、これが役立つかどうかはわかりません。使用している言語またはインターフェースがわからないため、この接続フラグを指定できるかどうかはわかりません。

とにかく、そのクライアントフラグを渡すことができ、2つの異なるタイプのユーザーのみが必要な場合は、MySQLサーバー構成で_wait_timeout_と_interactive_timeout_を異なる方法で構成し、値が短い方を使用できます。特定のセッションをすぐにタイムアウトさせたい場合。

2
Bill Karwin

Connector/J を使用する場合、次のようにクライアントのJDBC URLでsessionVariablesを使用できます。jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

他の言語用の他のコネクタはおそらく同じことを可能にします。

2
Toddius Zho

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";

1

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のMaxServersMaxSpareServersMinSpareServers、およびStartServersを構成して、そうでないときにあまり多くの接続がハングアップしないようにすることを検討する必要があります。必要です。

0
Gary Richardson

http://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html

Pt-killを使用して、ユーザーごとに接続を強制終了することができます。これをスケジュールするか、これを処理するためのバックグラウンドジョブを設定できます。

0
ferensick