MySQL道普請便り

第214回MySQL ShellでMySQLに接続してみる

MySQL Shellは、本連載でも何度か取り上げられているmysqlコマンドラインクライアントと同等以上の機能を提供してくれるクライアントです。MySQL ShellはMySQL 5.7がGAになった5.7.12から使用できるようになっています。

今回は、MySQL Shellを使ったMySQLへの接続方法に関して説明していきたいと思います。

検証環境

今回はDockerで建てたMySQLを使用します。以下のコマンドでDockerを建てて、ローカルからアクセスをします。

% docker run --platform linux/x86_64 -p 127.0.0.1:3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_USER=kk2170 -e MYSQL_PASSWORD=my-secret-pw -d mysql:8.0.36

今回はMySQL Shellをインストールして実行していきますが、一旦従来のmysqlクライアントでアクセスが可能であることを確認しましょう。方法は以下の通りになります。

% mysql -uroot -pmy-secret-pw -h127.0.0.1 -P3307

執筆時点では、以下の通りMySQL 8.0.36を使用しております。

mysql>  select version();
+-----------+
| version() |
+-----------+
| 8.0.36    |
+-----------+
1 row in set (0.01 sec)

MySQL Shellを使ってみる

今回使用したDockerイメージにはMySQL Shellが同梱されています。そのため、試しに使用してみたいだけの場合は、Dockerイメージの中に入ってMySQL Shellを起動するmysqlshコマンドを実行するだけで試すことができます。

検証環境用として実行しているMySQLに対して、docker execコマンドを使用してコンテナ内に入ってみましょう。docker psコマンドでコンテナidかコンテナ名を取得し、取得したコンテナidかコンテナ名を指定してコンテナ内に入りましょう。今回は、コンテナidを指定してコンテナ内部に入っています。

% docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                               NAMES
b6239bf701f3   mysql:8.0.36   "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp   youthful_chaplygin

% docker exec -it b6239bf701f3 bash
bash-4.4#

Dockerコンテナの中に無事は入れたので、mysqlshコマンドを実行してみます。今回は特に引数を付けず、一旦mysqlshだけで実行します。mysqlコマンドと同様に何も指定しなかった場合、ローカルのMySQLにUnixドメインソケット接続となります。

bash-4.4# mysqlsh
Cannot set LC_ALL to locale en_US.UTF-8: No such file or directory
Please provide the password for 'root@/var%2Frun%2Fmysqld%2Fmysqld.sock':

初回接続の場合は、上記のようにパスワードを求められます。今回のように検証環境と同様に立ち上げている場合は、my-secret-pwを入れてあげましょう。すると下記のように接続情報を保存するか確認が出るので、接続先に関する接続情報を保存したい場合はYを、したくない場合はNを、次回接続時に保存するかどうか確認ダイアログを出してほしくない場合はvを入力します。デフォルトはNなので、何も入力しないと保存されません。

Save password for 'root@/var%2Frun%2Fmysqld%2Fmysqld.sock'? [Y]es/[N]o/Ne[v]er (default No):

上記の設定を済ませると、以下のように接続が完了したことがわかります。

MySQL Shell 8.0.36

Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a Classic session to 'root@/var%2Frun%2Fmysqld%2Fmysqld.sock'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  localhost  JS >

パスワードや権限が間違っている場合は下記のようなエラーが発生するので、間違っていないか確認をしてみてください。

MySQL Shell 8.0.36

Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a Classic session to 'root@/var%2Frun%2Fmysqld%2Fmysqld.sock'
MySQL Error 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

MySQL Shellを停止する

まずは起動したMySQL Shellを停止しましょう。\quitコマンドを入力すると停止することができます。

MySQL  localhost  JS > \quit
Bye!
bash-4.4#

安全にMySQL Shellを終了できるようになったので、いろいろと試してみましょう。

MySQL ShellでSQLを実行してみる

抜けた後、もう一度mysqlshでMySQL Shellにログインしましょう。

bash-4.4# mysqlsh
 〈中略〉
 MySQL  localhost  JS >

まずは、MySQLサーバにどの様なデータベースがあるか確認する show databaseを実行してみたいと思います。\sql を先頭に入力して、その後に実行したいSQL文を入力すると実行することができます。

 MySQL  localhost  JS > \sql show databases;
Fetching global names for auto-completion... Press ^C to stop.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.0014 sec)

データベーススキーマを変更したい場合は、\use データベース名で変更できます。今回はinformation_schemaデータベースを指定してみたいと思います。

 MySQL  localhost  JS > \use information_schema
Default schema set to `information_schema`.
 MySQL  localhost  information_schema  JS >

このようにスキーマが左側に明示されるようになります。

ホストやユーザを指定して接続してみる

ここまではUnixドメインソケットを利用した接続をしていましたが、実際にはMySQLサーバが別ホストにある場合やユーザーがrootではない場合がほとんどだと思います。その際にどうしたら良いのかを紹介していきます。まずホストを指定したい場合は、--host= 指定したいホスト名を指定します。

bash-4.4# mysqlsh --host=127.0.0.1
 〈中略〉
 MySQL  127.0.0.1:3306 ssl  JS >

今までのMySQL Shellの画面と表示されている接続先情報がlocalhostから127.0.0.1:3306に変わっていることがわかります。このように接続情報を変更できます。

ユーザを変更したい場合は--user=ユーザ名を指定します。今回はkk2170というユーザーを用意しているので指定してみましょう。

bash-4.4# mysqlsh --user=kk2170
Cannot set LC_ALL to locale en_US.UTF-8: No such file or directory
Please provide the password for 'kk2170@/var%2Frun%2Fmysqld%2Fmysqld.sock': ************
Save password for 'kk2170@/var%2Frun%2Fmysqld%2Fmysqld.sock'? [Y]es/[N]o/Ne[v]er (default No): N
 〈省略〉
 MySQL  localhost  JS >

現在の接続しているユーザーを確認するuser関数を使用して、ユーザー名を確認してみましょう。

 MySQL  localhost  JS > \sql select user();
Fetching global names for auto-completion... Press ^C to stop.
Error during auto-completion cache update: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation
+------------------+
| user()           |
+------------------+
| kk2170@localhost |
+------------------+
1 row in set (0.0004 sec)

ということで、指定したユーザーであるkk2170で接続できていることがわかります。

まとめ

今回はMySQL 5.7.12から導入されているMySQL Shellの接続方法や使用方法に関して簡単に説明させていただきました。

MySQL Shellは積極的に開発が推進されていて、たとえばこの連載の第153回 mysqlpumpを使ってバックアップを取ってみるで紹介させていただいたことがあるmysqlpumpというMySQLのバックアップツールは8.0.34でdeprecatedになってしまいましたが、その代わりにMySQL Shellの機能で同等以上のバックアップ機能が提供されていたりします。

なんとなく触るのを避けていた方もいらっしゃるかもしれませんが、ぜひ一度触ってみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧