先用sudo mysql进入数据库,再执行SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';确认root@localhost的plugin值,若为auth_socket则需用ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';并FLUSH PRIVILEGES;生效。

确认当前 root 用户的认证插件类型
你看到 Plugin 'auth_socket' is not loaded 或 ERROR 1524 (HY000),根本原因不是插件“坏了”,而是 MySQL 尝试用 auth_socket 验证你输入的密码——但它根本不支持密码验证。必须先查清楚 root 用户到底绑定了哪个插件:
- 用
sudo mysql直接进库(绕过认证) - 执行
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; - 重点关注
root@localhost这一行的plugin值:如果是auth_socket,就坐实问题;如果是caching_sha2_password,那报错可能来自连接方式不匹配(比如用了127.0.0.1却期望localhost的 Unix socket 行为)
MySQL 8.0+ 必须用 ALTER USER 切换插件
MySQL 8.0.4 起禁用直接 UPDATE mysql.user 表的方式,硬改会触发错误或被忽略。正确做法是用 ALTER USER 显式指定新插件和密码:
- 在
sudo mysql会话中执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; - 如果提示
Unknown authentication plugin 'mysql_native_password',说明该插件未启用,需先检查SHOW PLUGINS;,再确认配置文件里没禁用它 - 执行后必须运行
FLUSH PRIVILEGES;,否则变更不生效 - 别漏掉
@'localhost'——root@127.0.0.1是另一个用户,要单独处理
Ubuntu/Debian 系统下 auth_socket 插件默认不加载
Ubuntu 官方包安装的 MySQL(尤其 5.7/8.0)默认把 root@localhost 设为 auth_socket,但服务启动时并不自动加载该插件——除非你在 my.cnf 里显式声明:
- 检查
/etc/mysql/mysql.conf.d/mysqld.cnf,确认没有plugin-load-add = auth_socket.so这行(有就注释掉) - 重启服务:
sudo systemctl restart mysql,否则即使改了用户插件,旧配置仍可能干扰 - 不要依赖“重启解决一切”:有些环境重启后又回退,是因为配置残留或 systemd 启动脚本覆盖了你的修改
连接方式不同,触发的插件也不同
localhost 和 127.0.0.1 在 MySQL 里不是等价的——前者走 Unix socket,后者走 TCP/IP,会分别匹配不同的 Host 条目和对应插件:
- 用
mysql -u root -p -h localhost会命中root@localhost(auth_socket) - 用
mysql -u root -p -h 127.0.0.1会命中root@127.0.0.1(通常是caching_sha2_password) - 如果你的应用配置里写的是
127.0.0.1,却只改了localhost的插件,登录照样失败 - 建议统一改成
mysql_native_password,并确保两个 Host 都更新:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '...';
最容易被忽略的是 Host 匹配粒度——MySQL 的用户权限是 User + Host 组合唯一确定的,改一个漏一个,就会出现“明明改了却还是登不上”的情况。


















