mita2 database life

主にMySQLに関するメモです

MySQLの管理者用ネットワークインタフェース(administrative network interface)を試す


MySQL 8.0.14 から DB管理者用 に追加でネットワークインタフェースを設けることができるようになりました。

このように、接続あふれを起こしているときでも、管理者用IFであれば接続できます。

$ mysql -P3306 -uroot -pPass%word123 -h db01
ERROR 1040 (HY000): Too many connections


# 3307の管理者用IFに接続
$ mysql -P3307 -uroot -pPass%word123 -h db01
mysql


利用するには、admin_port と admin_address を設定します。ポート番号(admin_port)だけでなく、LISTENするIPアドレス(admin_address)も指定する必要があります。

[mysqld]
admin_address=db01
admin_port=3307

admin_address を省略したり、ワイルドカードを使うことはできないようです。
ポート番号だけ、変えられれば十分なんだけどな。。。

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_admin_address
If this variable is not specified at startup, the server maintains no administrative interface.
The value cannot specify a wildcard address format (*, 0.0.0.0, or ::)

このポートにはSERVICE_CONNECTION_ADMIN権限を持っていないと接続できません。

$ mysql -P3307 -uappuser -pPassword%123 -h db01
ERROR 1227 (42000): Access denied; you need (at least one of) the SERVICE_CONNECTION_ADMIN privilege(s) for this operation



実は、この機能を利用しなくても、特権ユーザであれば、max_connections+1までコネクションを貼ることができます。

# 非特権ユーザ
$ mysql -P3306 -uappuser -pPass%word123 -h db01
ERROR 1040 (08004): Too many connections

# root なら接続できる
$ mysql -P3306 -uroot -pPass%word123 -h db01
mysql> show global variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 3     |
+-----------------+-------+
1 row in set (0.01 sec)

# max_connections=3 に対して、4本目のセッションが貼れる
mysql> show processlist;
+----+-----------------+------------+------+---------+------+-------------------------------+------------------+
| Id | User            | Host       | db   | Command | Time | State                         | Info             |
+----+-----------------+------------+------+---------+------+-------------------------------+------------------+
|  5 | event_scheduler | localhost  | NULL | Daemon  |  238 | Waiting on empty queue        | NULL             |
|  9 | system user     |            | NULL | Connect |  238 | executing                     | NULL             |
| 12 | system user     |            | NULL | Query   |  238 | Slave has read all relay log; | NULL             |
| 32 | appuser         | db01:60348 | NULL | Sleep   |   71 |                               | NULL             |
| 33 | appuser         | db01:60350 | NULL | Sleep   |   69 |                               | NULL             |
| 34 | appuser         | db01:60352 | NULL | Sleep   |   67 |                               | NULL             |
| 36 | root            | db01:60356 | NULL | Query   |    0 | starting                      | show processlist |
+----+-----------------+------------+------+---------+------+-------------------------------+------------------+
7 rows in set (0.00 sec)


あくまでも、プラス1本だけなので、もう1個セッションを貼ろうとすると、拒否られる

$ mysql -P3306 -uroot -pPass%word123 -h db01
ERROR 1040 (HY000): Too many connections



トラブルシュートしていて、管理者が複数セッションを貼りたいというケースはよくあるので、admin_address/admin_port は役に立ちそうです