Skip to content

MySQL 监控指标参考

连接指标

连接数指标

Connections

  • 描述:尝试连接到MySQL服务器的连接总数
  • 监控意义:了解服务器的连接负载情况
  • 告警阈值:无固定阈值,根据服务器配置和业务需求调整
  • 异常情况:连接数突然增加可能表示有异常访问或业务量突增

Max_used_connections

  • 描述:自服务器启动以来使用的最大连接数
  • 监控意义:评估max_connections配置是否合理
  • 告警阈值:接近max_connections值的80%时告警
  • 优化建议:如果接近max_connections,考虑增加max_connections配置

Threads_connected

  • 描述:当前打开的连接数
  • 监控意义:实时了解当前连接负载
  • 告警阈值:根据服务器配置和业务需求调整
  • 异常情况:连接数持续增长可能表示连接泄漏

Threads_running

  • 描述:当前正在运行的线程数(执行查询的线程)
  • 监控意义:了解当前服务器的活跃程度
  • 告警阈值:超过CPU核心数的2-4倍时告警
  • 异常情况:Threads_running持续过高可能表示查询执行缓慢

Aborted_connects

  • 描述:尝试连接失败的次数
  • 监控意义:了解连接失败情况,可能是认证问题或网络问题
  • 告警阈值:每分钟超过10次时告警
  • 异常情况:Aborted_connects突增可能表示暴力破解攻击

Aborted_clients

  • 描述:客户端异常终止的连接数
  • 监控意义:了解客户端连接异常情况
  • 告警阈值:每分钟超过10次时告警
  • 异常情况:Aborted_clients突增可能表示应用程序问题或网络不稳定

查询指标

查询吞吐量

Questions

  • 描述:服务器收到的查询总数
  • 监控意义:了解服务器的查询负载
  • 告警阈值:无固定阈值,关注趋势变化
  • 异常情况:Questions突增可能表示业务量增加或异常查询

Queries

  • 描述:服务器执行的查询总数(包括存储过程中的查询)
  • 监控意义:了解服务器的总查询负载
  • 告警阈值:无固定阈值,关注趋势变化

QPS (Queries Per Second)

  • 描述:每秒查询数
  • 监控意义:实时了解服务器的查询处理能力
  • 计算方式:Questions / Uptime 或通过监控工具实时计算
  • 告警阈值:根据服务器配置和业务需求调整

TPS (Transactions Per Second)

  • 描述:每秒事务数
  • 监控意义:了解服务器的事务处理能力
  • 计算方式:(Com_commit + Com_rollback) / Uptime
  • 告警阈值:根据服务器配置和业务需求调整

查询执行情况

Slow_queries

  • 描述:执行时间超过long_query_time的查询数
  • 监控意义:了解慢查询情况,需要优化的查询数量
  • 告警阈值:每分钟超过10次时告警
  • 优化建议:分析慢查询日志,优化慢查询

Select_full_join

  • 描述:执行全表连接的查询数
  • 监控意义:了解未使用索引的连接查询情况
  • 告警阈值:每分钟超过5次时告警
  • 优化建议:为连接字段添加索引

Select_full_range_join

  • 描述:执行范围连接的查询数
  • 监控意义:了解使用范围索引的连接查询情况
  • 告警阈值:无固定阈值,关注趋势变化

Select_scan

  • 描述:执行全表扫描的查询数
  • 监控意义:了解未使用索引的查询情况
  • 告警阈值:每分钟超过10次时告警
  • 优化建议:为查询字段添加索引

Select_range

  • 描述:执行范围查询的查询数
  • 监控意义:了解使用范围索引的查询情况
  • 告警阈值:无固定阈值,关注趋势变化

Com_select, Com_insert, Com_update, Com_delete

  • 描述:分别表示SELECT、INSERT、UPDATE、DELETE语句的执行次数
  • 监控意义:了解不同类型查询的分布情况
  • 告警阈值:无固定阈值,关注趋势变化
  • 优化建议:根据查询类型分布,优化相应的索引和配置

InnoDB指标

缓冲池指标

Innodb_buffer_pool_reads

  • 描述:从磁盘读取数据到缓冲池的次数
  • 监控意义:了解缓冲池的命中率,值越低越好
  • 告警阈值:无固定阈值,关注Innodb_buffer_pool_read_requests与Innodb_buffer_pool_reads的比例

Innodb_buffer_pool_read_requests

  • 描述:从缓冲池读取数据的请求次数
  • 监控意义:了解缓冲池的使用情况

Innodb_buffer_pool_read_ahead_rnd

  • 描述:随机预读的次数
  • 监控意义:了解随机预读的效果

Innodb_buffer_pool_read_ahead_seq

  • 描述:顺序预读的次数
  • 监控意义:了解顺序预读的效果

Innodb_buffer_pool_write_requests

  • 描述:向缓冲池写入数据的请求次数
  • 监控意义:了解缓冲池的写入负载

Innodb_buffer_pool_pages_total

  • 描述:缓冲池的总页数
  • 监控意义:了解缓冲池的大小

Innodb_buffer_pool_pages_free

  • 描述:缓冲池中的空闲页数
  • 监控意义:了解缓冲池的空闲情况
  • 告警阈值:空闲页数低于总页数的5%时告警
  • 优化建议:如果空闲页数过少,考虑增加innodb_buffer_pool_size

Innodb_buffer_pool_pages_data

  • 描述:缓冲池中的数据页数
  • 监控意义:了解缓冲池的数据占用情况

Innodb_buffer_pool_pages_dirty

  • 描述:缓冲池中的脏页数
  • 监控意义:了解缓冲池的脏页情况
  • 告警阈值:脏页数超过总页数的20%时告警
  • 优化建议:如果脏页数过多,考虑调整innodb_max_dirty_pages_pct或innodb_io_capacity

Innodb_buffer_pool_bytes_data

  • 描述:缓冲池中数据的总字节数
  • 监控意义:了解缓冲池的数据占用大小

Innodb_buffer_pool_bytes_dirty

  • 描述:缓冲池中脏数据的总字节数
  • 监控意义:了解缓冲池的脏数据大小

日志指标

Innodb_os_log_written

  • 描述:写入InnoDB重做日志的字节数
  • 监控意义:了解InnoDB的写入负载
  • 告警阈值:无固定阈值,关注趋势变化

Innodb_os_log_fsyncs

  • 描述:InnoDB重做日志的fsync操作次数
  • 监控意义:了解InnoDB的I/O操作频率
  • 告警阈值:无固定阈值,关注趋势变化

Innodb_os_log_pending_writes

  • 描述:等待写入的InnoDB重做日志数量
  • 监控意义:了解InnoDB日志写入的等待情况
  • 告警阈值:持续大于0时告警
  • 优化建议:考虑调整innodb_log_file_size或innodb_flush_log_at_trx_commit

Innodb_os_log_pending_fsyncs

  • 描述:等待fsync的InnoDB重做日志数量
  • 监控意义:了解InnoDB日志fsync的等待情况
  • 告警阈值:持续大于0时告警

锁指标

Innodb_row_lock_current_waits

  • 描述:当前等待行锁的事务数
  • 监控意义:了解当前行锁等待情况
  • 告警阈值:大于0时告警
  • 优化建议:分析锁等待情况,优化SQL或调整事务隔离级别

Innodb_row_lock_time

  • 描述:自服务器启动以来的行锁等待总时间(毫秒)
  • 监控意义:了解行锁等待的总体情况

Innodb_row_lock_time_avg

  • 描述:平均行锁等待时间(毫秒)
  • 监控意义:了解平均行锁等待时间
  • 告警阈值:超过100毫秒时告警

Innodb_row_lock_time_max

  • 描述:最大行锁等待时间(毫秒)
  • 监控意义:了解最长的行锁等待时间
  • 告警阈值:超过500毫秒时告警

Innodb_row_lock_waits

  • 描述:行锁等待的总次数
  • 监控意义:了解行锁等待的频繁程度
  • 告警阈值:每分钟超过10次时告警

事务指标

Innodb_trx_id

  • 描述:当前最大的事务ID
  • 监控意义:了解事务ID的使用情况
  • 告警阈值:接近2^48时告警(MySQL 8.0之前的版本)
  • 优化建议:MySQL 8.0之前的版本,事务ID溢出会导致系统不可用,需要定期重启或升级到MySQL 8.0

Innodb_trx_rseg_current_size

  • 描述:当前回滚段的大小
  • 监控意义:了解回滚段的使用情况

Innodb_trx_tables_locked

  • 描述:当前被锁定的表数量
  • 监控意义:了解表锁情况

Innodb_trx_rows_locked

  • 描述:当前被锁定的行数量
  • 监控意义:了解行锁情况

Innodb_trx_rows_modified

  • 描述:当前事务修改的行数量
  • 监控意义:了解事务的修改情况

系统资源指标

CPU指标

%CPU usage

  • 描述:MySQL进程使用的CPU百分比
  • 监控意义:了解MySQL的CPU使用情况
  • 告警阈值:持续超过80%时告警
  • 优化建议:优化慢查询,调整配置,或考虑升级硬件

%System CPU usage

  • 描述:系统CPU使用率
  • 监控意义:了解系统整体的CPU使用情况
  • 告警阈值:持续超过90%时告警

内存指标

Memory usage

  • 描述:MySQL进程使用的内存量
  • 监控意义:了解MySQL的内存使用情况
  • 告警阈值:接近系统内存的80%时告警
  • 优化建议:调整innodb_buffer_pool_size等内存相关配置

Swap usage

  • 描述:系统交换空间的使用情况
  • 监控意义:了解系统是否出现内存不足,使用交换空间
  • 告警阈值:超过10%时告警
  • 优化建议:增加系统内存,调整MySQL内存配置

磁盘I/O指标

Disk read/write throughput

  • 描述:磁盘读写吞吐量(MB/s)
  • 监控意义:了解磁盘I/O负载情况
  • 告警阈值:接近磁盘最大吞吐量的80%时告警

Disk I/OPS

  • 描述:磁盘I/O操作次数(IOPS)
  • 监控意义:了解磁盘I/O的繁忙程度
  • 告警阈值:接近磁盘最大IOPS的80%时告警

Disk latency

  • 描述:磁盘I/O延迟(毫秒)
  • 监控意义:了解磁盘I/O的响应速度
  • 告警阈值:平均延迟超过10毫秒时告警

Innodb_data_reads, Innodb_data_writes

  • 描述:InnoDB数据读写次数
  • 监控意义:了解InnoDB的I/O操作情况

Innodb_data_read, Innodb_data_written

  • 描述:InnoDB数据读写字节数
  • 监控意义:了解InnoDB的I/O吞吐量

网络指标

Network traffic in/out

  • 描述:网络入站/出站流量
  • 监控意义:了解数据库的网络负载情况
  • 告警阈值:接近网络带宽的80%时告警

复制指标

主库复制指标

Binlog_cache_use

  • 描述:使用二进制日志缓存的事务数
  • 监控意义:了解二进制日志缓存的使用情况

Binlog_cache_disk_use

  • 描述:使用磁盘二进制日志缓存的事务数
  • 监控意义:了解二进制日志缓存不足的情况
  • 告警阈值:每分钟超过5次时告警
  • 优化建议:增加binlog_cache_size配置

Binlog_stmt_cache_use, Binlog_stmt_cache_disk_use

  • 描述:语句级二进制日志缓存的使用情况
  • 监控意义:了解语句级二进制日志缓存的使用情况

从库复制指标

Slave_IO_Running, Slave_SQL_Running

  • 描述:从库I/O线程和SQL线程的运行状态
  • 监控意义:了解从库复制是否正常运行
  • 告警阈值:任何一个线程状态为No时告警
  • 优化建议:检查复制配置,修复复制错误

Seconds_Behind_Master

  • 描述:从库落后主库的秒数
  • 监控意义:了解主从复制延迟情况
  • 告警阈值:超过30秒时告警
  • 优化建议:优化从库配置,增加slave_parallel_workers,检查网络状况

Last_Errno, Last_Error

  • 描述:从库复制的最后一个错误号和错误信息
  • 监控意义:了解从库复制错误情况
  • 告警阈值:Last_Errno不为0时告警
  • 优化建议:根据错误信息修复复制错误

Relay_Log_Space

  • 描述:从库中继日志的总大小
  • 监控意义:了解中继日志的使用情况
  • 告警阈值:超过10GB时告警
  • 优化建议:检查从库SQL线程是否正常运行,及时处理复制错误

Slave_retried_transactions

  • 描述:从库重试的事务数
  • 监控意义:了解从库复制重试情况
  • 告警阈值:每分钟超过10次时告警

其他重要指标

服务器状态指标

Uptime

  • 描述:服务器启动以来的秒数
  • 监控意义:了解服务器的运行时间
  • 告警阈值:无固定阈值,关注服务器是否重启

Load_average

  • 描述:系统的平均负载
  • 监控意义:了解系统的整体负载情况
  • 告警阈值:超过CPU核心数的2倍时告警

Open_files

  • 描述:当前打开的文件数
  • 监控意义:了解服务器的文件使用情况
  • 告警阈值:接近open_files_limit值的80%时告警
  • 优化建议:增加open_files_limit配置

Opened_files

  • 描述:自服务器启动以来打开的文件总数
  • 监控意义:了解服务器的文件打开频率

Table_open_cache_hits, Table_open_cache_misses

  • 描述:表缓存的命中和未命中次数
  • 监控意义:了解表缓存的使用效率
  • 告警阈值:Table_open_cache_misses持续增加时告警
  • 优化建议:增加table_open_cache配置

临时表指标

Created_tmp_tables

  • 描述:创建的内存临时表数量
  • 监控意义:了解内存临时表的使用情况

Created_tmp_disk_tables

  • 描述:创建的磁盘临时表数量
  • 监控意义:了解磁盘临时表的使用情况,值越低越好
  • 告警阈值:每分钟超过10次时告警
  • 优化建议:增加tmp_table_size和max_heap_table_size配置

Created_tmp_files

  • 描述:创建的临时文件数量
  • 监控意义:了解临时文件的使用情况

监控工具与查询方式

内置查询方式

使用SHOW GLOBAL STATUS查询指标

sql
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';

使用performance_schema查询详细指标

sql
SELECT * FROM performance_schema.events_statements_summary_global_by_event_name;
SELECT * FROM performance_schema.events_waits_summary_global_by_event_name;

使用sys schema查询指标(MySQL 5.7+)

sql
SELECT * FROM sys.session;
SELECT * FROM sys.processlist;
SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;

开源监控工具

Percona Monitoring and Management (PMM)

  • 特点:专为MySQL设计的监控工具,提供全面的监控指标和可视化
  • 监控指标:涵盖本文档中的大部分指标
  • 优势:易于部署,提供丰富的告警规则

Prometheus + Grafana

  • 特点:强大的监控和可视化平台,支持多种数据源
  • 监控指标:通过MySQL Exporter收集MySQL指标
  • 优势:灵活的告警配置,丰富的可视化图表

Zabbix

  • 特点:功能全面的监控系统,支持多种监控方式
  • 监控指标:通过Zabbix Agent或JDBC监控MySQL
  • 优势:成熟稳定,支持分布式部署

Nagios

  • 特点:经典的监控工具,通过插件扩展功能
  • 监控指标:通过check_mysql等插件监控MySQL
  • 优势:轻量级,易于集成

商业监控工具

MySQL Enterprise Monitor

  • 特点:官方监控工具,提供全面的MySQL监控
  • 监控指标:涵盖MySQL的各种指标
  • 优势:官方支持,提供专家建议

Datadog

  • 特点:云原生监控平台,支持多种服务监控
  • 监控指标:通过Datadog Agent收集MySQL指标
  • 优势:易于集成,提供智能告警

New Relic

  • 特点:应用性能监控,支持数据库监控
  • 监控指标:提供MySQL的关键性能指标
  • 优势:与应用监控集成,提供端到端的性能视图

告警策略建议

告警分级

紧急告警

  • 定义:影响核心业务运行的严重问题
  • 指标示例
    • Slave_IO_Running或Slave_SQL_Running为No
    • Seconds_Behind_Master超过300秒
    • MySQL进程不存在
    • 磁盘空间不足10%
  • 通知方式:电话、短信、即时通讯工具多重通知

重要告警

  • 定义:可能影响业务运行的问题
  • 指标示例
    • Seconds_Behind_Master超过30秒
    • Slow_queries每分钟超过10次
    • CPU使用率持续超过80%
    • 内存使用率持续超过80%
  • 通知方式:即时通讯工具、邮件通知

一般告警

  • 定义:需要关注的问题,可能影响未来性能
  • 指标示例
    • Table_open_cache_misses持续增加
    • Created_tmp_disk_tables每分钟超过5次
    • Innodb_buffer_pool_pages_free持续减少
  • 通知方式:邮件通知

告警配置建议

  1. 设置合理的告警阈值:根据服务器配置、业务需求和历史数据设置告警阈值
  2. 配置告警延迟:避免短暂的峰值触发告警,设置适当的告警延迟
  3. 配置告警升级机制:如果告警未及时处理,自动升级通知方式
  4. 定期审查告警规则:根据业务变化和系统调整,定期审查和调整告警规则
  5. 测试告警规则:定期测试告警规则,确保告警能够正常触发

性能基线建立

基线定义

正常业务基线

  • 描述:正常业务负载下的指标范围
  • 建立方法:收集一段时间(如一周)的正常业务数据,统计指标的平均值和峰值
  • 用途:作为告警阈值的参考,识别异常情况

峰值业务基线

  • 描述:业务峰值时的指标范围
  • 建立方法:收集业务峰值时段的数据,统计指标的平均值和峰值
  • 用途:评估系统在峰值业务下的表现,规划扩容

基线监控与调整

  1. 定期更新基线:每季度或半年更新一次基线,适应业务变化
  2. 监控基线偏差:监控指标与基线的偏差,识别异常情况
  3. 调整告警阈值:根据基线变化,调整告警阈值
  4. 预测资源需求:根据基线趋势,预测未来的资源需求

最佳实践案例

案例1:高并发场景监控

监控重点

  • Threads_connected, Threads_running:了解并发连接和活跃线程情况
  • Innodb_row_lock_current_waits, Innodb_row_lock_time_avg:监控锁等待情况
  • QPS, TPS:了解查询和事务吞吐量
  • Innodb_buffer_pool_pages_dirty:监控缓冲池脏页情况

告警策略

  • Threads_running超过CPU核心数的4倍时告警
  • Innodb_row_lock_current_waits大于0时告警
  • QPS超过历史峰值的120%时告警
  • Innodb_buffer_pool_pages_dirty超过总页数的20%时告警

案例2:主从复制监控

监控重点

  • Slave_IO_Running, Slave_SQL_Running:监控复制线程状态
  • Seconds_Behind_Master:监控复制延迟
  • Last_Errno, Last_Error:监控复制错误
  • Relay_Log_Space:监控中继日志大小

告警策略

  • Slave_IO_Running或Slave_SQL_Running为No时立即告警
  • Seconds_Behind_Master超过30秒时告警
  • Last_Errno不为0时立即告警
  • Relay_Log_Space超过10GB时告警

案例3:性能优化监控

监控重点

  • Slow_queries:监控慢查询数量
  • Select_scan:监控全表扫描数量
  • Innodb_buffer_pool_reads:监控缓冲池物理读数量
  • Innodb_os_log_written:监控日志写入量

告警策略

  • Slow_queries每分钟超过10次时告警
  • Select_scan每分钟超过10次时告警
  • Innodb_buffer_pool_reads与Innodb_buffer_pool_read_requests的比例超过1%时告警
  • Innodb_os_log_written每秒超过10MB时告警

总结

MySQL监控指标是评估数据库性能、可靠性和健康状况的重要依据。本文档总结了MySQL在连接、查询、InnoDB、系统资源、复制等方面的常用监控指标,涵盖了日常运维中的大部分监控需求。

在实际监控中,应根据业务场景和系统配置选择合适的监控指标,并设置合理的告警阈值。同时,建立性能基线,定期更新和调整基线,以便及时发现和处理异常情况。

通过有效的监控和告警,可以提前发现潜在问题,优化数据库性能,确保数据库系统的稳定运行,为业务提供可靠的支持。