`mysql -u root -p` でERROR 1698 (28000): Access denied for user 'root'@'localhost'と表示されるときの解決方法
mysql_secure_installation
でroot
のパスワードを設定した後、mysql -u root -p
としたときに以下のようにエラーが出て困ったので、解決方法をまとめます。
$ mysql -u root -p Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
環境
事象
$ sudo apt install mysql-server
でMySQL 5.7をインストールした後、mysql_secure_installation
で初期設定を行いました。
mysql_secure_installation
では最初にrootのパスワードを設定するように言われるので、パスワードを設定して指示に従って最後まで設定を進めました。
$ sudo mysql_secure_installation Securing the MySQL server deployment. Connecting to MySQL using a blank password. The 'validate_password' plugin is installed on the server. The subsequent steps will run with the existing configuration of the plugin. Please set the password for root here. New password: Re-enter new password: ...(略)
しかしこのパスワードを使ってmysqlにアクセスしようとすると権限で弾かれます。
$ mysql -u root -p Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
ちなみに、sudo mysql -u root
であればエラーせずに入れました。
原因
MySQL 5.7では認証にauth_socket plugin
(MySQL :: Security in MySQL :: 6.1.11 Socket Peer-Credential Pluggable Authentication)
というものを使っていて、これを使っているとパスワードではアクセスできず、MySQLのユーザー名と、システムのユーザー名が一致しているときのみアクセスできるようです。
次のようにして確かめられます。
$ sudo mysql -u root mysql> USE mysql; mysql> SELECT User, Host, plugin FROM mysql.user; +------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | root | localhost | auth_socket | | mysql.session | localhost | mysql_native_password | | mysql.sys | localhost | mysql_native_password | | debian-sys-maint | localhost | mysql_native_password | +------------------+-----------+-----------------------+
通常のパスワードで入るには、mysql_native_password plugin
を使います。
mysql_secure_installation
でパスワードを設定したならauth_socket
からmysql_native_password
に勝手に変更していてほしいですが、バグのようでそうなっていません。
解決方法
解決方法は2つあります。
- rootの認証を
mysql_native_password plugin
を使うように変える。 - システムユーザーと同じ名前のユーザーを
auth_socket plugin
を使うように作り、mysql -u {system-user-name}
でアクセスするようにする。
1. rootの認証をmysql_native_password plugin
を使うように変える
$ sudo mysql -u root mysql> USE mysql; mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root'; mysql> FLUSH PRIVILEGES; mysql> exit; $ sudo service mysql restart $ mysql -u root -p Enter password:
2. システムユーザーと同じ名前のユーザーをauth_socket plugin
を使うように作り、mysql -u {system-user-name}
でアクセスするようにする
以下のYOUR_SYSTEM_USER
とNEW_PASSWORD
を置き換えてください。
パスワードはauth_socket
を使う場合は使うことがないですが、mysql_secure_installation
で設定したバリデーションに引っかからないような文字列を入力しないとuserが作れません。
$ sudo mysql -u root mysql> USE mysql; mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY 'NEW_PASSWORD'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost'; mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER'; mysql> FLUSH PRIVILEGES; mysql> exit; $ service mysql restart $ mysql -u YOUR_SYSTEM_USER
解決方法はこちらを完全に参考にさせていただきました。
mysql - ERROR 1698 (28000): Access denied for user 'root'@'localhost' - Stack Overflow