外观
MySQL 监控指标
监控指标是数据库运维的重要组成部分,通过监控关键指标可以及时发现并解决数据库问题,确保数据库的高性能和高可用性。本文将详细介绍MySQL的核心监控指标、状态指标、性能指标和生产环境最佳实践。
监控指标概述
什么是监控指标
监控指标是用于衡量数据库性能、可用性和健康状况的数据点,通过监控这些指标可以了解数据库的运行状态,及时发现并解决问题。
监控指标的分类
根据监控指标的用途和来源,MySQL监控指标可以分为以下几类:
- 状态指标:反映数据库当前的状态,如连接数、线程数等
- 性能指标:反映数据库的性能,如查询响应时间、吞吐量等
- 资源使用指标:反映数据库的资源使用情况,如CPU、内存、磁盘、网络等
- 错误指标:反映数据库的错误情况,如错误日志、慢查询等
- 复制指标:反映数据库复制的状态,如复制延迟、复制错误等
监控指标的重要性
- 及时发现问题:通过监控指标可以及时发现数据库的性能问题和故障
- 预测问题:通过分析监控指标的趋势,可以预测可能出现的问题
- 优化性能:通过监控指标可以了解数据库的性能瓶颈,进行针对性优化
- 保障可用性:通过监控指标可以确保数据库的高可用性
- 容量规划:通过监控指标可以进行数据库的容量规划
核心监控指标
连接指标
连接指标反映数据库的连接状态和连接数:
| 指标名称 | 说明 | 正常范围 | 警告阈值 | 临界阈值 | 版本支持 |
|---|---|---|---|---|---|
| Threads_connected | 当前连接数 | < 80% max_connections | > 80% max_connections | > 90% max_connections | 5.6+ |
| Threads_running | 当前运行中的线程数 | < CPU核心数 | > CPU核心数*2 | > CPU核心数*4 | 5.6+ |
| Threads_created | 自启动以来创建的线程数 | 无固定值 | 结合连接率分析 | 结合连接率分析 | 5.6+ |
| Max_used_connections | 历史最大连接数 | < max_connections | > 80% max_connections | > 90% max_connections | 5.6+ |
| Connection_errors_* | 连接错误数 | 0 | > 10/min | > 100/min | 5.6+ |
查询指标
查询指标反映数据库的查询性能和吞吐量:
| 指标名称 | 说明 | 正常范围 | 警告阈值 | 临界阈值 | 版本支持 |
|---|---|---|---|---|---|
| Queries | 总查询数 | 无固定值 | 结合业务增长分析 | 结合业务增长分析 | 5.6+ |
| Questions | 客户端发起的查询数 | 无固定值 | 结合业务增长分析 | 结合业务增长分析 | 5.6+ |
| Slow_queries | 慢查询数 | 0 | > 10/min | > 100/min | 5.6+ |
| QPS | 每秒查询数 | 无固定值 | 结合硬件配置分析 | 结合硬件配置分析 | 5.6+ |
| TPS | 每秒事务数 | 无固定值 | 结合硬件配置分析 | 结合硬件配置分析 | 5.6+ |
缓存指标
缓存指标反映数据库缓存的使用情况:
| 指标名称 | 说明 | 正常范围 | 警告阈值 | 临界阈值 | 版本支持 |
|---|---|---|---|---|---|
| Innodb_buffer_pool_read_requests | InnoDB缓冲池读请求数 | 无固定值 | 结合缓冲池命中率分析 | 结合缓冲池命中率分析 | 5.6+ |
| Innodb_buffer_pool_reads | 物理读请求数 | 无固定值 | 结合缓冲池命中率分析 | 结合缓冲池命中率分析 | 5.6+ |
| Innodb_buffer_pool_hit_rate | InnoDB缓冲池命中率 | > 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 | > 10 | 5.6+ |
| Innodb_row_lock_waits | 行锁等待次数 | 无固定值 | > 100/min | > 1000/min | 5.6+ |
| Innodb_row_lock_time | 行锁等待总时间(毫秒) | 无固定值 | > 1000/min | > 10000/min | 5.6+ |
| Innodb_deadlocks | 死锁数 | 0 | > 1/day | > 10/day | 5.6+ |
事务指标
事务指标反映数据库的事务处理情况:
| 指标名称 | 说明 | 正常范围 | 警告阈值 | 临界阈值 | 版本支持 |
|---|---|---|---|---|---|
| Com_commit | 提交的事务数 | 无固定值 | 结合业务分析 | 结合业务分析 | 5.6+ |
| Com_rollback | 回滚的事务数 | < 1% Com_commit | > 1% Com_commit | > 5% Com_commit | 5.6+ |
| Innodb_transactions | InnoDB事务数 | 无固定值 | 结合业务分析 | 结合业务分析 | 5.6+ |
| Innodb_history_list_length | 事务历史列表长度 | < 10000 | > 10000 | > 100000 | 5.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版本的特性,选择支持的监控指标和监控工具,充分利用数据库系统提供的监控功能,提高数据库的运维效率和可靠性。
