Ubuntu 20.04 EC2实例中MySQL 8.0 root用户密码登录失效问题求助
我来帮你理清问题的根源和解决步骤,你遇到的情况其实是Ubuntu系统下MySQL 8.0的默认配置导致的:
问题根源
Ubuntu 20.04上安装的MySQL 8.0,默认给root@localhost用户配置了auth_socket认证插件。这个插件的逻辑是只允许本地系统的root用户(也就是通过sudo切换的用户)通过Unix套接字连接MySQL,完全忽略密码验证——这就是为什么你输入错误密码甚至直接sudo mysql都能登录的原因。
你之前尝试的ALTER USER命令没生效,是因为没有修改认证插件,auth_socket依然在起作用;而直接修改mysql.user表时用的PASSWORD()函数,在MySQL 8.0里已经被移除了,所以会触发语法错误。
正确解决步骤
1. 登录MySQL
先通过默认方式登录(因为现在还能这么操作):
sudo mysql
2. 查看当前root用户的认证插件
执行以下SQL确认当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
你会看到root@localhost的plugin列是auth_socket,和你补充的信息一致。
3. 修改认证插件并设置密码
执行这条SQL,把认证插件改为MySQL 8.0推荐的caching_sha2_password,同时设置你的密码(把your_strong_password换成你要设置的密码):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_strong_password';
如果你需要兼容旧客户端(比如某些不支持caching_sha2_password的工具),也可以改用mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
4. 刷新权限
让配置生效:
FLUSH PRIVILEGES;
5. 测试登录
退出MySQL:
EXIT;
现在尝试用普通方式登录,输入你设置的密码:
mysql -u root -p
这时候应该需要正确密码才能登录,而且sudo mysql也会要求输入密码(因为认证插件已经改成需要密码验证的类型了)。
为什么你之前的操作无效?
- 单纯执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD';:没有指定认证插件的情况下,MySQL可能不会自动替换掉auth_socket,所以auth_socket依然优先生效,密码设置等于没起作用。 - 执行
UPDATE mysql.user SET authentication_string=PASSWORD('NEW_USER_PASSWORD') ...:MySQL 8.0已经移除了PASSWORD()函数,改用ALTER USER命令来设置密码才是官方推荐的正确方式,直接修改用户表容易出现权限同步问题。
内容的提问来源于stack exchange,提问作者Aditya Tiwari

