LoginSignup
1
0

More than 1 year has passed since last update.

mysql_config_editorを使ったログインでもデータベースを指定したい

Posted at

こちらは以下の環境で実施しています。

$ 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オプションに指定するnamemysql_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の値を追記します。

my.cnf
[client]
# デフォルトのデータベース
database=データベース名

MySQLを再起動し、この設定が反映されると、mysql --login-path=ログインパス名とした時も、ログイン後はデフォルトのdatabaseを選択した状態から始められます2

ちなみに「補完効かないし、mysql --login-path=ログインパス名って書くのも面倒じゃね?」という方は以下蛇足:snake:を参考にしていただければ。

【蛇足:snake:clientログインパスを利用する

先の例では--login-pathに任意のnameを指定する方法でしたが、このnameclientにしておくとnameを指定しなくてもログインできます。

# -Gを指定しないと-G clientとなる
$ mysql_config_editor set -h localhost -u test  -p
Enter password:
# 以下はmysql --login-path=clientということ
$ mysql --login-path=

この時、.mylogin.cnfclientログインパスを見に行ってログインをするようです。

使用するログインパスを明示的に示す --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]ログインパスのユーザーになっていました:smile:
文書の書きぶりからログインパスの優先順位が気になりましたが、ログインパスを指定すれば、それが優先されるようで安心しました。

mysql> select USER();
+-----------------------------+
| USER()                      |
+-----------------------------+
| test@localhost              |
+-----------------------------+

...ん?:eyes:

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じゃない!:ghost:

--login-path=mypathと指定した場合でも、ログインパスファイルにあるclientログインパスは見に行くので、後書きの設定がオーバーライドされるようです。

これはちょっと要注意ですね。
clientログインパスを用いる場合は、それを最初に設定しておく、それ以外のログインパスはclientログインパスの後に設定する、としておくのが良さそうです。

なんだか蛇足:snake:が長くなってしまいましたが要するに、clientログインパスを使うとログイン時に--login-path=ログインパス名と指定しなくてもよくなるが、clientログインパスはすべてのクライアントプログラムによって読み取られるので、他のログインパスと併用する場合も考えて最初に設定しておこう、ということでした。

  1. 本文で使用している引用文は、全て公式リファレンスからの引用です。

  2. World-writable config file 'my.cnfのパス' is ignored.というエラーが出ている場合は、そのmy.cnfのパーミッションを644に変更する必要があります。参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0