0

0

SQL 如何监控 max_connections 被占满的告警与临时扩容

舞夢輝影

舞夢輝影

发布时间:2026-01-27 02:43:23

|

526人浏览过

|

来源于php中文网

原创

应通过监控连接使用率趋势而非瞬时值来实时预警:PG用pg_stat_activity计数与max_connections比值≥85%持续2分钟告警;MySQL结合Threads_connected、Threads_running及滑动窗口分析,避免误判业务波动。

sql 如何监控 max_connections 被占满的告警与临时扩容

如何实时发现 max_connections 即将耗尽

PostgreSQL 和 MySQL 的连接数被打满时,新连接会直接拒绝,错误通常是 FATAL: remaining connection slots are reserved for non-replication superuser connections(PG)或 Too many connections(MySQL)。不能等报错才响应,得提前预警。

关键不是查当前用了多少,而是看「趋势」+「临界阈值」。建议在监控系统中配置:

  • PostgreSQL:每 30 秒采集 SELECT COUNT(*) FROM pg_stat_activity;,对比 SHOW max_connections;,当使用率 ≥ 85% 持续 2 分钟触发告警
  • MySQL:用 SHOW STATUS LIKE 'Threads_connected';SHOW VARIABLES LIKE 'max_connections';,注意 Threads_connected 包含空闲连接,需结合 Threads_running 判断真实压力
  • 避免只看瞬时值——短时 spike 可能是正常业务波动,要叠加滑动窗口(如 5 分钟内最大值 / 平均值)

临时扩容 max_connections 的安全操作路径

动态调大 max_connections 不是简单改个参数重启就行,它受底层资源硬约束。不检查就扩,可能引发 OOM 或内核拒绝分配内存。

执行前必须确认:

  • PostgreSQL:检查 shared_bufferswork_mem 是否已随连接数线性增长——每个连接默认至少占用几 MB 内存,max_connections 从 100 扩到 500,若 work_mem=4MB,理论内存新增约 (500−100)×4MB = 1.6GB
  • MySQL:确认 table_open_cacheinnodb_buffer_pool_instances 等关联参数是否需同步调整,否则可能卡在文件描述符或 mutex 竞争上
  • 操作系统层:用 ulimit -n 查当前进程允许打开的文件数,max_connections 必须 ≤ 该值 × 0.8(留出日志、socket 等其他句柄空间)

线上临时扩容推荐分两步走:ALTER SYSTEM SET max_connections = 300; SELECT pg_reload_conf();(PG),或修改 my.cnfmysqladmin shutdown && mysqld_safe &(MySQL,无法在线生效)。

为什么连接数容易被“假占满”

真正活跃的连接可能只有十几个,但 pg_stat_activity 显示几百个——这通常不是配置太小,而是应用没正确释放连接。

常见诱因:

  • 应用端未调用 connection.close() 或未进 finally 块,尤其在异常分支里漏关
  • 连接池配置不合理:比如 HikariCP 的 maximumPoolSize 设为 100,但 connection-timeout 过长(如 30s),导致请求堆积后大量连接卡在“获取中”状态
  • 数据库端存在长事务或锁等待:state = 'idle in transaction'wait_event = 'Lock' 的连接会持续占 slot,需用 pg_blocking_pids(pid) 定位源头

这类问题扩 max_connections 只是掩盖症状,必须配合 pg_stat_activity 中的 backend_startstate_changequery_start 字段做时间差分析。

可赞AI
可赞AI

文字一秒可视化,免费AI办公神器

下载

告警后快速止损的应急命令清单

告警响了,第一反应不是改配置,而是先释放可杀的连接保服务。

PostgreSQL(谨慎执行):

SELECT pid, usename, application_name, state, now() - backend_start AS uptime, now() - state_change AS idle_time, query
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'idle') AND now() - state_change > interval '5 minutes';

确认无误后批量终止:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle in transaction' AND now() - state_change > interval '5 minutes';

MySQL 类似:

KILL [CONNECTION] [thread_id]; -- 先查 SHOW PROCESSLIST; 找出 Command='Sleep' 且 Time > 300 的

注意:pg_terminate_backend() 对超级用户连接无效;MySQL 的 KILL 不会回滚事务,只断开连接,后续需人工检查数据一致性。

真正难的不是扩容动作本身,而是区分“该扩”还是“该修”——连上去看到 200 个 idle 连接,90% 的情况该翻应用日志,而不是去改 max_connections 配置文件

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

706

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1180

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

778

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

580

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

421

2024.04.29

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 811人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号