MySQLのコネクションとタイムアウトの設定について確認します。コネクションについては、「現在の接続数の確認方法」「最大同時接続数の変更方法」を紹介します。
(MySQL5.7で動作確認しています。)
目次
コネクション数の確認
起動後の累積接続数
( Connections
)
MySQLサーバー起動後のコネクション累積は以下のように確認できます。
mysql> SHOW STATUS LIKE 'Connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 5 |
+---------------+-------+
1 row in set (0.00 sec)
起動後の最大同時接続数
( Max_used_connections
)
MySQLサーバーを起動してから現在までの最大同時接続数は以下のように確認できます。
mysql> SHOW STATUS LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 3 |
+----------------------+-------+
1 row in set (0.00 sec)
現在の接続数
( Threads_connected
)
現在の接続数は以下のように確認できます。
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 3 |
+-------------------+-------+
1 row in set (0.00 sec)
SHOW PROCESSLIST
の数と一致します。
mysql> SHOW PROCESSLIST;
+----+------+------------------+--------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------------+--------+---------+------+----------+------------------+
| 2 | root | 172.28.0.1:64148 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 3 | root | 172.28.0.1:64156 | sample | Sleep | 12 | | NULL |
| 4 | root | 172.28.0.1:64160 | NULL | Sleep | 38 | | NULL |
+----+------+------------------+--------+---------+------+----------+------------------+
3 rows in set (0.00 sec)
最大同時コネクション数の上限を変更
SET GLOBAL max_connections
SET GLOBAL max_connections = 5;
を実行して、最大同時コネクション数の上限を5に変更します。
mysql> SHOW GLOBAL VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.01 sec)
mysql>
mysql> SET GLOBAL max_connections = 5;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> SHOW GLOBAL VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 5 |
+-----------------+-------+
1 row in set (0.00 sec)
動作確認
現在の接続に追加して、別途5つコネクションを接続した状態です。
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 6 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> SHOW PROCESSLIST;
+----+------+------------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------------+------+---------+------+----------+------------------+
| 3 | root | 172.28.0.1:64244 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 4 | root | 172.28.0.1:64248 | NULL | Sleep | 101 | | NULL |
| 5 | root | 172.28.0.1:64252 | NULL | Sleep | 95 | | NULL |
| 6 | root | 172.28.0.1:64256 | NULL | Sleep | 85 | | NULL |
| 7 | root | 172.28.0.1:64260 | NULL | Sleep | 63 | | NULL |
| 8 | root | 172.28.0.1:64264 | NULL | Sleep | 23 | | NULL |
+----+------+------------------+------+---------+------+----------+------------------+
6 rows in set (0.00 sec)
合計6接続です。
max_connections+1 クライアントの接続を許可します。
MySQLのドキュメントに上記のように記載されている通り、接続できる最大数の状態です。この状態で新しい接続を行ったところ、下記のようにエラーとなりました。
ERROR 1040 (HY000): Too many connections
クライアント側では、コネクションの上限を超えないように注意しましょう。
タイムアウト
設定を確認
タイムアウト系の設定は以下のように確認できます。
mysql> SHOW GLOBAL VARIABLES LIKE '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
13 rows in set (0.00 sec)
アイドルタイムアウト時間を変更
アイドルタイムアウト時間を変更してみます。
アイドルタイムアウト時間は、コネクション接続後、クエリを実行せずSleep状態でタイムアウトになる時間です。
設定パラメータは以下のようになります。
- 対話型接続の場合 →
interactive_timeout
- 非対話型接続の場合 →
wait_timeout
interactive_timeout
を 60秒
に変更します。
mysql> SET GLOBAL interactive_timeout=60;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> SHOW GLOBAL VARIABLES LIKE 'interactive_timeout';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 60 |
+---------------------+-------+
1 row in set (0.01 sec)
以下 Id=12
のプロセスはSleep状態で57秒経過しています。
mysql> SHOW PROCESSLIST;
+----+------+------------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------------+------+---------+------+----------+------------------+
| 9 | root | 172.28.0.1:64272 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 12 | root | 172.28.0.1:64284 | NULL | Sleep | 57 | | NULL |
+----+------+------------------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)
60秒経過したときプロセスが消えました。
mysql> SHOW PROCESSLIST;
+----+------+------------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------------+------+---------+------+----------+------------------+
| 9 | root | 172.28.0.1:64272 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
+----+------+------------------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
以下、該当のmysqlの対話画面です。クエリを発行しようとしたとき、以下のようにエラーがでて再接続が行われました。
mysql> SHOW DATABASES;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> SHOW DATABASES;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 13
Current database: *** NONE ***
(略)