在本地部署 PolarDB(MySQL 引擎)时,可能会遇到如下报错:
ERROR 1040 (08004): Too many connections
这意味着数据库连接数达到上限,无法接收新连接。本文将从报错原因、排查方式、连接数调整和超时控制等方面进行全方位总结,帮助你彻底解决这一问题。
一、问题来源:Too many connections
PolarDB 默认的最大连接数(max_connections
)一般是 151,如果没有及时释放连接或程序连接池配置不当,很容易达到上限。
二、如何快速排查?
1. 查看当前最大连接数
SHOW VARIABLES LIKE 'max_connections';
2. 查看当前已连接数量
SHOW STATUS LIKE 'Threads_connected';
3. 查看当前连接详情(找出来源)
SHOW PROCESSLIST;
或按来源统计连接数:
SELECT user, host, COUNT(*) AS conn_count
FROM information_schema.processlist
GROUP BY user, host
ORDER BY conn_count DESC;
三、调整最大连接数的方法
方法一:临时生效(不重启)
SET GLOBAL max_connections = 500;
-
✔ 立即生效,对新连接有效
-
❌ 重启数据库后失效
-
⚠ 需要
SUPER
权限
注意:不能用
SET max_connections = 500
,那是无效的(session 级不支持)。
方法二:永久生效(推荐)
修改配置文件 /home/polarx/polardbx-engine/my.cnf
:
[mysqld]
max_connections = 500
然后重启数据库服务:
pkill -f mysqld_safe
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=/home/polarx/polardbx-engine/my.cnf --user=polarx &
四、空闲连接超时设置(清理长期占用连接)
查看当前超时设置:
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
默认值通常为 28800 秒(8 小时),可按需调整:
SET GLOBAL wait_timeout = 300;
SET GLOBAL interactive_timeout = 300;
-
单位是:秒
-
wait_timeout:适用于应用程序连接(非交互)
-
interactive_timeout:适用于命令行连接等交互式连接
-
设置后对新连接生效,重启后失效
永久生效方式:
配置文件中添加:
[mysqld]
wait_timeout = 300
interactive_timeout = 300
五、完整数据库重启流程(本地部署)
停止数据库(优雅关闭):
/opt/polardbx_engine/bin/mysqladmin -u root -p shutdown
或者强制停止:
pkill -f mysqld_safe
pkill -f mysqld
启动数据库:
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=/home/polarx/polardbx-engine/my.cnf --user=polarx &
检查是否启动成功:
netstat -anlpt | grep 3306
推荐一键重启脚本(restart.sh)
#!/bin/bash
echo "Stopping PolarDB..."
pkill -f mysqld_safe
pkill -f mysqld
sleep 3
echo "Starting PolarDB..."
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=/home/polarx/polardbx-engine/my.cnf --user=polarx &
sleep 2
echo "Done. Listening ports:"
netstat -anlpt | grep 3306
添加权限并使用:
chmod +x restart.sh
./restart.sh
总结
配置项 | 推荐值 | 单位 | 生效方式 |
---|---|---|---|
max_connections | 500 | 无 | 配置文件或 SET GLOBAL |
wait_timeout | 300 | 秒 | 配置文件或 SET GLOBAL |
interactive_timeout | 300 | 秒 | 配置文件或 SET GLOBAL |