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,减少数据库请求。