これは、なにをしたくて書いたもの?
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コマンドと違って、ソケットファイルを使うことのオプションが必須だということに気づかず、少しハマりました。
もっとも、あまり使う機会はない気はしますけどね。機会があったら意識してみましょう。