MySQL 8.0在Ubuntu 22.04默认使用auth_socket认证,导致mysql -u root -p报错;须用sudo mysql登录后执行ALTER USER切换为mysql_native_password并设密码,再FLUSH PRIVILEGES生效。

直接用 apt install mysql-server 就能装上 MySQL 8.0,但装完不能直接密码登录、远程连不上、甚至连 mysql -u root -p 都报错——这不是安装失败,是 Ubuntu 22.04 对 root 用户默认用了 auth_socket 插件认证,得手动切回密码模式。
为什么 mysql -u root -p 会拒绝访问?
Ubuntu 22.04 安装后,root@localhost 默认不走密码验证,而是靠系统用户身份(即必须用 sudo mysql 才能进)。这是安全设计,但对开发调试很反直觉。
- 执行
sudo mysql进入命令行后,运行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,你会看到 plugin 是auth_socket - 要改用密码登录,必须显式切换插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码'; - 别忘了
FLUSH PRIVILEGES;,否则不生效 - 之后就能用
mysql -u root -p正常登录了
如何允许远程连接 MySQL?
默认只监听 127.0.0.1,外部机器连不上是正常现象,不是端口没开或防火墙问题。
- 编辑配置文件:
/etc/mysql/mysql.conf.d/mysqld.cnf - 找到
bind-address = 127.0.0.1这一行,改成bind-address = 0.0.0.0(或指定内网 IP) - 重启服务:
sudo systemctl restart mysql - 创建远程用户(不要直接放开
root@'%'):CREATE USER 'devuser'@'%' IDENTIFIED WITH mysql_native_password BY '密码'; GRANT ALL ON *.* TO 'devuser'@'%' WITH GRANT OPTION; - 注意:MySQL 8.0 默认用
caching_sha2_password,旧客户端(如某些 Navicat 版本)可能不兼容,建用户时显式指定mysql_native_password更稳妥
mysql_secure_installation 必须跑吗?
必须。它不只是“设个密码”,还会清理掉真实环境中极易被利用的隐患。
- 它会删掉匿名用户(
''@'localhost'),这类账号在本地可无密登录,很多自动化扫描工具第一件事就是试这个 - 它默认禁用
root@'%',防止误开远程 root 权限 - 它会删掉
test数据库及其通配权限,避免权限继承漏洞 - 选密码强度等级时,建议选
1(medium):强制至少 8 位、含大小写+数字,又不至于因特殊字符导致某些脚本解析失败
最易被忽略的一点:改完 bind-address 或用户权限后,一定要确认 systemctl status mysql 显示 active,且没有 “Failed to start” 类日志;如果服务起不来,大概率是配置文件语法错误或端口被占——这时候看 sudo journalctl -u mysql -n 50 --no-pager 比猜快得多。


















