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 は役に立ちそうです。