MySQLに「'Access denied for user 'root'@'localhost'」で接続できない場合の対処法

カテゴリ:データベース

CeontOS 7やUbuntuなどのSystemd環境でMySQLに接続時に「mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost'」のエラーとなる場合があります。

原因1:sudoがない

詳細は後述しますが、ユーザーの認証プラグインの設定によって、ログイン方法が異なってきます。ユーザー名、パスワードが正しいにも拘わらずログインに失敗する場合は、まず原因の切り分けとして、OS に root ユーザー以外でログインしている場合は、mysql コマンドに sudo を付けてログインできるかを確認してみましょう。

sudo がない場合:

$ mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

sudo を付けた場合:

$ sudo mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.33-0ubuntu0.22.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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>

注意sudo を付けてログインできた場合、後述するように認証プラグインが auth_socket になっています。パスワード認証をさせたい場合は原因2の手順を実施してください。

原因2:認証プラグインがauth_socketになっている

sudo mysql -u root でログインできた場合、認証プラグインが auth_socket になっている可能性があります。

認証プラグインの確認のために、次のコマンドで MySQL にログインします。

$ sudo mysql

以下のコマンドを実行して対象ユーザーの認証プラグインを確認します。恐らく auth_socket になっているはずです。

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

NoteMySQL 8.0 からはデフォルトの認証プラグインが mysql_native_password ではなく auth_socket に変更されています。auth_socket はパスワードではなく UNIX ソケットを使用して認証するため、MySQL のユーザ名と OS のユーザ名が一致していればログインが許可されます。sudo は root ユーザーによる実行を意味しますので、 sudo mysql で MySQL に root ユーザーでログインできたのはそのためです。

パスワード認証に切り替えたい場合は、以下のコマンドでパスワードと共に認証プラグインを mysql_native_password に変更します。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

念のため、root ユーザーの認証プラグインが mysql_native_password に変更されたことを確認します。

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

注意上記コマンドを実行した場合、認証方式が変わるため、sudo mysql では MySQL にログインできなくなります。変更後は mysql -u root -p と入力して実行し、パスワード入力が求められるため設定したパスワードを入力してログインします。

原因3:パスワードが違う

上記に該当しない場合はパスワードが違う可能性があるため、以下の手順でMySQLのrootユーザーのパスワードを再設定してみてください。

  1. my.cnfをviで開きます。
    CentOS の場合:
    # vi /etc/my.cnf
    Ubuntu の場合:
    # vi /etc/mysql/my.cnf
  2. [mysqld]の下に skip-grant-tables を追加します。
    [mysqld]
    skip-grant-tables
  3. MySQLを再起動します。
    CentOS の場合:
    # systemctl restart mysqld
    Ubuntu の場合:
    # systemctl restart mysql
  4. MySQLに接続します。
    # mysql -u root
  5. 以下を実行します。
    mysql> flush privileges;
  6. rootユーザーの新しいパスワードを設定します。
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. quitでデータベースから切断します。
    mysql> quit
  8. 再度my.cnfをviで開き先ほど追加した skip-grant-tables を削除するかコメントにします。
  9. MySQLを再起動します。
    CentOS の場合:
    # systemctl restart mysqld
    Ubuntu の場合:
    # systemctl restart mysql
  10. 改めて新しいパスワードで接続できることを確認してください。
    # mysql -u root -p
以上です。

公開日時:2019年06月01日 02:54:25
最終更新日時:2024年07月08日 08:13:34

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

データベースに戻る

このページのトップに戻る