先确认root@'localhost'的plugin值是否为auth_socket或caching_sha2_password,若是则需用alter user 'root'@'localhost' identified with mysql_native_password by '新密码'切换认证方式,并检查socket文件权限及host匹配性。

这个问题八成不是密码错了,而是认证插件不匹配或 socket 连接被卡住。直接改 plugin 字段、硬刷 FLUSH PRIVILEGES 或盲目重置密码,反而会让 root 彻底登不上。
查 root@'localhost' 的 plugin 值是不是 auth_socket 或 caching_sha2_password
MySQL 5.7+(尤其 Ubuntu/Debian 默认安装)和 MySQL 8.0+ 都把 root@'localhost' 的认证方式设为 auth_socket 或 caching_sha2_password,它们根本不走密码验证流程——你输对了也白搭。
- 先用系统权限绕过登录:
sudo mysql -u root(不输密码) - 进库后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 如果
plugin是auth_socket:说明只认 UNIX socket 身份,不校验密码 - 如果是
caching_sha2_password:旧版客户端(如某些 GUI 工具、低版本mysql命令行)可能握手失败
ALTER USER 改认证方式,别 UPDATE mysql.user
MySQL 5.7.6+ 和 8.0 不允许直接 UPDATE mysql.user 改 plugin 或 authentication_string,即使执行成功,后续也大概率失效,甚至让账号不可用。
- 必须用
ALTER USER语句,且显式指定主机:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; -
BY后的密码要满足当前策略(MySQL 8.0 默认要求 8 位以上、大小写字母+数字+特殊字符) - 执行完立即生效,不用
FLUSH PRIVILEGES - 如果提示
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost',说明该记录不存在,先确认SELECT结果里真有这一行
检查 /var/run/mysqld/mysqld.sock 文件权限
本地 mysql -u root -p 默认走 Unix socket(不是 TCP),路径通常是 /var/run/mysqld/mysqld.sock 或 /tmp/mysql.sock。如果 socket 文件权限不对(比如属主是 root:root 且权限 600),普通用户根本打不开,报错可能是 Can't connect to local MySQL server 或直接卡住,看起来像密码错。
- 查 socket 路径:
mysql --help | grep "socket" - 查权限:
ls -l /var/run/mysqld/mysqld.sock - 临时修复(仅调试):
sudo chmod 755 /var/run/mysqld和sudo chmod 644 /var/run/mysqld/mysqld.sock - 更稳妥的是确保
mysqld启动时以mysql用户运行,并在my.cnf里配好socket路径和user = mysql
别忽略 localhost 解析和 bind-address 配置
你以为连的是 socket,其实客户端悄悄走了 TCP:当 host 指定为 localhost 时,MySQL 客户端库(libmysqlclient)默认优先用 socket;但若 socket 文件不存在、路径不对,或服务端配置了 skip-networking=ON 却没配 socket,它就会 fallback 到 127.0.0.1——而 root@'127.0.0.1' 和 root@'localhost' 是两个独立账号。
- 确认你连的是哪个 host:
mysql -h 127.0.0.1 -u root -p和mysql -h localhost -u root -p表现可能完全不同 - 检查
my.cnf中是否误配了bind-address = 127.0.0.1或skip-networking,这会影响 socket 初始化 - 想彻底区分,就查清楚:
SELECT user, host FROM mysql.user WHERE user = 'root';—— 看看有没有'root'@'127.0.0.1'这条记录
真正卡住人的地方,往往不是“怎么改密码”,而是没意识到 localhost 和 127.0.0.1 在 MySQL 权限体系里是两回事,或者没检查 socket 文件权限就急着改表。动手前先 sudo mysql -u root 进去看看 plugin 和 host,比重装 MySQL 省三小时。











