跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

mysql如何监控数据库运行状态_利用Prometheus与Grafana监控

mysql_exporter 启动报错主因是MySQL 8.0+禁用root@localhost socket登录且TCP未启用,应创建专用监控用户、确保skip-networking=OFF、bind_address兼容、显式传参配置文件,并验证Prometheus能采集到metrics。 mysql _exporter 启动就报
ERROR: unable to connect to MySQL instance
这是最常见卡点:mysql_exporter 默认用
root@localhost
连,但 MySQL 8.0+ 默认禁用
auth_socket
插件的本地 root 登录,且没开 TCP 连接权限。 实操建议: 创建专用监控用户,别硬刚 root:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'safe_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
确认 MySQL 配置没禁 TCP:检查
skip-networking
是否为
OFF
,
bind_address
别写成
127.0.0.1
(IPv4)却让 exporter 用
localhost
(可能走 socket)——统一用
127.0.0.1:3306
最稳 启动时显式传参,别依赖环境变量出错:
./mysqld_exporter --config.my-cnf=/etc/mysql_exporter.cnf
,其中
/etc/mysql_exporter.cnf
写明
[client]
段用户名密码 Grafana 导入 MySQL Dashboard 后指标全空 不是模板问题,大概率是 Prometheus 没真正抓到数据 —— mysql_exporter 的 metrics 端点(默认
:9104/metrics
)能 curl 通,不代表 Prometheus 能采集到。 实操建议: 先在 Prometheus Web UI 的
Status > Targets
页面看 mysql_exporter target 状态是不是
UP
;如果是
DOWN
,点进去看
LastError
,常见是 DNS 解析失败(比如填了
mysql
容器名但 Prometheus 在宿主机跑) 确认 mysql_exporter 的
--web.listen-address
绑定的是
0.0.0.0:9104
,不是
127.0.0.1:9104
(后者容器外访问不到) Dashboard 里很多 panel 用的是
mysql_global_status_threads_connected
这类指标,如果 MySQL 版本太低(如 5.6),部分状态变量不存在,对应图表就空 —— 换成
mysql_info_schema_processlist_threads
更兼容 高并发下 mysql_exporter 拖慢 MySQL 响应 mysql_exporter 默认每 15 秒扫一次
information_schema
和
performance_schema
,某些查询(比如
SELECT * FROM information_schema.PROCESSLIST
)在连接数几千时会锁表或触发全表扫描。 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 实操建议: 关掉非必要收集项:启动加参数
--collect.global_status=false --collect.info_schema.processlist=false
,保留
global_variables
、
slave_status
这些轻量指标 对 processlist 有刚需?改用
performance_schema.threads
替代(需 MySQL ≥ 5.7,且
performance_schema
开启) 调整采集间隔:Prometheus 的
scrape_interval
别设太密,30 秒比 15 秒更友好;mysql_exporter 本身不支持动态调频,靠 Prometheus 控制节奏 MySQL 主从延迟监控值始终为 0 mysql_exporter 只能通过
SHOW SLAVE STATUS
拿
Seconds_Behind_Master
,但这个值在 IO thread 断开、SQL thread 停滞、或者 GTID 模式下无主从关系时,会返回
NULL
或
0
,不代表真没延迟。 实操建议: 先手动连从库执行
SHOW SLAVE STATUS\G
,看
Slave_IO_Running
和
Slave_SQL_Running
是不是
Yes
;如果否,
Seconds_Behind_Master
就不可信 用
mysql_slave_status_seconds_behind_master
这个指标时,加条件过滤:
mysql_slave_status_seconds_behind_master > 0 and mysql_slave_status_slave_io_running == 1 and mysql_slave_status_slave_sql_running == 1
更可靠的延迟指标其实是主从间 binlog position 差值,但 mysql_exporter 不直接暴露;可自定义 query collector,写 SQL 查
master_log_file/position
和
relay_master_log_file/exec_master_log_pos
差值 事情说清了就结束。真正难的不是配通,是理解每个指标背后查了哪张表、触发了什么锁、在什么 MySQL 版本下失效 —— 监控数据一旦失真,比没有还危险。

相关文章