MySQL · 错误码速查
MySQL 错误 1130:服务器不认你的来源主机,给“用户名 + 来源 IP”建账号,而不是改 root
1130 说明网络是通的,服务器也收到了连接,但 mysql.user 里没有一行的 Host 能匹配你这台客户端。这和密码无关(密码错是 1045),也和端口不通无关(那是 2003)。正确做法是为“这个用户名 + 你的来源 IP 或网段”建一个账号再授权,不要把 root 改成 '%'。
官方原文
Host '%s' is not allowed to connect to this MySQL server%s 是服务器看到的客户端主机名或 IP。官方说明:从服务器以外的主机连接时出现这个错误,意味着 user 表里没有 Host 值能匹配这台客户端。
出处:MySQL 8.4 Error Reference:Server Error Message Reference 最后核对:
| 错误号 / 符号 | 1130 / ER_HOST_NOT_PRIVILEGED | 出处 |
|---|---|---|
| SQLSTATE | HY000 | 出处 |
| 发生阶段 | 连接验证,按 Host + User 找账号之前就已失败 | 出处 |
| 相邻错误 | 1045 找到账号但密码不对;2003 根本连不上端口(bind_address、skip_networking、防火墙) | 出处 |
| Host 写法 | 可写 IP、主机名、% 通配或网段,如 'app'@'198.51.100.%' | 出处 |
先分清 1130、1045 和 2003
| 报错 | 说明走到了哪一步 | 先查什么 |
|---|---|---|
| 2003 Can't connect to MySQL server | TCP 都没连上 | 服务器是否监听远程地址:bind_address 为 127.0.0.1 时只接受本机;skip_networking 开启时不接受任何 TCP 连接;再查防火墙和 3306 端口 |
| 1130 Host ... is not allowed | 连上了,但没有账号的 Host 匹配你的来源 | mysql.user 里这个用户名有哪些 Host 行,服务器看到的来源 IP 是什么 |
| 1045 Access denied | Host 匹配上了某个账号,但密码或认证没过 | 密码、选项文件里的旧密码、是否匹配到了匿名账号(见 1045) |
所以看到 1130,不用再查端口和防火墙;问题一定在账号表的 Host 列。
查清服务器看到的来源地址和已有的 Host 行
在服务器本机用管理员账号登录(本机连接通常匹配 localhost 行,不受 1130 影响),执行只读查询:
-- 把 'app' 换成报错里的用户名
SELECT Host, User, plugin, account_locked
FROM mysql.user
WHERE User = 'app'
ORDER BY Host;
-- 服务器是否只用 IP 匹配(ON 时 Host 列必须写 IP)
SELECT @@GLOBAL.skip_name_resolve;报错里 Host '%s' 的值就是服务器认定的来源。经过 NAT、负载均衡或容器网络时,它往往不是你本机的内网 IP,而是网关或宿主机的地址。账号的 Host 要按报错里显示的值写。
skip_name_resolve 为 ON 时,服务器只按 IP 匹配,授权表里所有 Host 都必须是 IP;这时写主机名的账号永远匹配不上,也会表现为 1130。
MySQL 8.0 / 8.4 的授权写法:先 CREATE USER,再 GRANT
官方手册给的顺序是先用 CREATE USER 建账号(设置密码等),再用 GRANT 授权。Host 尽量写到具体 IP 或网段,权限只给需要的库:
-- 在服务器本机用管理员账号执行(示例网段与库名请替换)
CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY '请换成强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.0.1.%';
-- 核对
SHOW GRANTS FOR 'app'@'10.0.1.%';'app'@'10.0.1.%'和已有的'app'@'localhost'是两个不同的账号,密码和权限各自独立。- 用 CREATE USER / GRANT 改账号不需要
FLUSH PRIVILEGES;直接 INSERT / UPDATE 授权表才需要。 - 官方提醒:授予
'username'@'%'的权限会自动同时赋给'username'@'localhost',这个行为已弃用,未来版本可能移除,不要依赖它。
不知道来源 IP 时,官方的临时办法
官方文档的建议:如果不知道客户端的 IP 或主机名,可以先建一个 Host 为 '%' 的账号,从客户端连上后执行 SELECT USER() 看自己实际以什么地址连进来,再把 `'%'` 改成那个具体地址。
-- 客户端连上后执行(只读)
SELECT USER(), CURRENT_USER();-- 确认地址后收窄(写操作)
RENAME USER 'app'@'%' TO 'app'@'203.0.113.25';不要用 UPDATE mysql.user SET Host='%' WHERE User='root' 这类写法开放 root 远程登录:它让任意来源都能尝试 root 密码。远程管理建议单独建一个限定来源的管理账号。
常见问题
MySQL 1130 是什么意思?
1130(ER_HOST_NOT_PRIVILEGED)表示客户端已经连上服务器,但 mysql.user 里没有任何一行的 Host 能匹配这台客户端的地址,所以连密码都还没验证就被拒绝了。
1130 和 1045 有什么区别?
1130 是来源主机不在任何账号的 Host 范围内;1045 是找到了匹配的账号,但密码或认证没通过。1130 要加账号或改 Host,1045 要查密码。
Navicat / DBeaver 远程连接 MySQL 报 1130 怎么办?
看报错里 Host 后面的地址,用管理员账号在服务器本机执行 CREATE USER '用户名'@'该地址或网段' IDENTIFIED BY '密码',再 GRANT 需要的库权限。客户端工具本身不用改。
MySQL 8.0 还能用 GRANT ... IDENTIFIED BY 一步建用户吗?
按 MySQL 8.0/8.4 手册的写法,先用 CREATE USER 建账号并设密码,再用 GRANT 授权;GRANT 语句里不再写 IDENTIFIED BY。
把 Host 改成 % 安全吗?
% 表示任何来源都能用这个用户名尝试登录。官方只把它当作“不知道来源 IP 时”的临时办法:连上后用 SELECT USER() 看实际来源,再把 % 改成具体地址。root 账号不要开放 %。
下一步
价格以对应页面当前标价为准。
出处(最后核对 2026-11-04)
- MySQL 8.4 Error Reference:Server Error Message Reference
- MySQL 8.4 Reference Manual 8.2.22:Troubleshooting Problems Connecting to MySQL
- MySQL 8.4 Reference Manual 15.7.1.6:GRANT Statement
- MySQL 8.4 Reference Manual:Server System Variables(skip_name_resolve、bind_address)
本页摘录并解读上面列出的官方文档,不是官方页面;官方文档更新后以官方为准。本页内容都来自官方文档,没有我们自己的测试结果。