MySQLへログイン access deniedエラーの原因調査にはroot@%アカウントをチェック
  • facebookページ
  • twitterページ
  • 2019.12.27

    MySQLへログイン access deniedエラーの原因調査にはroot@%アカウントをチェック

    MySQLのログインについてまとめています。

    以降の説明では、MySQL 5.7.28を前提としています。

    MySQLへログインするには、mysqlコマンドを使用

    mysqlコマンドを使って、MySQLにログインできます。

    MySQLのrootアカウント(パスワードは、my-secret-pwが設定されている前提)でログインするには、以下のコマンドを実行します。

    コマンドラインに-pでパスワードを指定すると、insecure(セキュアではない)という警告が表示されます。以下のように指定し、都度パスワードを入力すると、警告は出なくなります。

    MySQLにログインできない理由

    MySQLにログインできないケースを集めました。

    -pオプションは、空白なしで指定する

    -p(パスワードを指定)オプションの後ろに空白を入れると、パスワードとして認識されません。

    上記の意味は、「-p」で、パスワードを都度入力する、「my-secret-pw」というデータベースにログインするという指定になってしまいます。

    正しくは、以下のようにします。

    -uオプションは、空白あり、なし、どちらでもOK

    -pオプションは空白がないと、引数が正しく認識されませんでした。

    しかし、-uオプション(ログインするユーザ名を指定)は、空白あり・なしどちらも正しく認識されます。

    以下のコマンドどちらでも、MySQLへログインできます。

    -hオプションはlocalhost指定でログインできるが、127.0.0.1ではログインできない

    MySQLでは、内部的にlocalhostと127.0.0.1は別のものとして扱われます。

    そのため、localhost指定ではログイン成功、127.0.0.1指定だとaccess deniedでログイン失敗というケースが考えられます。

    具体的には、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のユーザ一覧は、mysql.userを参照 権限一覧やパスワードハッシュ一覧の取得方法

    上記の例だと、「root@%」と「root@localhost」が存在するので、-hオプションでlocalhost指定をした場合も、127.0.0.1を指定した場合もログイン可能です。

    MySQLにログイン後、どのようなユーザ名で認識されているかは、select current_user()を実行するとわかります。

    以下は、-h 127.0.0.1指定でログイン時の実行結果です。

    -h localhost指定でログイン時には、以下のようになります。

    mysql.userテーブルから、root@%アカウントをドロップして、動きを確認してみましょう。

    root@%のエントリが削除されました。

    以下のように、-h 127.0.0.1ではaccess denied、-h localhostではログイン成功する状態になりました。

    root@%とroot@localhostのパスワードが同じかどうか確認する方法

    以下のSQLで、パスワードのハッシュ値を確認できます。

    authentication_stringにパスワードのハッシュ値が格納されてます。

    「root@localhost」と、「root@%」には同じ値「*27C01464AD101AED1E65AC21152499A396B4CF72 」が格納されているため、同一のパスワードが設定されていることがわかります。

    なお、mysqlコマンドでパスワードが間違っている際にもaccess deniedエラーとなります。

    「root@localhost」と「root@%」のエントリがあるのにaccess deniedになる場合は、違うパスワードが設定されていないかどうか確認しましょう。

    まとめ

    ポテパンダの一言メモ
    • MySQLにログインするには、mysqlコマンドを使用
    • MySQLではlocalhostと127.0.0.1は別扱い
    • アカウント情報は、mysql.userテーブルを確認する


    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE