mysql连接超时多因wait_timeout过短,需在宝塔修改为300或600并重启服务;同时检查ulimit和innodb_buffer_pool_size,避免资源不足;查询慢被误判超时,应通过explain优化索引。

连接超时直接卡在 connect() 阶段?先看 MySQL 服务端 wait_timeout
宝塔面板里点“测试连接”失败,或者 PHP 报 mysqli_connect(): (HY000/2002): Connection timed out,大概率不是网络问题,而是 MySQL 主动断开了空闲连接。PHP 的 mysqli_connect() 默认不带重连逻辑,一旦服务端因空闲超时关闭连接,客户端就只能报错。
关键参数是 MySQL 的 wait_timeout(单位秒),它控制非交互式连接(比如 PHP-FPM 进程发起的连接)的最大空闲时间。宝塔默认值通常是 28800(8 小时),但某些云服务器或低配机器可能被系统级配置压低到 60 秒甚至更低。
- 登录宝塔 → 数据库 → 点击对应数据库 → “配置修改”,找到
wait_timeout,设为300(5 分钟)或600(10 分钟)更稳妥 - 同时检查
interactive_timeout,保持与wait_timeout一致,避免交互式会话(如命令行登录)行为不一致 - 改完必须重启 MySQL 服务,仅重载配置无效 —— 宝塔界面点“重启”按钮,别只点“保存”
my.cnf 里加了 max_connections 还是连不上?内存和文件描述符才是瓶颈
max_connections 设再大也没用,如果系统没给 MySQL 足够的资源撑住这些连接。常见表现是:刚启动能连,跑一会儿就全挂,错误日志里出现 Too many connections 或 Can't create thread。
根本原因常是两个硬限制没调:Linux 系统对单进程打开文件数的限制(ulimit -n),以及 MySQL 自身内存分配不足(每个连接至少消耗几十 KB 内存)。
- 进宝塔终端,执行
ulimit -n,若显示1024或更低,需修改:/etc/security/limits.conf加两行:mysql soft nofile 65535和mysql hard nofile 65535 -
my.cnf中不要盲目拉高max_connections,2G 内存的机器建议 ≤ 200;同时配好innodb_buffer_pool_size(建议设为物理内存的 50%–70%,但不超过 1.5G) - 改完 limits 后,必须重启 mysqld 进程(不是 reload),否则新限制不生效
索引没建对,查得慢也会被当成“连接超时”
有些请求看似卡在连接阶段,实际是连接成功后执行 SQL 太久,触发了 PHP 的 max_execution_time 或 Nginx 的 proxy_read_timeout,最终表现为“连接超时”。典型场景:后台导出订单、搜索页面无索引字段过滤、JOIN 多张大表却没走主键。
重点不是“有没有索引”,而是“查询是否命中了有效索引”。用 EXPLAIN 看执行计划比猜有用得多。
- 在宝塔数据库管理页,执行
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at > '2024-01-01',如果type是ALL,说明全表扫描,立刻加复合索引:ALTER TABLE orders ADD INDEX idx_status_created (status, created_at) - 避免在 WHERE 条件里对字段做函数操作,例如
WHERE DATE(created_at) = '2024-01-01'会让索引失效,改成WHERE created_at >= '2024-01-01' AND created_at - 注意
LIKE开头带通配符:LIKE '%abc'无法使用索引,能改就改用全文索引或 ES
宝塔自带防火墙和云厂商安全组经常悄悄拦截
本地 mysql -h 服务器IP -u 用户 -p 能连,但 PHP 死活连不上,十有八九是中间层拦了。宝塔防火墙默认只放行 3306,但它管不了云服务器自己的安全组规则;反过来,开了安全组,宝塔防火墙又可能重复拦截。
- 先关掉宝塔防火墙(面板 → 安全 → 关闭防火墙),测试是否恢复;若恢复,说明是宝塔规则冲突,检查是否有“拒绝所有 3306 入站”的自定义规则
- 再登录云厂商控制台(阿里云/腾讯云等),确认安全组入方向已放行 3306,来源 IP 填
0.0.0.0/0(开发环境)或具体 Web 服务器 IP(生产环境) - MySQL 用户权限要明确绑定 host:
CREATE USER 'app'@'192.168.1.100' IDENTIFIED BY 'pwd';,别用'app'@'%'然后指望它自动匹配内网 IP
真正麻烦的永远不是参数调多少,而是多个层级的限制叠加后,你只看到最上层的“超时”字样,却不知道底层哪一层已经静默拒绝了连接请求。










