MySQLのログインについてまとめています。
以降の説明では、MySQL 5.7.28を前提としています。
MySQLへログインするには、mysqlコマンドを使用
mysqlコマンドを使って、MySQLにログインできます。
MySQLのrootアカウント(パスワードは、my-secret-pwが設定されている前提)でログインするには、以下のコマンドを実行します。
% mysql -u root -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.28 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
コマンドラインに-pでパスワードを指定すると、insecure(セキュアではない)という警告が表示されます。以下のように指定し、都度パスワードを入力すると、警告は出なくなります。
% mysql -u root -p Enter password:
MySQLにログインできない理由
MySQLにログインできないケースを集めました。
-pオプションは、空白なしで指定する
-p(パスワードを指定)オプションの後ろに空白を入れると、パスワードとして認識されません。
% mysql -u root -p my-secret-pw Enter password: ERROR 1049 (42000): Unknown database 'my-secret-pw'
上記の意味は、「-p」で、パスワードを都度入力する、「my-secret-pw」というデータベースにログインするという指定になってしまいます。
正しくは、以下のようにします。
% mysql -u root -pmy-secret-pw
-uオプションは、空白あり、なし、どちらでもOK
-pオプションは空白がないと、引数が正しく認識されませんでした。
しかし、-uオプション(ログインするユーザ名を指定)は、空白あり・なしどちらも正しく認識されます。
以下のコマンドどちらでも、MySQLへログインできます。
% mysql -uroot -pmy-secret-pw % mysql -u root -pmy-secret-pw
-hオプションはlocalhost指定でログインできるが、127.0.0.1ではログインできない
MySQLでは、内部的にlocalhostと127.0.0.1は別のものとして扱われます。
そのため、localhost指定ではログイン成功、127.0.0.1指定だとaccess deniedでログイン失敗というケースが考えられます。
% mysql -u root -h localhost -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. : : mysq> exit Bye % mysql -u root -h 127.0.0.1 -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
具体的には、localhost指定でログインすると「root@localhost」、127.0.0.1指定だと「root@%」という別ユーザとして扱われます。
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.3 アカウント名の指定
例えば、セキュリティを考慮した運用面から、「root@%」ユーザを削除している環境だと、127.0.0.1指定時のみログインに失敗します。
実際に試してみましょう。
MySQLのユーザアカウント情報は、mysql.userテーブルに格納されています。以下のSQLを実行すると、ユーザ名とhost名の一覧を取得できます。
mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | root | % | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | user0 | localhost | | user1 | localhost | +---------------+-----------+
【関連記事】
▶MySQLのユーザ一覧は、mysql.userを参照 権限一覧やパスワードハッシュ一覧の取得方法
上記の例だと、「root@%」と「root@localhost」が存在するので、-hオプションでlocalhost指定をした場合も、127.0.0.1を指定した場合もログイン可能です。
% mysql -u root -h 127.0.0.1 -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13 Server version: 5.7.28 MySQL Community Server (GPL) : : mysql>
MySQLにログイン後、どのようなユーザ名で認識されているかは、select current_user()を実行するとわかります。
以下は、-h 127.0.0.1指定でログイン時の実行結果です。
mysql> select current_user(); +----------------+ | current_user() | +----------------+ | root@% | +----------------+
-h localhost指定でログイン時には、以下のようになります。
mysql> select current_user(); +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+
mysql.userテーブルから、root@%アカウントをドロップして、動きを確認してみましょう。
mysql> drop user root@'%'; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | user0 | localhost | | user1 | localhost | +---------------+-----------+
root@%のエントリが削除されました。
以下のように、-h 127.0.0.1ではaccess denied、-h localhostではログイン成功する状態になりました。
% mysql -u root -h 127.0.0.1 -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES) % mysql -u root -h localhost -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15 Server version: 5.7.28 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
root@%とroot@localhostのパスワードが同じかどうか確認する方法
以下のSQLで、パスワードのハッシュ値を確認できます。
authentication_stringにパスワードのハッシュ値が格納されてます。
mysql> select user,host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | user | host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | *27C01464AD101AED1E65AC21152499A396B4CF72 | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | root | % | *27C01464AD101AED1E65AC21152499A396B4CF72 | | user1 | localhost | *5A767C0D9E22BF6774C7DE4CCC45067CD1D290A1 | | user0 | localhost | *AE399CE35FF8F5000D01BEA80A73A726CAB22335 | +---------------+-----------+-------------------------------------------+
「root@localhost」と、「root@%」には同じ値「*27C01464AD101AED1E65AC21152499A396B4CF72 」が格納されているため、同一のパスワードが設定されていることがわかります。
なお、mysqlコマンドでパスワードが間違っている際にもaccess deniedエラーとなります。
「root@localhost」と「root@%」のエントリがあるのにaccess deniedになる場合は、違うパスワードが設定されていないかどうか確認しましょう。
まとめ
- MySQLにログインするには、mysqlコマンドを使用
- MySQLではlocalhostと127.0.0.1は別扱い
- アカウント情報は、mysql.userテーブルを確認する