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ユーザーのパスワードを再設定してみてください。
-
my.cnfをviで開きます。
CentOS の場合:
# vi /etc/my.cnf
Ubuntu の場合:
# vi /etc/mysql/my.cnf
-
[mysqld]の下に skip-grant-tables を追加します。
[mysqld] skip-grant-tables
-
MySQLを再起動します。
CentOS の場合:
# systemctl restart mysqld
Ubuntu の場合:
# systemctl restart mysql
-
MySQLに接続します。
# mysql -u root
-
以下を実行します。
mysql> flush privileges;
-
rootユーザーの新しいパスワードを設定します。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
- quitでデータベースから切断します。
mysql> quit
-
再度my.cnfをviで開き先ほど追加した skip-grant-tables を削除するかコメントにします。
-
MySQLを再起動します。
CentOS の場合:
# systemctl restart mysqld
Ubuntu の場合:
# systemctl restart mysql
-
改めて新しいパスワードで接続できることを確認してください。
# mysql -u root -p
公開日時:2019年06月01日 02:54:25
最終更新日時:2024年07月08日 08:13:34