mysql 8.0默认root@localhost使用auth_socket插件导致密码登录失败,需用sudo mysql进入后执行alter user 'root'@'localhost' identified with mysql_native_password by '新密码'切换认证方式。

MySQL 8.0 默认 auth_socket 导致本地 root 登录失败
MySQL 8.0+ 安装后,root@localhost 用户默认使用 auth_socket 插件鉴权,这意味着它不校验密码,而是依赖系统用户身份(比如 Linux 的 mysql 用户)。所以当你用 mysql -u root -p 尝试输入密码登录时,会报错:Plugin 'auth_socket' is not loaded 或更常见的 Access denied for user 'root'@'localhost' —— 实际上不是密码错了,是插件根本没启用或不匹配。
确认当前用户使用的认证插件
先连进 MySQL(可能需用 sudo mysql 绕过密码,因为 auth_socket 依赖系统权限):
sudo mysql
然后查插件类型:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
如果看到 plugin 列是 auth_socket,就确认问题所在。注意:别只查 root@localhost,有些安装还建了 root@127.0.0.1,后者可能是 caching_sha2_password,行为不同。
将 root@localhost 切换为 native password 认证
执行以下命令(MySQL 8.0.4+ 支持 ALTER USER 直接改插件;低于此版本需用 UPDATE mysql.user + FLUSH PRIVILEGES):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
-
mysql_native_password是兼容性最好、最稳定的旧式密码算法,适合大多数客户端(尤其是老版 PHP、Python MySQLdb 等) - 别用
caching_sha2_password替代,除非你明确知道客户端支持它(如新版 MySQL Connector/J 8.0.15+、PyMySQL 0.10+) - 密码必须显式指定,即使只想保留空密码也要写
BY '',否则语句报错 - 改完立即生效,无需重启 MySQL,但已有连接不会自动切换认证方式
验证修改并处理常见连不上问题
退出后尝试标准登录:
mysql -u root -p
如果仍失败,检查这几个点:
- 确认你连的是
localhost(Unix socket),不是127.0.0.1(TCP)——二者在 MySQL 里算不同 Host,用户记录独立 - 若用
127.0.0.1连,得单独改root@127.0.0.1:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '密码'; - 某些发行版(如 Ubuntu 22.04 的 APT 包)默认禁用密码登录,还会在
/etc/mysql/debian.cnf里配了debian-sys-maint用户,别误删或改错这个 - 如果客户端报
Client does not support authentication protocol,基本就是插件不兼容,必须切回mysql_native_password
auth_socket 看似省事,但一旦需要远程管理、脚本调用或对接非系统级工具,立刻变成阻塞点。真正该改的从来不是“怎么绕过”,而是把认证方式对齐到实际使用路径上。











