using password: yes 表明密码已提交但校验失败,主因是用户记录缺失、host不匹配(如仅有'root'@'%'无'root'@'localhost')、认证插件为auth_socket,或caching_sha2_password兼容性问题。

这不是密码输错了,而是 MySQL 拒绝了你的登录请求——using password: YES 这个提示已经说明密码格式被接受了,但校验环节没通过。真正要查的,是用户是否存在、host 是否匹配、认证插件是否兼容、权限表是否加载。
看报错末尾的 using password: YES 还是 using password: NO
这是最关键的判断起点:
-
using password: NO:说明 MySQL 根本没收到密码,常见于 Navicat 或脚本里没填密码字段、连接字符串漏了-p、或用了空密码但当前策略禁止空密码 -
using password: YES:密码传过去了,但被拒绝——这时 90% 的问题出在用户记录缺失、host 不匹配、或plugin字段是auth_socket
确认 root 用户是否真实存在于 mysql.user 表中
你输对了密码,但 MySQL 里压根没有 'root'@'localhost' 这条记录,自然会报 1045。别只查 SELECT User, Host FROM mysql.user;,要加条件过滤:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
如果结果为空,说明 root 用户被删了;如果只有 'root'@'%' 没有 'root'@'localhost',那从本地用 mysql -u root -p 就永远登不上——因为默认走 socket,匹配的是 localhost,不是通配符 %。
检查 plugin 字段是不是 auth_socket
Ubuntu/Debian 系统装的 MySQL 默认把 root@localhost 设为 auth_socket 插件,它不看密码,只认系统用户身份。所以你输再对的密码也没用。
- 先用
sudo mysql -u root(不加-p)试试能否进——能进就基本锁定是这个原因 - 进库后执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 注意:不能写
UPDATE mysql.user SET plugin = ...,MySQL 8.0+ 会忽略,甚至让账号失效 - 改完立刻生效,不用
FLUSH PRIVILEGES
区分 socket 连接和 TCP 连接导致的 host 匹配差异
mysql -u root -p 默认走本地 socket 文件(如 /var/run/mysqld/mysqld.sock),此时 MySQL 认为你是从 'localhost' 连的;而 mysql -h 127.0.0.1 -u root -p 走 TCP,匹配的是 'root'@'127.0.0.1' ——这是两个独立账号。
- 执行
SELECT User, Host FROM mysql.user WHERE User = 'root';,看有没有'root'@'127.0.0.1'这一行 - 如果只有
'root'@'localhost',那加-h 127.0.0.1就会失败,反之亦然 - 临时验证:用
mysql --socket=/tmp/mysql.sock -u root -p强制指定 socket 路径,排除路径权限问题
最容易被忽略的一点:你改完 plugin 或密码后,如果用的是旧客户端(比如老版本 Navicat、PHP 5.x 的 mysql 扩展),可能不支持 caching_sha2_password,连 mysql_native_password 都会静默失败——这时候得去查 MySQL 错误日志,而不是反复试密码。











