问题现象
通过benchmarksql对MySQL数据库做压测完发现Grafana关于该数据库的监控图趋势不连续,监控数据异常。
说明:Prometheus+mysql+expoter都通过容器运行
日志分析
检查了其他数据库节点跟主机节点趋势图均正常,排除 Prometheus 的问题,检查 expoter 日志发现有报错信息:
time=2025-06-12T06:18:52.960Z level=ERROR source=exporter.go:131 msg="Error opening connection to database" err="Error 1203 (42000): User root already has more than 'max_user_connections' active connections"
通过日志代码 1203 定位分析 MySQL 的用户 root
当前已经达到了最大连接数限制(max_user_connections
),导致 mysqld_exporter
无法再建立新的连接来采集监控数据。
查看活跃连接数
MySQL [test1]> SHOW GLOBAL STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 1900 |
+-------------------+-------+
1 row in set (0.01 sec)
查看 MySQL 中
root
用户的最大连接数限制(MAX_USER_CONNECTIONS
):
MySQL [test1]> SELECT -> USER, -> HOST, -> MAX_USER_CONNECTIONS -> FROM -> mysql.user -> WHERE -> USER = 'root'; +------+-----------+----------------------+ | USER | HOST | MAX_USER_CONNECTIONS | +------+-----------+----------------------+ | root | % | 0 | | root | localhost | 0 | +------+-----------+----------------------+ 2 rows in set (0.00 sec)
MAX_USER_CONNECTIONS = 0
表示该用户使用的是 全局最大连接限制,而不是单独设置的值。所以
root@%
和root@
localhost
都会受到系统变量max_user_connections
的限制。
查看连接数设置
MySQL [test1]> show variables like '%connection%'; +-----------------------------------+----------------------+ | Variable_name | Value | +-----------------------------------+----------------------+ | character_set_connection | utf8mb3 | | collation_connection | utf8_general_ci | | connection_memory_chunk_size | 8912 | | connection_memory_limit | 18446744073709551615 | | global_connection_memory_limit | 18446744073709551615 | | global_connection_memory_tracking | OFF | | max_connections | 10000 | | max_user_connections | 1900 | | mysqlx_max_connections | 100 | +-----------------------------------+----------------------+
参数名 | 值 | 含义 |
max_connections | 10000 | MySQL 允许的最大连接数(包括所有用户) |
max_user_connections | 1900 | 单个用户允许的最大连接数(root 用户受此限制) |
问题定位
root
用户没有设置独立的MAX_USER_CONNECTIONS
,所以受限于全局变量max_user_connections = 1900
MySQL 整体最多支持
max_connections = 10000
个连接因此,一个用户最多只能建立 1900 个连接,超过这个数字就会报错
Error 1203: User root already has more than 'max_user_connections' active connections
解决办法
方案一:更换 mysqld_exporter
使用的数据库用户(推荐)
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;
然后修改 mysqld_exporter 的配置文件 my.cnf 或启动参数,使用新用户连接:
[client] user=exporter password=your_password host=localhost port=3306
方案二:增加 root
用户的最大连接数限制
ALTER USER 'root'@'%' WITH MAX_USER_CONNECTIONS 10000; FLUSH PRIVILEGES;
复测
确认趋势图正常