MySQLのユーザーログインに応じて接続タイムアウトを設定する方法
質問
現在、スリープ状態で100を超える接続があります。
一部の接続は永続的な接続であるため、一部のphpスクリプトからのものであり、非常に高速にタイムアウトさせたいので、一部の接続はスリープ状態のままでなければなりません(閉じないでください)。
ユーザーごとにwait_timeoutを設定できますか?はいの場合、方法は?
解決
ユーザーごとのタイムアウト設定はありませんが、 wait_timeout
値を動的に設定できます。つまり、特定のユーザーとして接続を確立した後、ステートメントを発行して、タイムアウト値をそのユーザーのセッションに必要な値に変更できます。
mysqlコマンドラインクライアントで次の実験を試してください:
mysql> SHOW VARIABLES LIKE 'wait_timeout';
...は28800(つまり8時間)と表示されます。これはデフォルトの wait_timout
です。
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は2つの異なるタイムアウト変数をサポートしています。非対話型クライアントの場合は wait_timeout
、対話型クライアントの場合は interactive_timeout
です。
インタラクティブクライアントと非インタラクティブクライアントの違いは、接続時に 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&quot ;;
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を使用すると、ユーザーごとに接続を強制終了できます。これをスケジュールするか、これを処理するバックグラウンドジョブを設定できます。