Skip to content

MySQL 监控指标

监控指标是数据库运维的重要组成部分,通过监控关键指标可以及时发现并解决数据库问题,确保数据库的高性能和高可用性。本文将详细介绍MySQL的核心监控指标、状态指标、性能指标和生产环境最佳实践。

监控指标概述

什么是监控指标

监控指标是用于衡量数据库性能、可用性和健康状况的数据点,通过监控这些指标可以了解数据库的运行状态,及时发现并解决问题。

监控指标的分类

根据监控指标的用途和来源,MySQL监控指标可以分为以下几类:

  • 状态指标:反映数据库当前的状态,如连接数、线程数等
  • 性能指标:反映数据库的性能,如查询响应时间、吞吐量等
  • 资源使用指标:反映数据库的资源使用情况,如CPU、内存、磁盘、网络等
  • 错误指标:反映数据库的错误情况,如错误日志、慢查询等
  • 复制指标:反映数据库复制的状态,如复制延迟、复制错误等

监控指标的重要性

  • 及时发现问题:通过监控指标可以及时发现数据库的性能问题和故障
  • 预测问题:通过分析监控指标的趋势,可以预测可能出现的问题
  • 优化性能:通过监控指标可以了解数据库的性能瓶颈,进行针对性优化
  • 保障可用性:通过监控指标可以确保数据库的高可用性
  • 容量规划:通过监控指标可以进行数据库的容量规划

核心监控指标

连接指标

连接指标反映数据库的连接状态和连接数:

指标名称说明正常范围警告阈值临界阈值版本支持
Threads_connected当前连接数< 80% max_connections> 80% max_connections> 90% max_connections5.6+
Threads_running当前运行中的线程数< CPU核心数> CPU核心数*2> CPU核心数*45.6+
Threads_created自启动以来创建的线程数无固定值结合连接率分析结合连接率分析5.6+
Max_used_connections历史最大连接数< max_connections> 80% max_connections> 90% max_connections5.6+
Connection_errors_*连接错误数0> 10/min> 100/min5.6+

查询指标

查询指标反映数据库的查询性能和吞吐量:

指标名称说明正常范围警告阈值临界阈值版本支持
Queries总查询数无固定值结合业务增长分析结合业务增长分析5.6+
Questions客户端发起的查询数无固定值结合业务增长分析结合业务增长分析5.6+
Slow_queries慢查询数0> 10/min> 100/min5.6+
QPS每秒查询数无固定值结合硬件配置分析结合硬件配置分析5.6+
TPS每秒事务数无固定值结合硬件配置分析结合硬件配置分析5.6+

缓存指标

缓存指标反映数据库缓存的使用情况:

指标名称说明正常范围警告阈值临界阈值版本支持
Innodb_buffer_pool_read_requestsInnoDB缓冲池读请求数无固定值结合缓冲池命中率分析结合缓冲池命中率分析5.6+
Innodb_buffer_pool_reads物理读请求数无固定值结合缓冲池命中率分析结合缓冲池命中率分析5.6+
Innodb_buffer_pool_hit_rateInnoDB缓冲池命中率> 99%< 99%< 95%5.6+
Key_read_requests索引读请求数无固定值结合键缓存命中率分析结合键缓存命中率分析5.6+
Key_reads物理索引读请求数无固定值结合键缓存命中率分析结合键缓存命中率分析5.6+
Key_hit_rate键缓存命中率> 99%< 99%< 95%5.6+

锁指标

锁指标反映数据库的锁使用情况:

指标名称说明正常范围警告阈值临界阈值版本支持
Innodb_row_lock_current_waits当前等待行锁的事务数0> 5> 105.6+
Innodb_row_lock_waits行锁等待次数无固定值> 100/min> 1000/min5.6+
Innodb_row_lock_time行锁等待总时间(毫秒)无固定值> 1000/min> 10000/min5.6+
Innodb_deadlocks死锁数0> 1/day> 10/day5.6+

事务指标

事务指标反映数据库的事务处理情况:

指标名称说明正常范围警告阈值临界阈值版本支持
Com_commit提交的事务数无固定值结合业务分析结合业务分析5.6+
Com_rollback回滚的事务数< 1% Com_commit> 1% Com_commit> 5% Com_commit5.6+
Innodb_transactionsInnoDB事务数无固定值结合业务分析结合业务分析5.6+
Innodb_history_list_length事务历史列表长度< 10000> 10000> 1000005.6+

状态指标

全局状态变量

全局状态变量反映数据库的整体运行状态:

sql
-- 查看所有全局状态变量
SHOW GLOBAL STATUS;

-- 查看特定状态变量
SHOW GLOBAL STATUS LIKE 'Threads%';
SHOW GLOBAL STATUS LIKE 'Innodb%';
SHOW GLOBAL STATUS LIKE 'Slow_queries';

会话状态变量

会话状态变量反映当前会话的运行状态:

sql
-- 查看所有会话状态变量
SHOW SESSION STATUS;

-- 查看特定会话状态变量
SHOW SESSION STATUS LIKE 'Auto_commit';
SHOW SESSION STATUS LIKE 'Last_query_cost';

常用状态变量解读

  • Aborted_clients:客户端异常终止的连接数
  • Aborted_connects:连接失败的次数
  • Binlog_cache_disk_use:使用磁盘二进制日志缓存的事务数
  • Binlog_cache_use:使用二进制日志缓存的事务数
  • Bytes_received:从客户端接收的字节数
  • Bytes_sent:发送给客户端的字节数
  • Created_tmp_disk_tables:在磁盘上创建的临时表数
  • Created_tmp_tables:创建的临时表总数
  • **Handler_*:各种内部操作的计数,如Handler_read_first、Handler_read_key等
  • Open_files:当前打开的文件数
  • Open_tables:当前打开的表数
  • Table_locks_immediate:立即获取的表锁数
  • Table_locks_waited:需要等待的表锁数

性能指标

查询性能指标

查询性能指标反映数据库的查询速度和效率:

  • 查询响应时间:查询执行所需的时间
  • 执行计划:查询的执行计划
  • 索引使用情况:查询使用索引的情况
  • 扫描行数:查询扫描的数据行数

事务性能指标

事务性能指标反映数据库的事务处理速度和效率:

  • 事务响应时间:事务执行所需的时间
  • 事务吞吐量:每秒处理的事务数
  • 事务并发数:同时执行的事务数

复制性能指标

复制性能指标反映数据库复制的状态和效率:

  • Seconds_behind_master:从库落后主库的秒数
  • Slave_IO_Running:I/O线程是否运行
  • Slave_SQL_Running:SQL线程是否运行
  • Last_IO_Error:I/O线程的最后一个错误
  • Last_SQL_Error:SQL线程的最后一个错误

资源使用指标

CPU使用指标

  • CPU利用率:数据库进程使用的CPU百分比
  • 系统CPU利用率:整个系统的CPU利用率
  • 用户CPU利用率:用户态CPU利用率
  • 系统CPU利用率:系统态CPU利用率
  • 空闲CPU利用率:空闲CPU百分比

内存使用指标

  • 内存利用率:数据库进程使用的内存百分比
  • 系统内存利用率:整个系统的内存利用率
  • InnoDB缓冲池使用率:InnoDB缓冲池的使用率
  • 键缓存使用率:键缓存的使用率
  • 查询缓存使用率:查询缓存的使用率(MySQL 5.7及以下)

磁盘使用指标

  • 磁盘空间使用率:磁盘空间的使用率
  • 磁盘I/O利用率:磁盘I/O的利用率
  • 磁盘读写速度:磁盘的读写速度
  • 磁盘读写延迟:磁盘读写的延迟
  • InnoDB日志文件大小:InnoDB日志文件的大小
  • 表空间大小:数据库表空间的大小

网络使用指标

  • 网络吞吐量:网络的吞吐量
  • 网络连接数:当前的网络连接数
  • 网络错误数:网络错误的数量

版本差异处理

MySQL 5.6 监控指标

  • 查询缓存:支持查询缓存,但已弃用
  • InnoDB指标:InnoDB相关指标相对较少
  • 性能模式:支持性能模式,但默认关闭
  • 限制:缺少一些高级监控指标

MySQL 5.7 监控指标

  • 查询缓存:已弃用,建议关闭
  • InnoDB指标:增强了InnoDB相关指标
  • 性能模式:默认开启,提供了更多的性能监控指标
  • sys schema:提供了sys schema,便于查看监控指标

MySQL 8.0 监控指标

  • 查询缓存:已移除
  • InnoDB指标:进一步增强了InnoDB相关指标
  • 性能模式:默认开启,提供了更详细的性能监控指标
  • sys schema:增强了sys schema,提供了更多的监控视图
  • 新指标:新增了一些高级监控指标,如内存使用、线程状态等

监控工具

内置监控工具

SHOW STATUS

SHOW STATUS命令用于查看MySQL的状态变量:

sql
-- 查看所有状态变量
SHOW GLOBAL STATUS;

-- 查看特定状态变量
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Slow_queries';

SHOW VARIABLES

SHOW VARIABLES命令用于查看MySQL的配置变量:

sql
-- 查看所有配置变量
SHOW GLOBAL VARIABLES;

-- 查看特定配置变量
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';

SHOW PROCESSLIST

SHOW PROCESSLIST命令用于查看当前的数据库连接和进程:

sql
-- 查看当前进程
SHOW PROCESSLIST;

-- 查看完整的进程列表
SHOW FULL PROCESSLIST;

INFORMATION_SCHEMA

INFORMATION_SCHEMA是MySQL的系统数据库,包含了数据库的元数据:

sql
-- 查看表的信息
SELECT * FROM information_schema.tables WHERE table_schema = 'mydb';

-- 查看索引的信息
SELECT * FROM information_schema.statistics WHERE table_schema = 'mydb';

-- 查看锁的信息
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM information_schema.innodb_lock_waits;

PERFORMANCE_SCHEMA

PERFORMANCE_SCHEMA是MySQL的性能监控数据库:

sql
-- 查看性能模式的状态
SELECT * FROM performance_schema.setup_consumers;

-- 查看事件信息
SELECT * FROM performance_schema.events_statements_summary_by_digest LIMIT 10;

-- 查看内存使用情况
SELECT * FROM performance_schema.memory_summary_global_by_event_name;

SYS SCHEMA

SYS SCHEMA是MySQL 5.7+提供的系统数据库,基于INFORMATION_SCHEMA和PERFORMANCE_SCHEMA提供了更友好的监控视图:

sql
-- 查看慢查询
SELECT * FROM sys.slow_log LIMIT 10;

-- 查看未使用的索引
SELECT * FROM sys.schema_unused_indexes;

-- 查看IO使用情况
SELECT * FROM sys.io_global_by_file_by_bytes;

-- 查看锁等待情况
SELECT * FROM sys.innodb_lock_waits;

第三方监控工具

Zabbix

Zabbix是一款开源的监控工具,支持MySQL监控:

  • 模板支持:提供了MySQL监控模板
  • 自动发现:支持自动发现MySQL实例
  • 告警机制:支持多种告警方式
  • 图形化界面:提供了直观的图形化界面

Prometheus + Grafana

Prometheus是一款开源的监控系统,Grafana是一款开源的数据可视化工具,两者结合可以实现强大的MySQL监控:

  • 指标收集:使用mysqld_exporter收集MySQL指标
  • 数据存储:使用Prometheus存储监控数据
  • 数据可视化:使用Grafana可视化监控数据
  • 告警机制:支持多种告警方式

Nagios

Nagios是一款开源的监控工具,支持MySQL监控:

  • 插件支持:提供了MySQL监控插件
  • 告警机制:支持多种告警方式
  • 扩展性:支持自定义插件

Percona Monitoring and Management (PMM)

PMM是Percona提供的开源监控工具,专门用于监控MySQL、MongoDB和PostgreSQL:

  • 专为数据库设计:专为数据库监控设计
  • 多种数据库支持:支持MySQL、MongoDB和PostgreSQL
  • 图形化界面:提供了直观的图形化界面
  • 性能分析:提供了性能分析工具

生产环境最佳实践

监控指标选择

  • 选择关键指标:只监控关键的指标,避免监控过多的指标
  • 根据业务需求选择:根据业务需求选择需要监控的指标
  • 根据版本选择:根据MySQL版本选择支持的指标
  • 定期审查指标:定期审查监控指标,删除不需要的指标

监控频率

  • 关键指标:1分钟或更频繁
  • 一般指标:5分钟或更频繁
  • 非关键指标:15分钟或更频繁
  • 历史数据保留:根据业务需求保留历史数据,建议至少保留30天

告警设置

  • 设置合理的阈值:根据业务需求和硬件配置设置合理的告警阈值
  • 分级告警:根据告警的严重程度分级,如警告、严重、紧急
  • 告警方式:支持多种告警方式,如邮件、短信、微信、钉钉等
  • 告警确认机制:支持告警确认机制,避免重复告警
  • 告警抑制:支持告警抑制,避免告警风暴

监控数据可视化

  • 使用图形化工具:使用图形化工具可视化监控数据,如Grafana
  • 创建仪表板:创建专门的MySQL监控仪表板
  • 显示关键指标:在仪表板上显示关键的监控指标
  • 支持钻取:支持从汇总数据钻取到详细数据

监控系统高可用

  • 监控系统本身的高可用:确保监控系统本身的高可用性
  • 冗余监控:部署多个监控系统,确保监控的可靠性
  • 离线监控:支持离线监控,避免网络故障导致监控失效

监控案例

慢查询监控

慢查询是数据库性能问题的常见原因,通过监控慢查询可以及时发现并优化慢查询:

sql
-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = ON;

-- 查看慢查询日志位置
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 查看慢查询数
SHOW GLOBAL STATUS LIKE 'Slow_queries';

-- 使用sys schema查看慢查询
SELECT * FROM sys.slow_log ORDER BY start_time DESC LIMIT 10;

连接数监控

连接数是数据库性能的重要指标,通过监控连接数可以及时发现并解决连接泄漏等问题:

sql
-- 查看当前连接数
SHOW GLOBAL STATUS LIKE 'Threads_connected';

-- 查看最大连接数
SHOW GLOBAL VARIABLES LIKE 'max_connections';

-- 查看连接详情
SHOW FULL PROCESSLIST;

-- 使用sys schema查看连接详情
SELECT * FROM sys.processlist WHERE user != 'system user' ORDER BY time DESC;

缓存命中率监控

缓存命中率是数据库性能的重要指标,通过监控缓存命中率可以优化缓存配置:

sql
-- 计算InnoDB缓冲池命中率
SELECT 
  (1 - (SUM(IF(variable_name = 'Innodb_buffer_pool_reads', variable_value, 0) / 
  (SUM(IF(variable_name = 'Innodb_buffer_pool_read_requests', variable_value, 0) + 
   SUM(IF(variable_name = 'Innodb_buffer_pool_reads', variable_value, 0))))) * 100 AS hit_rate
FROM information_schema.global_status 
WHERE variable_name IN ('Innodb_buffer_pool_read_requests', 'Innodb_buffer_pool_reads');

-- 计算键缓存命中率
SELECT 
  (1 - (SUM(IF(variable_name = 'Key_reads', variable_value, 0) / 
  (SUM(IF(variable_name = 'Key_read_requests', variable_value, 0) + 
   SUM(IF(variable_name = 'Key_reads', variable_value, 0))))) * 100 AS hit_rate
FROM information_schema.global_status 
WHERE variable_name IN ('Key_read_requests', 'Key_reads');

结论

监控指标是数据库运维的重要组成部分,通过监控关键指标可以及时发现并解决数据库问题,确保数据库的高性能和高可用性。在实际生产环境中,应该根据业务需求和硬件配置选择合适的监控指标,设置合理的告警阈值,使用合适的监控工具,并定期审查和优化监控策略。

同时,应该根据MySQL版本的特性,选择支持的监控指标和监控工具,充分利用数据库系统提供的监控功能,提高数据库的运维效率和可靠性。