mysql 1130错误本质是权限匹配失败,因客户端ip在mysql.user表无对应user@host记录;mysql 8.0+须用create user/grant授权,禁用直接update系统表,并需检查bind-address和防火墙。

MySQL 1130 错误本质是权限匹配失败
报错 Host 'xxx' is not allowed to connect to this MySQL server(错误号 1130)不是密码错、也不是端口不通,而是客户端 IP 在 mysql.user 表里找不到对应记录。MySQL 查用户时,严格匹配 user + host 两列组合——'root'@'localhost' 和 'root'@'%' 是两个完全不同的账号,后者才允许远程连接。
直接 UPDATE mysql.user 表在 MySQL 8.0+ 会失败
很多旧教程教用 UPDATE user SET host = '%' WHERE user = 'root';,但在 MySQL 8.0 及以上版本,这大概率触发 ERROR 1396 (HY000): Operation ALTER USER failed 或提示 The MySQL server is running with the --skip-grant-tables option。因为 MySQL 8.0 起禁用直接修改系统表,权限必须通过 CREATE USER / GRANT 管理。
- MySQL 5.7 可临时用
UPDATE+FLUSH PRIVILEGES,但不推荐 - MySQL 8.0+ 必须用
CREATE USER或ALTER USER创建/重命名账号 - 即使改成功了,没执行
FLUSH PRIVILEGES,内存缓存也不会更新,连接照样被拒
正确做法:用 CREATE USER + GRANT 显式授权
不要碰 root 用户的远程权限,尤其生产环境。创建专用账号更安全:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass2026!'; GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'appuser'@'%'; FLUSH PRIVILEGES;
如果只允许某网段(比如公司内网 192.168.10.x),把 '%' 换成 '192.168.10.%';如果只允单个 IP,写成 '192.168.10.42'。
-
GRANT ALL PRIVILEGES ON *.*权限过大,仅测试环境临时用 - 用户名带单引号,host 值必须是字符串,
'%'不是通配符语法错误,是合法 host 值 - 执行完立刻生效,无需重启 MySQL 服务
别忘了 bind-address 和防火墙这两步
就算权限开了,MySQL 默认可能只监听 127.0.0.1,外部根本连不到端口。检查配置文件(Linux 多为 /etc/mysql/mysql.conf.d/mysqld.cnf,Windows 是 my.ini)中 bind-address 的值:
- 注释掉该行,或改为
bind-address = 0.0.0.0 - 改完必须重启服务:
sudo systemctl restart mysql(Linux)或net stop mysql && net start mysql(Windows) - 确认系统防火墙放行 3306 端口:
sudo ufw allow 3306或sudo firewall-cmd --add-port=3306/tcp --permanent
很多人卡在最后一步:以为权限改完就万事大吉,结果 telnet your-server-ip 3306 直接超时——那八成是 bind-address 还锁着,或者防火墙拦着。











