简体中文 English 会员中心 注销登录
{{currentLangLabel}} ▾
注册 登录
{{item.name}} {{value.name}}
简体中文 English
新闻资讯 Official information DB Connection Timeouts on FR Servers: 6-Step Fix

DB Connection Timeouts on FR Servers: 6-Step Fix

发布时间:2026-10-14

问题一:应用报「Connection refused」连不上数据库

  • 表现:应用日志 SQLSTATE[HY000] [2002] Connection refused 或 Can't connect to MySQL server,所有数据库操作失败。
  • 可能原因:① MySQL/PostgreSQL 服务未启动或崩溃;② 监听端口(3306/5432)被防火墙拦截;③ bind-address 配置错误(只监听 127.0.0.1);④ 数据库服务器宕机。
  • 排查步骤:
    1. systemctl status mysql(或 postgresql)看服务状态;
    2. ss -lntp | grep 3306 看端口是否监听;
    3. mysql -h 127.0.0.1 -u root -p 本地测试;
    4. iptables -L -n | grep 3306 查防火墙。
  • 快速修复:
    1. 启动服务:systemctl start mysql;
    2. 修改 /etc/mysql/mysql.conf.d/mysqld.cnf 的 bind-address = 0.0.0.0;
    3. 放行端口:iptables -A INPUT -p tcp --dport 3306 -j ACCEPT。

问题二:连接超时但服务正常(间歇性)

  • 表现:Connection timed out,但数据库服务正常,重试又能连上,高峰时更频繁。
  • 可能原因:① max_connections 被打满;② 慢查询占满连接;③ 网络丢包/延迟高;④ DNS 解析慢(用主机名连接)。
  • 排查步骤:
    1. mysql -e "SHOW STATUS LIKE 'Threads_connected'" 看当前连接数;
    2. mysql -e "SHOW VARIABLES LIKE 'max_connections'" 看上限;
    3. mysql -e "SHOW PROCESSLIST" 看是否有大量 Sleep/慢查询;
    4. 用 IP 替代主机名连接,排除 DNS 问题。
  • 快速修复:
    1. 临时增大 max_connections:SET GLOBAL max_connections = 500;;
    2. 杀掉长 Sleep 连接:KILL;
    3. 应用层用连接池(如 PgBouncer/HikariCP),复用连接避免频繁创建。

问题三:慢查询导致连接池耗尽

  • 表现:连接数持续高位,应用大量超时,数据库 CPU/IO 飙升。
  • 可能原因:① 缺索引导致全表扫描;② 大表 JOIN 无优化;③ 一次性查太多数据(无 LIMIT);④ 锁等待。
  • 排查步骤:
    1. 开启慢查询日志:SET GLOBAL slow_query_log = 'ON';;
    2. mysqldumpslow -s t /var/log/mysql/slow.log | head -20 找 Top 慢查询;
    3. EXPLAIN 分析执行计划;
    4. SHOW ENGINE INNODB STATUS 看锁等待。
  • 快速修复:
    1. 给高频查询字段加索引;
    2. 大查询加 LIMIT 或分页;
    3. 读写分离,读操作走从库;
    4. 热点数据走 Redis 缓存。

问题四:跨区数据库延迟高/超时

  • 表现:应用在巴黎、数据库在法兰克福,偶发超时,延迟 20–40ms。
  • 可能原因:① 跨区网络抖动;② 数据库连接未复用,每次握手耗时;③ 事务太大导致跨区提交慢。
  • 排查步骤:
    1. ping -c 100 看延迟与丢包;
    2. mtr --tcp --port 3306 看路径;
    3. 抓包看连接建立耗时。
  • 快速修复:
    1. 应用就近部署,巴黎应用用巴黎数据库,避免跨区;
    2. 用连接池复用连接,减少握手;
    3. 大事务拆成小事务,或用异步提交;
    4. 跨区只读用从库,写只在主区。

问题五:数据库连接数持续增长不释放

  • 表现:Threads_connected 持续增长,最终打满 max_connections,应用全挂。
  • 可能原因:① 应用未关闭连接(连接泄漏);② 连接池配置不当(maxIdle 太大);③ 长事务未提交;④ 网络中断导致连接残留。
  • 排查步骤:
    1. SHOW PROCESSLIST 看连接状态与时长;
    2. 检查应用代码是否有 try/finally 关闭连接;
    3. 检查连接池配置(maxLifetime、idleTimeout)。
  • 快速修复:
    1. 设置 wait_timeout = 600 自动回收空闲连接;
    2. 连接池 maxLifetime = 30min、idleTimeout = 10min;
    3. 应用层审查代码,确保连接在 finally 中关闭。

问题六:如何预防数据库连接超时?

  • 连接池:必须用,设置合理的最大连接数(≤ max_connections × 0.8)。
  • 监控:监控 Threads_connected、Threads_running、Slow_queries,设置告警。
  • 慢查询治理:每周 review 慢查询日志,加索引或优化 SQL。
  • 读写分离:读走从库,写走主库,主库压力降 50–70%。
  • 缓存:热点数据走 Redis,减少数据库请求。
Telegram 客服
在线客服 {{chatUnreadTotal > 99 ? '99+' : chatUnreadTotal}}
1BGP 在线客服 {{chatUnreadInSession > 99 ? '99+' : chatUnreadInSession}}
{{chatSessionStatusText}}
正在连接在线客服...
如长时间未响应,可关闭面板后重新打开,或使用备用通道联系 Telegram。
Telegram 客服