mysql用户账号是'username'@'host'组合,host必须精确匹配,create user和grant中的host须完全一致,否则报错1410或1130;默认host为'%'不安全,应显式指定如'192.168.1.%';授权后需flush privileges。

CREATE USER 语句必须带精确 'host' 部分
MySQL 用户账号本质是 'username'@'host' 的组合,host 字段不匹配就直接拒绝连接,不会 fallback 到其他记录。比如你执行 CREATE USER 'app' IDENTIFIED BY 'pwd123';,MySQL 默认创建的是 'app'@'%',而不是你想要的 'app'@'192.168.1.%' —— 这会导致权限范围过大,且后续 GRANT 若没写全 @'192.168.1.%',实际授权可能落在错误的用户记录上。
正确做法是显式写出 host:
-
CREATE USER 'app'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';(允许整个 C 类网段) -
CREATE USER 'app'@'10.0.2.50' IDENTIFIED BY 'StrongPass123!';(只允单一 IP) - 千万别写成
CREATE USER 'app'@192.168.1.%(漏引号 → 语法错误)或'app'@'192.168.1.*'(*不是 MySQL 通配符,%才是)
GRANT 必须与 CREATE USER 的 host 完全一致
授权不是“追加到用户”,而是绑定到某条具体的 user@host 记录。如果你先建了 'app'@'192.168.1.%',但写 GRANT SELECT ON mydb.* TO 'app';,MySQL 会默认解释为 'app'@'%',结果就是:新用户没权限,旧用户('app'@'%')反而被误授了权。
务必核对两处 host 是否完全一致:
- 运行
SELECT User, Host FROM mysql.user WHERE User = 'app';确认目标记录存在且Host值是你期望的 -
GRANT SELECT, INSERT ON mydb.* TO 'app'@'192.168.1.%';(host 字符串必须一模一样) - 执行完立刻
FLUSH PRIVILEGES;—— 这步跳过,前面所有操作都白做
bind-address 和防火墙要配合 host 粒度
即使用户权限设成 'app'@'192.168.1.%',如果 MySQL 服务本身没监听对应网卡,连接请求根本进不来。常见错配:
-
bind-address = 127.0.0.1→ 只收本地请求,远程 IP 再匹配也连不上 -
bind-address = 0.0.0.0+'app'@'192.168.1.%'→ 安全,但要求客户端真实出口 IP 在该网段(NAT 后可能变形) -
bind-address = 192.168.1.100(服务器内网 IP)+'app'@'192.168.1.%'→ 更精准,避免暴露到公网接口
防火墙也要对齐:
- Linux:
sudo ufw allow from 192.168.1.0/24 to any port 3306 - 云平台安全组:入方向规则源 CIDR 设为
192.168.1.0/24,不是0.0.0.0/0
ERROR 1130 的真实含义就是 host 不匹配
报错 ERROR 1130 (HY000): Host '192.168.1.50' is not allowed to connect to this MySQL server,说明 MySQL 已收到 TCP 连接请求,但在认证阶段查 mysql.user 表时,没找到 'xxx'@'192.168.1.50' 或更宽泛匹配的记录(如 'xxx'@'192.168.1.%')。这不是网络不通,也不是密码错。
排查顺序必须是:
- 用客户端真实 IP 连,然后在服务端执行
SELECT User, Host FROM mysql.user;,确认有没有对应记录 - 检查
bind-address是否允许该 IP 进来(ss -tlnp | grep :3306看监听地址) - 确认没被防火墙或安全组在 TCP 层拦截(telnet 3306 能通才进 MySQL 认证)
- 别直接
UPDATE mysql.user SET Host = '%'—— 这等于放弃 IP 限制,和初衷相悖
最易忽略的是:客户端经过 NAT 或代理后,MySQL 看到的 host 是出口 IP,不是你配置里写的内网地址;此时要么改用户 host 为实际出口 IP,要么用 192.168.1.% 网段覆盖,不能硬写死单个 IP。











