MySQLで障害時にprocesslistを表示したいが、接続クライアント数最大に達していて入れず、セッション消費してるはずのアプリ側デーモン止めてもクライアント数減らないような場合があると思います。
このような場合に、Javaのスレッドダンプ的に外から状況を吐かせたい、と思うことってありますよね。
んでそんなことをtwitterで嘆いていたら、とみたさんから
のように教えていただきました。
なんと、なにもしなくてもMySQLのrootアカウントなら1接続だけ入れるとのこと!
MySQL :: MySQL 5.6 リファレンスマニュアル :: B.5.2.7 接続が多すぎます
mysqld は実際には max_connections+1 クライアントの接続を許可します。余分な接続は、SUPER 権限を持つアカウントが使用するために予約されています。SUPER 権限を管理者に付与して、通常のユーザー (その権限の必要のないユーザー) に付与しないことによって、権限のないクライアントが最大数接続されていても、管理者はサーバーに接続して SHOW PROCESSLIST を使用し、問題を診断することができます。
まさにやりたかったことをやるために用意されている心づかいでした。
ちなみにflatさんからPostgreSQLにも同様の仕組みがあることを教えていただきました。
superuser_reserved_connections
PostgreSQLのスーパユーザによる接続のために予約されている接続
次、同じ障害出たらこれで processlist 取れるぞ!