解决Ubuntu安装MySQL8.0后 数据库root设置密码无效, root无需密码或密码错误都可登录

Ubuntu24.04使用apt-get安装MySQL8.0后发现数据库的root账户竟然不用密码也能登录

尝试随便输入一个密码也能登录, 使用 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new passwd'; 语句修改密码后问题依然存在, 以前使用MySQL5.7并未发现相关的问题.

原因

通过查找资料发现是MySQL8.0开始更改了root账户的默认密码验证插件为auth_socket导致的, 可以通过一下命令查看数据库中的用户使用的身份验证插件:

SELECT user, host, plugin FROM mysql.user;

可以看到root使用的身份验证插件是auth_socket, 其他用户默认是caching_sha2_password. auth_socket这个插件是通过Unix socket文件来进行身份验证, 简单来说就是你在Linux系统的登录名为root, 那么当登录数据库的root账号时数据库会与系统进行socket通信, 发现要登录的用户名是相同的, 那么就会允许这次登录, 详细信息可以看MySQL的官方文档: auth_socket 以及这篇文章: https://segmentfault.com/a/1190000039860881
MySQL8.0以上将其作为root的默认身份插件有一定的道理, 首先, Unix socket通信只能是在本机的程序之间进行, 不会通过TCP/IP网络栈, 不用当心来自外部的爆破;  二是Linux本身的身份验证已经很完善, 用户如果能以root登录系统, 那么无论使用何种插件都能被轻易地修改密码.

更改身份验证插件

如果想用账户密码方式的身份验证, 可以通过以下语句更改, WITH 后面是身份验证插件名称, BY 后面是登录密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new password';

可以看到root的身份验证插件已经改为caching_sha2_password
改完以后需要提供正确的密码才能登录

需要注意的是, 有一些文章WITH 后面跟的是mysql_native_password, 但是根据官方文档: https://dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html 中的描述, mysql_native_password插件会在MySQL 8.0.34中弃用并且在后续版本中删除, 官方更推荐caching_sha2_password, 具有更好的安全性.

mysql_secure_installation

实际上, 根据MySQL官方文档"安装后的设置与测试"(Postinstallation Setup and Testing )一节中的Securing the Initial MySQL Account 小节里提到了mysql_secure_installation这个程序, 他随MySQL一同安装, 用于对MySQL安装后, 上线生产环境前的安全初始化, 其中主要包括以下功能:
1. 为root账户设置密码;
2. 禁止root账户远程访问;
3. 删除匿名账户;
4. 删除test数据库;

如果你安装完MySQL后运行这个程序, 就能发现问题所在, 程序提示root用户正在使用auth_socket, 因此跳过密码设置, 所以平时还是要多看看文档^_^

内存优化

如果你的主机内存很小, 那么建议修改MySQL配置文件, 在 [mysqld] 下添加:
performance_schema = off
亲测可以减少100多M的内存, performance_schema 是用来记录MySQL查询性能相关的记录, 用于给数据库管理员做性能分析的, 如果你没有这方面的需求, 那么可以关闭它.