在安装完 MySQL 的时候发现,不用输入密码,都可以进入 MySQL ,研究半天,终于找到了解决方式。
第一步、在控制台输入(修改 mysqld.cnf 文件)
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
进入到 mysqld.cnf 这个配置文件,然后在这个配置文件中的 [mysqld] 这一块中加入 skip-grant-tables 这句话,如下图所示
[mysqld]
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]
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
再次在控制台输入 mysql -u root -p ,这个时候就得输入密码,才可以登录 MySQL 了。
如果此时还是不用输密码,请看第四步
第四步、如果此时还是不用输密码,那么就需要返回第三步,把注释掉的那条语句重新放开(就是删除#符号),重新进入 MySQL 中,执行下面的命令
use mysql;
select user,plugin from user;
效果如下图所示:
从图中可以看到出,错误原因是因为 root 的 plugin 字段是 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 这个插件验证方式有以下特点:
- 首先,这种验证方式不要求输入密码,即使输入了密码也不验证。这个特点让很多人觉得很不安全,实际仔细研究一下这种方式,发现还是相当安全的,因为它有另外两个限制;
- 只能用
UNIX 的 socket 方式登陆,这就保证了只能本地登陆,用户在使用这种登陆方式时已经通过了操作系统的安全验证; - 操作系统的用户和
MySQL 数据库的用户名必须一致,例如你要登陆 MySQL 的 root 用户,必须用操作系统的 root 用户登陆。
auth_socket 这个插件因为有这些特点,它很适合我们在系统投产前进行安装调试的时候使用,而且也有相当的安全性,因为系统投产前通常经常同时使用操作系统的 root 用户和 MySQL 的 root 用户。当我们在系统投产后,操作系统的 root 用户和 MySQL 的 root 用户就不能随便使用了。
在 [mysqld] 中添加下边的代码,也可以更改 MySQL 默认的身份认证插件
default_authentication_plugin=mysql_native_password
|