在安装完 MySQL 的时候发现,不用输入密码,都可以进入 MySQL ,研究半天,终于找到了解决方式。

第一步、在控制台输入(修改 mysqld.cnf 文件)

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

进入到 mysqld.cnf 这个配置文件,然后在这个配置文件中的 [mysqld] 这一块中加入 skip-grant-tables 这句话,如下图所示

 [mysqld]

 # * Basic Settings

 user = mysql
 pid-file = /var/run/mysqld/mysqld.pid
 socket = /var/run/mysqld/mysqld.sock
 port = 3306
 basedir = /usr
 datadir = /var/lib/mysql
 tmpdir = /tmp
 lc-messages-dir = /usr/share/mysql
 skip-external-locking
 character-set-server=utf8
 collation-server=utf8_general_ci
 skip-grant-tables    # 增加这一句话
作用:可以跳过验证,不用密码登录进入 MySQL

使用下面的指令,重启 MySQL 服务

service mysql restart

第二步、在控制台输入下面指令

mysql
# 或者
mysql -u root
# 或者
mysql -u root -p

遇见输入密码的提示直接回车即可,进入 MySQL 后,分别执行下面三句话

use mysql; 

update user set authentication_string=password("你的密码") where user="root"; 

flush privileges; 

效果如下图所示:
在这里插入图片描述
然后退出 MySQL

第三步、重新进入到 mysqld.cnf 文件中,把刚开始加的 skip-grant-tables 这条语句给注释掉

 [mysqld]

 # * Basic Settings

 user = mysql
 pid-file = /var/run/mysqld/mysqld.pid
 socket = /var/run/mysqld/mysqld.sock
 port = 3306
 basedir = /usr
 datadir = /var/lib/mysql
 tmpdir = /tmp
 lc-messages-dir = /usr/share/mysql
 skip-external-locking
 character-set-server=utf8
 collation-server=utf8_general_ci
# skip-grant-tables    # 注释掉这一句话

再次在控制台输入 mysql -u root -p ,这个时候就得输入密码,才可以登录 MySQL 了。

如果此时还是不用输密码,请看第四步

第四步、如果此时还是不用输密码,那么就需要返回第三步,把注释掉的那条语句重新放开(就是删除#符号),重新进入 MySQL 中,执行下面的命令

use mysql; 

select user,plugin from user; 

效果如下图所示:
在这里插入图片描述

从图中可以看到出,错误原因是因为 rootplugin 字段是 auth_socket ,那我们改为 mysql_native_password 就行了。执行下面的命令:

update user set authentication_string=password("你的密码") ,plugin='mysql_native_password' where user='root';

再次执行

select user, plugin from user;

我们能看到root用户的字段改成功了,如下图所示。
在这里插入图片描述
最后退出 MySQL返回执行第三步

那么这个问题就完全解决了。

补充:auth_socket 验证插件的使用场景:

auth_socket 这个插件验证方式有以下特点:

  • 首先,这种验证方式不要求输入密码,即使输入了密码也不验证。这个特点让很多人觉得很不安全,实际仔细研究一下这种方式,发现还是相当安全的,因为它有另外两个限制;
  • 只能用 UNIXsocket 方式登陆,这就保证了只能本地登陆,用户在使用这种登陆方式时已经通过了操作系统安全验证;
  • 操作系统的用户和 MySQL 数据库的用户名必须一致,例如你要登陆 MySQLroot 用户,必须用操作系统root 用户登陆。

auth_socket 这个插件因为有这些特点,它很适合我们在系统投产前进行安装调试的时候使用,而且也有相当的安全性,因为系统投产前通常经常同时使用操作系统root 用户和 MySQLroot 用户。当我们在系统投产后,操作系统root 用户和 MySQLroot 用户就不能随便使用了。

[mysqld] 中添加下边的代码,也可以更改 MySQL 默认的身份认证插件
default_authentication_plugin=mysql_native_password
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐