在 Ubuntu 上通过 apt install mysql-server 安装了 8.0 版本的 mysql 后,发现 root 用户在命令行中输入 mysql ,直接就能进入 mysql 的命令行界面;而且没有提示要更改默认的 root 密码,直接就能进行一系列操作。
查看 /var/log/mysql/error.log ,看到有这样一条日志: root@localhost is created with an empty password ! Please consider switching off the–initialize-insecure option. 可以看到,日志提示 root 账户没有创建密码。
mysql.user数据表中存放了用户信息、用户密码、权限分配等信息。通过select user,plugin,authentication_string from mysql.user where user=‘root’;命令可以查看到,root的plugin选项为auth_socket,表示只要当前系统在root用户下,那么就能直接登录,不需要密码。后面的authentication_string为空,表示root用户也没有密码。
此时,哪怕修改了 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件中的 bind-address = 0.0.0.0,再将mysql.user表中的root用户的host从localhost改为%,也没法让远程用户通过Navicat等软件使用root用户直接登录数据库。
解决方法之一,就是先通过systemctl stop mysql命令停止mysql服务,然后通过rm -rf /var/lib/mysql/*命令删除默认生成的数据库文件,最后执行mysqld --initialize --user=root命令,即可为root用户生成一个随机的密码,这个密码能在/var/log/mysql/error.log文件中看到。使用这个生成的密码登录数据库后,此时我们无法做任何操作,只能通过alter user ‘root’@‘localhost’ identified by '123456’命令先将root密码修改一下,然后才能做下一步的操作。
如果要允许root用户远程登录(不推荐),可以使用update mysql.user set host=‘%’ where user=‘root’;
通过flush privileges;命令刷新权限。此时,通过select user,host,plugin,authentication_string from mysql.user;命令查看表项,结果如下:
可以看到,此时root用户能够从任意位置(%)登录到数据库中。
参考资料:https://blog.csdn.net/feinifi/article/details/107414470