MySQL Shellは、本連載でも何度か取り上げられているmysqlコマンドラインクライアントと同等以上の機能を提供してくれるクライアントです。MySQL ShellはMySQL 5.
今回は、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.
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_
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.
ユーザを変更したい場合は--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.
MySQL Shellは積極的に開発が推進されていて、たとえばこの連載の第153回 mysqlpumpを使ってバックアップを取ってみるで紹介させていただいたことがあるmysqlpumpというMySQLのバックアップツールは8.
なんとなく触るのを避けていた方もいらっしゃるかもしれませんが、ぜひ一度触ってみてはいかがでしょうか。