根本原因是mysql user表中缺少匹配客户端请求的'username'@'host'记录,需确认该组合存在且host值为'%'或具体ip,执行flush privileges刷新权限,并检查bind-address设为0.0.0.0及防火墙开放3306端口。

根本原因只有一个:MySQL 的 user 表里,没有匹配你当前连接请求的 'username'@'host' 记录。
MySQL 的权限判断基于三元组:用户名 + 主机名 + 密码
它不是只看用户名或密码,而是严格比对 'myuser'@'192.168.1.100' 或 'myuser'@'%' 这样的完整组合。哪怕密码完全正确,只要 host 字段不匹配(比如你用 IP 连接,但数据库里只存了 'myuser'@'localhost'),就会直接拒绝并报错 1130。
-
localhost和127.0.0.1在 MySQL 权限系统中是两个不同 host —— 前者走 Unix socket,后者走 TCP;远程客户端用 IP 连接时,永远无法命中@'localhost' -
%匹配任意非本地主机,但不包括localhost;若需同时支持本地命令行和远程连接,得单独给'myuser'@'localhost'授权 - 主机名解析失败(如 DNS 返回错误 IP)会导致实际连接使用的 host 与预期不符,建议首次调试时统一用 IP 地址连接,避开主机名解析环节
为什么改了 user 表或执行 GRANT 后还是连不上?
常见原因是没刷新权限缓存,或者改的是错误的用户记录。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 必须执行
FLUSH PRIVILEGES;,否则内存中的权限缓存不会更新 - 执行
SELECT User, Host FROM mysql.user;确认目标用户确实存在且Host列值是你期望的(比如'%'或具体 IP),注意空格、大小写、引号是否多余 - MySQL 8.0+ 默认启用
caching_sha2_password插件,老客户端可能不兼容;若报错含Authentication plugin 'caching_sha2_password' cannot be loaded,需在创建用户时显式指定插件:CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p';
bind-address 和防火墙是前置条件,不是权限问题本身
即使权限全开,如果 MySQL 没监听外部地址,或系统防火墙/云安全组拦住了 3306 端口,连接会卡在 Connection refused 或超时,而不是 1130 错误。
- 检查配置文件(如
/etc/mysql/mysql.conf.d/mysqld.cnf)中bind-address是否为0.0.0.0或具体公网 IP;127.0.0.1会彻底屏蔽远程 - 用
ss -tlnp | grep :3306确认 mysqld 实际监听地址 —— 如果只显示127.0.0.1:3306,说明 bind-address 没生效或服务没重启 - 云服务器务必检查安全组规则,不只是本机防火墙;很多新手在阿里云/腾讯云上漏掉这步,反复折腾权限却无效
真正卡住人的地方,往往不是权限语句写错,而是把 host 当成可选参数、忽略 localhost 和 % 的语义差异、或者忘了 FLUSH PRIVILEGES —— 这些细节不验证,光改 SQL 没用。










