MySQL将'root'@'localhost'与'root'@'127.0.0.1'视为独立账号,需严格匹配错误中提示的host;认证插件须为mysql_native_password,且当前用户须具备GRANT OPTION权限,所有变更后必须执行FLUSH PRIVILEGES。

SELECT User, Host FROM mysql.user 看不到你连的那条记录
MySQL 把 'user'@'localhost' 和 'user'@'127.0.0.1' 当作两个完全不同的账号,哪怕用户名、密码一模一样,也不互通。错误信息里写的 host(比如 'root'@'localhost'),就是你要对准的目标。
执行 SELECT User, Host FROM mysql.user WHERE User = 'your_user';,看输出里有没有和你连接命令中完全一致的 Host 值。
- 你用
mysql -u im -p连,MySQL 默认走 socket,匹配'im'@'localhost' - 你用
mysql -h 127.0.0.1 -u im -p连,走 TCP,必须存在'im'@'127.0.0.1'或'im'@'%' - 只看到
'im'@'%',但本地用-h localhost连——localhost会优先触发 socket 路径匹配,跳过 TCP 规则,结果还是找不到'im'@'localhost'
ALTER USER … IDENTIFIED WITH mysql_native_password 失效
MySQL 5.7+ 默认认证插件是 caching_sha2_password,但很多客户端(老版 PHP MySQLi、Python PyMySQL、Navicat 旧版本、Docker 官方镜像)不支持它。表现就是:密码没错、账号存在、host 匹配,依然报 Access denied。
查当前插件:SELECT plugin FROM mysql.user WHERE User = 'im' AND Host = 'localhost';
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 如果不是
mysql_native_password,必须用ALTER USER改,不能UPDATE mysql.user直接写字段(MySQL 8.0+ 已废弃该方式) - 改完立刻执行
FLUSH PRIVILEGES;,否则不生效 - 如果用户是新建的,创建时就指定插件更稳妥:
CREATE USER 'im'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';
GRANT 命令静默失败,因为你自己没 GRANT OPTION
你用 root 登录,不代表你能给别人授权。MySQL 8.0+ 默认不给 root'@'localhost 自带 WITH GRANT OPTION 权限。所以 GRANT … TO 'im'@'localhost' 可能直接报错或静默失败,导致你以为授了权,其实没成功。
先确认自己权限:SHOW GRANTS FOR CURRENT_USER();,重点看输出末尾有没有 WITH GRANT OPTION。
- 没有就补:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; - 再执行
FLUSH PRIVILEGES; - 之后才能安全地给新用户授权
FLUSH PRIVILEGES; 漏掉或执行位置不对
几乎所有权限变更后都必须执行 FLUSH PRIVILEGES;,但它不是“可选优化”,而是强制同步内存权限缓存的必要步骤。
- 在
GRANT或ALTER USER后没执行,新设置不会生效 - 在非 root 用户下执行会报错(需要
RELOAD权限),所以务必用有足够权限的账号操作 - 注意:MySQL 8.0+ 的角色机制下,
FLUSH PRIVILEGES;对角色赋权也有效,别误以为只管用户表
真正卡住人的地方,往往不是某一步做错了,而是多个条件要同时满足:host 字符串完全匹配 + 认证插件兼容 + 当前用户有 GRANT 权限 + FLUSH PRIVILEGES; 执行到位。少一个,登录就挂。

















