错误1130本质是mysql用户host权限限制,需通过grant授权指定ip或'%'、执行flush privileges生效,并确认bind-address=0.0.0.0、防火墙及云安全组放行3306端口。
![thinkphp数据库配置实战:解决“sqlstate[hy000] [1130] host is not allowed to connect”的远程授权方案](https://img.php.cn/upload/article/001/503/042/178156869927452.jpeg?x-oss-process=image/resize,p_40)
这个问题不是密码错了,也不是 ThinkPHP 配置写漏了,而是 MySQL 根本没允许你的服务器 IP 连进来——SQLSTATE[HY000] [1130] 错误本质是权限拒绝,不是连接失败。
确认报错来源是 1130 而非 Connection refused
先区分清楚:如果报的是 SQLSTATE[HY000] Connection refused,说明 TCP 层连不上(服务没启、端口没监听、防火墙拦了);而 SQLSTATE[HY000] [1130] 明确表示“Host is not allowed”,即 MySQL 进程已运行、端口也通,但用户账号的 host 字段不匹配当前请求来源。
- 在 ThinkPHP 的
.env或数据库配置中,DB_HOST填的是远程 IP(比如139.129.142.19),但 MySQL 的mysql.user表里该用户只允许从'localhost'或'127.0.0.1'连接 - 用命令行直接测试:
mysql -h 139.129.142.19 -u root -p,如果同样报 1130,就排除了 ThinkPHP 配置层问题 - 别被
DB_HOST=127.0.0.1欺骗——如果你把 ThinkPHP 部署在 A 服务器,MySQL 在 B 服务器,那 A 的 127.0.0.1 指的是 A 自己,不是 B
授权用户支持远程 IP 或通配符(%)
登录 MySQL 服务端(必须用本地 root 或有 GRANT OPTION 权限的账号),执行授权语句。优先用 GRANT,而不是直接 UPDATE user 表——后者在 MySQL 8+ 可能因认证插件不一致导致后续连接失败。
- 允许任意主机连接(开发环境可接受):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; - 只允特定 IP(如 ThinkPHP 所在服务器):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' IDENTIFIED BY 'your_password' WITH GRANT OPTION; - 若 MySQL 8+ 报客户端不兼容 caching_sha2_password,显式指定插件:
CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '';再GRANT - 执行完必须
FLUSH PRIVILEGES;,否则权限不生效
检查并放开网络与系统级拦截
改完权限不等于万事大吉。很多情况是权限对了,但连接请求根本到不了 MySQL 进程。
- Linux 下确认 MySQL 监听的是
0.0.0.0:3306而非仅127.0.0.1:3306:sudo netstat -tulnp | grep :3306 - 检查
/etc/mysql/mysql.conf.d/mysqld.cnf中bind-address是否为0.0.0.0(或注释掉) - 云服务器(阿里云/腾讯云)必须在控制台安全组放行 3306 入方向 TCP 规则,不能只靠本地防火墙
- Windows(如 phpEnv)要手动进「Windows Defender 防火墙 → 高级设置 → 入站规则」添加 3306 端口放行
- phpEnv 用户特别注意:改完权限后必须点控制面板里的「MySQL 重启」按钮,否则服务仍用旧权限加载
ThinkPHP 配置与验证要点
ThinkPHP 本身不参与权限判定,但它暴露了底层连接细节。确保配置项直指真实网络路径。
-
DB_HOST必须填 MySQL 所在机器的公网 IP 或内网 IP(不是localhost),且该 IP 能被 ThinkPHP 服务器路由到达 - 如果 MySQL 和 ThinkPHP 在同一台机器,但用 Docker 部署,
DB_HOST别写127.0.0.1,应写宿主机网关 IP(如host.docker.internal)或容器名 - 连接测试不要只信 ThinkPHP 日志,用
telnet your_mysql_ip 3306或nc -zv your_mysql_ip 3306先验证端口可达性 - 如果用宝塔、phpEnv 等集成环境,它们常默认关闭远程访问,需单独开启 MySQL 远程支持开关(不止改权限)
最常被跳过的动作是:改完 GRANT 忘了 FLUSH PRIVILEGES,或者开了权限却没重启 MySQL 服务(尤其 Windows 服务模式),又或者云服务器安全组没动——这三者任一缺失,都会让 1130 错误原地复现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











