こちらは以下の環境で実施しています。
$ mysql --version
mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)
mysql_config_editorを使ってログインできるようにする
MySQLのログイン時に、毎回律儀にホスト名、データベース名、ユーザー名を指定し、パスワードを打って入っていましたが、これをいちいち指定するのが面倒くさいなと気づきました。
mysql -h ホスト名 -D データベース名 -u ユーザー名 -p
調べてみると、mysql_config_editorを使うと、ログイン時にいちいちホスト名やパスワードを打たなくてよくなるらしい、とのことで試してみました1。
mysql_config_editor ユーティリティでは、.mylogin.cnf という名前の不明瞭化されたログインパスファイルに認証資格証明を格納できます。
.mylogin.cnfにログイン情報を格納するも、中身は不明瞭化されているんですね。
特にパスワードって、-pパスワードとすると怒られるし、それだとセキュリティにもよくないし、かといって毎回毎回打つのも面倒なので、それを扱いやすくしてくれるのはありがたいです。
mysql_config_editor は、.mylogin.cnf ファイルを不明瞭化してクリアテキストとして読み取れないようにし、クライアントプログラムによって不明瞭化されていない場合はその内容がメモリー内でのみ使用されるようにします。 このようにして、 パスワードをクリアテキスト以外の形式でファイルに格納し、後でコマンドラインまたは環境変数で公開しなくても使用できます。(太字引用者)
(ただし難読なだけで解読はできるようなので、利用時はその点に留意する必要がありそうです...)
mysql_config_editorでログイン情報をセットする
というわけで-G(作成するログインパス)をlocalに指定し、ホスト名・ユーザー名を指定。Enter password:でパスワードを入力すると完了。
$ mysql_config_editor set -G local -h localhost -u test -p
Enter password:
たしかにcat .mylogin.cnfとしても何が書いてあるのか分からないです。
$ cat .mylogin.cnf
J����Xq��8��uv�?G�رr��h� m0�/mi�\2H�њ�MOx�N]0����h �I�c�o
mysql_config_editor print --allを使って初めてmysql_config_editorでセットした接続情報が確認できます(パスワードは伏せ字)。
$ mysql_config_editor print --all
[local]
user = test
password = *****
host = localhost
こうしてmysqlの後に--login-path=nameをオプションを指定することで簡単にログインが可能になりました。
$ mysql --login-path=local
なお、--login-pathオプションに指定するnameはmysql_config_editor setの際に--login-path=name または-G nameで指定したnameになります(今回はlocal)。
mysql_config_editorを使ったログインでもデータベースを指定したい
さて、前置きが長くなりましたが本題です。
mysql_config_editorではログイン時のデータベースを指定することができません。
$ mysql_config_editor set -G local -h localhost -u test -D sample -p
mysql_config_editor: [ERROR] mysql_config_editor: unknown option '-D'.
現状で指定できるのは「ホスト名」「パスワード」「TCP/IP ポート番号」「Unix ソケットファイル名」「ユーザー名」となっています。
自分の場合は、ログイン時に利用するデータベースは固定だったので、ログインしてからいちいちUSE データベース名;するのが面倒でした。
そして、「mysql_config_editorを使ったログインでもデータベースを指定できないのかー!?」と血眼に探し回る羽目になったので、自戒を込めて記しておきます。
1. mysqlコマンドのオプションとして渡す
なんでこのことに気付かなかったのか...。
mysql_config_editorはログインパスファイルを書き出すのが役目であり、それを利用するのはmysqlです。だからmysql_config_editorでおこなった設定をmysql --login-path=nameとして利用しているわけなので...普通にオプションとしてデータベース名を渡せばいい...。
$ mysql --login-path=ログインパス名 -D データベース名
2. my.cnfでdatabaseを指定しておく
ただ先述の方法では結局ログイン時にデータベースを指定しなければいけない煩わしさがあるので、可能であれば設定ファイルでdatabaseのデフォルトを設定しておくと楽です。
オプション情報は以下のファイルの順で優先されるようになっています。
$ mysql --help | grep .cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
適宜いずれかのmy.cnfにて[client]の下にdatabaseの値を追記します。
[client]
# デフォルトのデータベース
database=データベース名
MySQLを再起動し、この設定が反映されると、mysql --login-path=ログインパス名とした時も、ログイン後はデフォルトのdatabaseを選択した状態から始められます2。
ちなみに「補完効かないし、mysql --login-path=ログインパス名って書くのも面倒じゃね?」という方は以下蛇足
を参考にしていただければ。
【蛇足
】clientログインパスを利用する
先の例では--login-pathに任意のnameを指定する方法でしたが、このnameをclientにしておくとnameを指定しなくてもログインできます。
# -Gを指定しないと-G clientとなる
$ mysql_config_editor set -h localhost -u test -p
Enter password:
# 以下はmysql --login-path=clientということ
$ mysql --login-path=
この時、.mylogin.cnfのclientログインパスを見に行ってログインをするようです。
使用するログインパスを明示的に示す --login-path=name オプションを指定しない場合、mysql_config_editor はデフォルトで client ログインパスを操作します。(太字引用者)
さらに言えば、clientログインパスを設定した場合はmysqlとしただけでclientログインパスを利用してログインができます。
$ mysql
これは以下を利用しています。
-
.mylogin.cnfの優先順位はほかのオプションファイルより高い -
--login-pathオプションを指定しない場合、デフォルトではmysqlクライアントはログインパスファイル、オプションファイルから[client]および[mysql]グループを読み取る
クライアントプログラムを起動してサーバーに接続すると、クライアントは .mylogin.cnf を他のオプションファイルとともに使用します。 その優先順位はほかのオプションファイルより高くなりますが、クライアントのコマンド行で明示的に指定されたオプションよりは低くなります。(太字引用者)
優先順位は、コマンドのオプション > .mylogin.cnf > ほかのオプションファイル なのですね。デフォルトで使用したいログインは、mysql_config_editorであらかじめ設定しておくのが楽そうです。
clientログインパスとそれ以外のログインパスを併用する場合の注意事項
公式の説明だと、--login-path=mypathと指定した場合でも、ログインパスの[mypath]だけを見に行くわけではなく、他のオプションファイルも見に行っているようです。結構見に行くところ多いんだなと思いました(小並)。
他のオプションファイルから[client]と[mysql]を読み取り、ログインパスファイルから[client]、[mysql]および[mypath]を読み取ります。
ちょっとこのログインパスファイルから[client]、[mysql]および[mypath]を読み取ります。の部分における優先順位が気になって、以下の様に[mypath]ログインパスと[client]ログインパスを用意してみました。
$ mysql_config_editor print --all
[client]
user = root
password = *****
host = localhost
[mypath]
user = test
password = *****
host = localhost
そして[mypath]ログインパスを指定してログインします。
$ mysql --login-path=mypath
ログイン中のユーザーを確認してみると、[mypath]ログインパスのユーザーになっていました![]()
文書の書きぶりからログインパスの優先順位が気になりましたが、ログインパスを指定すれば、それが優先されるようで安心しました。
mysql> select USER();
+-----------------------------+
| USER() |
+-----------------------------+
| test@localhost |
+-----------------------------+
...ん?![]()
mysql_config_editor では、ログインパスが作成順にログインパスファイルに追加されるため、最初により一般的なログインパスを作成し、後でより具体的なパスを作成する必要があります。(太字引用者)
ここで言う「一般的なログインパス」というのがclientログインパスを指していると思われます。
つまり、ログインファイルパスに書き込む順番を clientログインパス → その他のログインパス にする必要があるということのようです。
試しにログインファイルパスでの並び順をその他のログインパス → clientログインパスとしてみました。
$ mysql_config_editor print --all
[mypath]
user = test
password = *****
host = localhost
[client]
user = root
password = *****
host = localhost
この状態でmysql --login-path=mypathとすると...
mysql> select USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
clientログインパスでのログインになっている!--login-path=mypathじゃない!![]()
--login-path=mypathと指定した場合でも、ログインパスファイルにあるclientログインパスは見に行くので、後書きの設定がオーバーライドされるようです。
これはちょっと要注意ですね。
clientログインパスを用いる場合は、それを最初に設定しておく、それ以外のログインパスはclientログインパスの後に設定する、としておくのが良さそうです。
なんだか蛇足
が長くなってしまいましたが要するに、clientログインパスを使うとログイン時に--login-path=ログインパス名と指定しなくてもよくなるが、clientログインパスはすべてのクライアントプログラムによって読み取られるので、他のログインパスと併用する場合も考えて最初に設定しておこう、ということでした。