Webサイト制作コースのお申し込みはこちら

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テーブルを確認する

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。