MySQL连接不上,或者宝塔面板里数据库突然显示离线,这个问题其实挺常见的。很多人第一反应是密码错了,或者服务挂了,但实际情况往往没那么简单。今天就把这些坑一个个排清楚,从根源上解决。

MySQL报1130错误:Host is not allowed to connect
这种情况啊,说白了就是权限配置没到位。得说清楚,这不是密码输错了,也不是MySQL服务挂了,而是MySQL压根不认你的访问来源IP。宝塔默认只给localhost放行了root用户,所以当你用Na vicat这类远程工具,或者本地开发环境,甚至WordPress跨服务器调用时,都会卡在这里。
怎么检查呢?进宝塔终端,执行:mysql -uroot -p,输入密码后运行:
SELECT host, user FROM mysql.user WHERE user = 'root';
如果结果里host列只有localhost,那就对上了。先别急着去改my.cnf,先补上权限:
- 执行
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的实际密码' WITH GRANT OPTION; - 再跑
FLUSH PRIVILEGES;让变更生效 - 如果只想允许某个特定IP(比如你本机的公网IP),把
'%'换成'203.123.45.67'会更安全
注意:'%'代表任意主机,生产环境慎用;改完必须执行FLUSH PRIVILEGES,否则不生效。
3306端口不通但MySQL服务明明在运行
你看到服务状态是active (running),但用netstat -tuln | grep :3306一查,发现没输出?这就说明MySQL的监听地址被锁死了。宝塔安装的MySQL,默认会绑死在127.0.0.1上,对外当然不可见。
检查配置文件:/www/server/mysql/etc/my.cnf,找到bind-address这一行:
- 如果是
bind-address = 127.0.0.1,注释掉它,或者改成bind-address = 0.0.0.0 - 确认
skip-networking这一行被注释了(前面加#) - 保存后执行
systemctl restart mysqld(CentOS)或systemctl restart mysql(Ubuntu)
重启后立刻验证:netstat -tuln | grep :3306应该显示*:3306或0.0.0.0:3306,而不是127.0.0.1:3306。
防火墙放行了3306,还是连不上
系统防火墙(ufw或firewalld)只是第一关。别忘了,云服务器还有第二道防线——安全组。这两者是独立运行的,缺一不可。
先确认系统防火墙已经开放了3306端口:
- Ubuntu:
ufw status | grep 3306,没输出就跑ufw allow 3306 - CentOS:
firewall-cmd --list-ports | grep 3306,没输出则执行firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
再登录阿里云或腾讯云控制台,找到对应ECS实例的「安全组」→「入方向规则」,手动加一条规则:
- 协议类型:
TCP - 端口范围:
3306/3306 - 授权对象:
0.0.0.0/0(测试用)或你的办公IP(生产环境推荐)
安全组规则修改后是立即生效的,不需要重启服务器。
宝塔面板里“数据库”页面显示离线,但命令行能连
这种情况说明MySQL进程本身没问题,但宝塔读不到它的状态。问题往往出在配置路径错位或者文件权限异常上。
宝塔固定读取两个位置的配置文件:/www/server/mysql/etc/my.cnf 和 /etc/my.cnf。如果实际配置在别处(比如Docker容器内),或者文件所有者不是mysql:mysql,面板就会误判。
检查并修复:
- 执行
ls -l /www/server/mysql/etc/my.cnf,看Owner是否为mysql - 如果不是,运行
chown mysql:mysql /www/server/mysql/etc/my.cnf - 再执行
chmod 644 /www/server/mysql/etc/my.cnf,避免权限过大被拒绝读取 - 最后重启宝塔:
bt restart,强制刷新数据库模块缓存
这个环节最容易被忽略:文件权限不对,宝塔连配置文件都读不到,自然显示“服务器已离线”。哪怕MySQL自己跑得飞起,它也只能干瞪眼。