The Login of Root User on MySQL

最近发现使用mysql -u root -p登录MySQL的时候会遇到ERROR 1698 (28000): Access denied for user 'root'@'localhost'错误。 但是UPDATE user SET Password=PASSWORD('my_password') where USER='root';并不能解决我的问题。经过一番调查发现是我plugin的设置的问题。

首先使用sudo mysql -u root登录MySQL. 然后运行

1
2
3
4
5
6
mysql> select user, Host, plugin, authentication_string from mysql.user where user="root";
+------+-----------+-------------+-----------------------+
| user | Host      | plugin      | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+

你可以发现plugin显示的是auth_socket,而且authentication_string是空值。这是因为我在安装MySQL的时候没有设置root. 导致了MySQL可以以root和空密码的形式登录。而当我运行UPDATE user SET Password=PASSWORD('my_password') where USER='root';的时候,由于pluginauth_socket,所以这条命令并没有起作用。

我们可以来看看普通的user这几项的值是什么

1
2
3
4
5
6
mysql> select user, Host, plugin, authentication_string from mysql.user where user="your_non_root_user";
+-------------------------+-----------+-----------------------+-------------------------------------------+
| user                    | Host      | plugin                | authentication_string                     |
+-------------------------+-----------+-----------------------+-------------------------------------------+
| your_non_root_user      | localhost | mysql_native_password | *SOMEVALUE******************************* |
+-------------------------+-----------+-----------------------+-------------------------------------------+

你可以发现这里plugin的值是mysql_native_password. 所以只需要将root的plugin设置为mysql_native_password即可解决问题。

1
2
mysql> update mysql.user set plugin='mysql_native_password' where User='root';
mysql> flush privileges;

对于auth_socketmysql_native_password更详细的解释,可以参考这里