CLOVER🍀

That was when it all began.

MySQL Shellを使ってUnixドメインソケットでMySQLサーバーに接続する

これは、なにをしたくて書いたもの?

MySQLを扱う時のクライアントツールは、従来のMySQLクライアント(mysqlコマンド)からほぼMySQL Shellに移しています。
で、MySQL ShellでUnixドメインソケットでMySQLサーバーに接続しようとした時に最初どうしたらいいのかわからなかったので、
メモとして。

環境

今回の環境はこちら。

 MySQL  localhost:3306 ssl  practice  SQL > select version();
+-----------+
| version() |
+-----------+
| 8.4.2     |
+-----------+
1 row in set (0.0002 sec)

クライアントツールのバージョン。

$ mysql --version
mysql  Ver 8.4.2 for Linux on x86_64 (MySQL Community Server - GPL)


$ mysqlsh --version
mysqlsh   Ver 8.4.1 for Linux on x86_64 - for MySQL 8.4.1 (MySQL Community Server (GPL))

なお、各種クライアントはMySQLサーバーが動作しているホスト上で実行するものとします。

mysqlコマンドを使ってUnixドメインソケットでMySQLサーバーに接続する

まずは、mysqlコマンドを使ってUnixドメインソケットでMySQLサーバーに接続してみます。特にホスト名などなにも指定せずに実行すれば
OKです。

$ mysql -ukazuhira -p

statusコマンドで確認してみます。

mysql> status;

すると、Unixドメインソケットで接続できていることが確認できます。

UNIX socket:            /var/run/mysqld/mysqld.sock

statusコマンドはmysqlコマンド独自のコマンドで、現在接続しているサーバーの情報を出力してくれます。

MySQL :: MySQL 8.4 Reference Manual :: 6.5.1.2 mysql Client Commands

また、-S(または--socket)オプションでソケットファイルを直接指定することもできます。

$ mysql -ukazuhira -S /var/run/mysqld/mysqld.sock -p


$ mysql -ukazuhira --socket /var/run/mysqld/mysqld.sock -p

mysqlコマンドの場合はこれでOKです。

MySQL Shellを使ってUnixドメインソケットでMySQLサーバーに接続する

次は、MySQL Shellを使ってUnixドメインソケットでMySQLサーバーに接続してみます。

mysqlコマンドと似た感じで。

$ mysqlsh -ukazuhira -p --sql

ただ、接続後に現れたプロンプトを見ると接続先(サーバー側)のポート番号(今回は33060)が表示され、どう見てもTCP接続しています。

 MySQL  localhost:33060+ ssl  SQL >

実際、localhostのみを接続許可しているユーザーだと、このコマンドで弾かれたりします。

こういう指定でもダメです。

$ mysqlsh kazuhira@localhost --sql

33060ポートに接続していることになっています。

 MySQL  localhost:33060+ ssl  SQL >

ヘルプでも例は出てきません。

$ mysqlsh --help

ではどうすればいいのかというと、ドキュメントに正解が書いてあります。

MySQL :: MySQL Shell 8.4 :: 4.3.3 Connecting using Unix Sockets and Windows Named Pipes

MySQL Shellを使ってUnixドメインソケットで接続するには、以下の条件を満たす必要があります。

On Unix, MySQL Shell connections default to using Unix sockets when the following conditions are met:

  • A TCP port is not specified.
    • TCPポートを指定しない
  • A host name is not specified or it is equal to localhost.
    • ホスト名を指定しないか、localhostを指定する
  • The --socket or -S option is specified, with or without a path to a socket file.
    • --socketまたは-Sオプションを指定して、ソケットファイルへのパスを指定する、もしくは指定しない
    • 要するにオプションのみを書いて、ソケットファイルのパスは書かなくてもOK

つまり、こういうことですね。

$ mysqlsh -ukazuhira -S --sql -p

ポート番号の表示がなくなりました。

 MySQL  localhost+ ssl  SQL >

他の例。

$ mysqlsh kazuhira@localhost -S --sql


$ mysqlsh kazuhira@localhost --socket --sql


$ mysqlsh kazuhira@localhost --socket /var/run/mysqld/mysqld.sock --sql


$ mysqlsh kazuhira@localhost -S /var/run/mysqld/mysqld.sock --sql

ちなみに、ソケットファイルのパスを指定した場合はSSLの表記も消えました。

 MySQL  localhost  SQL >

おわりに

MySQL Shellを使って、UnixドメインソケットでMySQLサーバーに接続してみました。

mysqlコマンドと違って、ソケットファイルを使うことのオプションが必須だということに気づかず、少しハマりました。

もっとも、あまり使う機会はない気はしますけどね。機会があったら意識してみましょう。