外观
MySQL 关键指标检查项
连接相关指标
连接数
检查项
- 当前连接数:
Threads_connected - 最大连接数:
max_connections - 连接请求数:
Connections - 连接错误数:
Aborted_connects - 客户端中止连接数:
Aborted_clients
正常范围
- 当前连接数:应低于最大连接数的 80%
- 连接错误数:应低于总连接数的 0.1%
- 客户端中止连接数:应低于总连接数的 0.5%
检查命令
sql
-- 查看当前连接数
SHOW GLOBAL STATUS LIKE 'Threads_connected';
-- 查看最大连接数
SHOW GLOBAL VARIABLES LIKE 'max_connections';
-- 查看连接请求数和错误数
SHOW GLOBAL STATUS LIKE 'Connections';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
SHOW GLOBAL STATUS LIKE 'Aborted_clients';
-- 查看连接状态分布
SHOW PROCESSLIST;
SELECT COMMAND, COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST GROUP BY COMMAND;异常处理
连接数过高:
- 检查是否存在连接泄漏
- 调整
max_connections参数 - 优化连接池配置
- 考虑使用连接池复用连接
连接错误率高:
- 检查网络连接是否稳定
- 检查 DNS 解析是否正常
- 检查用户权限和密码是否正确
- 检查
max_connect_errors参数
性能相关指标
查询性能
检查项
- 慢查询数:
Slow_queries - 查询执行次数:
Queries - 每秒查询数(QPS):通过
Queries计算 - 每秒事务数(TPS):通过
Com_commit和Com_rollback计算 - 锁等待次数:
Innodb_row_lock_waits - 死锁次数:
Innodb_deadlocks
正常范围
- 慢查询率:应低于总查询数的 0.1%
- 锁等待率:应低于总事务数的 0.5%
- 死锁次数:应低于每秒 1 次
检查命令
sql
-- 查看慢查询数
SHOW GLOBAL STATUS LIKE 'Slow_queries';
-- 查看查询执行次数
SHOW GLOBAL STATUS LIKE 'Queries';
-- 计算 QPS
SELECT VARIABLE_VALUE / (SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Uptime') AS QPS FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Queries';
-- 计算 TPS
SELECT (VARIABLE_VALUE1 + VARIABLE_VALUE2) / (SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Uptime') AS TPS FROM (SELECT VARIABLE_VALUE AS VARIABLE_VALUE1 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Com_commit') t1, (SELECT VARIABLE_VALUE AS VARIABLE_VALUE2 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Com_rollback') t2;
-- 查看锁等待和死锁次数
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits';
SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks';异常处理
慢查询数过多:
- 分析慢查询日志
- 优化慢查询语句
- 增加或优化索引
- 调整查询缓存(如果启用)
锁等待次数过多:
- 分析锁等待日志
- 优化事务设计,减少锁持有时间
- 调整隔离级别
- 优化索引,减少全表扫描
死锁次数过多:
- 分析死锁日志
- 优化事务顺序
- 减少事务持有时间
- 调整隔离级别
内存使用
检查项
- 缓冲区池使用情况:
Innodb_buffer_pool_pages_data,Innodb_buffer_pool_pages_free,Innodb_buffer_pool_pages_total - 缓冲池命中率:通过缓冲池页面数据计算
- 查询缓存命中率:如果启用了查询缓存
- 临时表使用情况:
Created_tmp_tables,Created_tmp_disk_tables
正常范围
- 缓冲池命中率:应高于 95%
- 临时表磁盘使用率:应低于总临时表的 25%
检查命令
sql
-- 查看缓冲池使用情况
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages%';
-- 计算缓冲池命中率
SELECT CONCAT(ROUND((VARIABLE_VALUE1 / (VARIABLE_VALUE1 + VARIABLE_VALUE2)) * 100, 2), '%') AS buffer_pool_hit_rate FROM (SELECT VARIABLE_VALUE AS VARIABLE_VALUE1 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests') t1, (SELECT VARIABLE_VALUE AS VARIABLE_VALUE2 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') t2;
-- 查看临时表使用情况
SHOW GLOBAL STATUS LIKE 'Created_tmp%';异常处理
缓冲池命中率低:
- 增加
innodb_buffer_pool_size参数 - 优化查询,减少不必要的数据读取
- 考虑使用 SSD 磁盘
- 增加
临时表磁盘使用率高:
- 优化查询,减少临时表使用
- 增加
tmp_table_size和max_heap_table_size参数 - 优化索引,减少排序和分组操作
存储相关指标
磁盘 I/O
检查项
- InnoDB I/O 操作次数:
Innodb_data_reads,Innodb_data_writes - InnoDB I/O 吞吐量:
Innodb_data_read,Innodb_data_written - 等待 I/O 的时间:
Innodb_data_reads * innodb_io_capacity估算
正常范围
- I/O 等待时间:应低于总执行时间的 20%
- 磁盘使用率:应低于 80%
检查命令
sql
-- 查看 InnoDB I/O 操作次数
SHOW GLOBAL STATUS LIKE 'Innodb_data_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_data_writes';
-- 查看 InnoDB I/O 吞吐量
SHOW GLOBAL STATUS LIKE 'Innodb_data_read';
SHOW GLOBAL STATUS LIKE 'Innodb_data_written';
-- 查看磁盘空间使用率
SHOW GLOBAL VARIABLES LIKE 'datadir';
-- 然后在操作系统中使用 df -h 检查磁盘空间异常处理
I/O 等待时间长:
- 检查磁盘是否存在性能瓶颈
- 调整
innodb_io_capacity和innodb_io_capacity_max参数 - 优化查询,减少 I/O 操作
- 考虑使用 SSD 磁盘
磁盘使用率高:
- 清理无用数据或日志
- 考虑扩容磁盘
- 优化存储结构,如分区表
日志空间
检查项
- 二进制日志大小:通过操作系统命令检查
- 慢查询日志大小:通过操作系统命令检查
- 错误日志大小:通过操作系统命令检查
- 中继日志大小:通过操作系统命令检查
正常范围
- 日志文件大小:应低于磁盘空间的 50%
- 日志保留时间:应根据备份策略和合规要求设置
检查命令
sql
-- 查看二进制日志列表
SHOW BINARY LOGS;
-- 查看慢查询日志配置
SHOW GLOBAL VARIABLES LIKE 'slow_query_log%';
-- 查看错误日志配置
SHOW GLOBAL VARIABLES LIKE 'log_error';
-- 查看中继日志配置
SHOW GLOBAL VARIABLES LIKE 'relay_log%';
-- 然后在操作系统中使用 ls -lh 检查日志文件大小异常处理
- 日志文件过大:
- 调整日志轮转策略
- 清理旧日志文件
- 调整日志保留时间
复制相关指标
主从复制
检查项
- 复制状态:
Slave_IO_Running,Slave_SQL_Running - 复制延迟:
Seconds_Behind_Master - 复制错误:通过
SHOW SLAVE STATUS查看 - 二进制日志位置:
Master_Log_File,Read_Master_Log_Pos - 中继日志位置:
Relay_Master_Log_File,Exec_Master_Log_Pos
正常范围
- 复制状态:
Slave_IO_Running和Slave_SQL_Running都应为Yes - 复制延迟:应低于 30 秒
检查命令
sql
-- 查看复制状态
SHOW SLAVE STATUS\G;
-- 查看复制延迟
SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Seconds_Behind_Master';
-- 查看复制线程状态
SHOW PROCESSLIST LIKE 'SQL%';
SHOW PROCESSLIST LIKE 'IO%';异常处理
复制线程停止:
- 检查错误信息,修复问题
- 重新启动复制线程
- 必要时重新初始化复制
复制延迟高:
- 检查网络连接是否稳定
- 优化主库写入性能
- 调整从库参数,如
slave_parallel_workers - 考虑使用并行复制
组复制
检查项
- 组复制成员状态:
MEMBER_STATE - 组复制成员角色:
MEMBER_ROLE - 事务冲突次数:
TRANSACTIONS_CONFLICTS - 事务队列长度:
QUEUE_LENGTH
正常范围
- 成员状态:所有成员应为
ONLINE - 事务冲突次数:应低于总事务数的 0.1%
- 事务队列长度:应低于 100
检查命令
sql
-- 查看组复制成员状态
SELECT * FROM performance_schema.replication_group_members;
-- 查看组复制成员统计信息
SELECT * FROM performance_schema.replication_group_member_stats;
-- 查看组复制状态变量
SHOW GLOBAL STATUS LIKE 'group_replication%';异常处理
成员状态异常:
- 检查网络连接
- 检查组复制配置
- 重新加入成员
事务冲突次数多:
- 优化应用程序,减少冲突
- 调整事务隔离级别
- 考虑使用行级锁
InnoDB 相关指标
缓冲池
检查项
- 缓冲池大小:
innodb_buffer_pool_size - 缓冲池实例数:
innodb_buffer_pool_instances - 缓冲池使用率:通过
Innodb_buffer_pool_pages_data和Innodb_buffer_pool_pages_total计算 - 脏页比例:
Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total - 缓冲池命中率:通过
Innodb_buffer_pool_read_requests和Innodb_buffer_pool_reads计算
正常范围
- 缓冲池使用率:应在 80%-90% 之间
- 脏页比例:应低于 20%
- 缓冲池命中率:应高于 95%
检查命令
sql
-- 查看缓冲池配置
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool%';
-- 查看缓冲池使用情况
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages%';
-- 计算脏页比例
SELECT CONCAT(ROUND((VARIABLE_VALUE1 / VARIABLE_VALUE2) * 100, 2), '%') AS dirty_page_ratio FROM (SELECT VARIABLE_VALUE AS VARIABLE_VALUE1 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty') t1, (SELECT VARIABLE_VALUE AS VARIABLE_VALUE2 FROM GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total') t2;异常处理
缓冲池使用率过高:
- 增加
innodb_buffer_pool_size参数 - 优化查询,减少数据读取
- 增加
脏页比例高:
- 调整
innodb_max_dirty_pages_pct参数 - 检查 I/O 性能
- 考虑增加 I/O 资源
- 调整
事务
检查项
- 活动事务数:通过
SHOW ENGINE INNODB STATUS查看 - 锁定的事务数:
Innodb_trx表中的记录数 - 锁等待时间:
Innodb_row_lock_time_avg - 死锁次数:
Innodb_deadlocks
正常范围
- 活动事务数:应低于 100
- 锁等待平均时间:应低于 100 毫秒
- 死锁次数:应低于每秒 1 次
检查命令
sql
-- 查看活动事务
SHOW ENGINE INNODB STATUS\G;
-- 查看锁定的事务
SELECT * FROM information_schema.innodb_trx;
-- 查看锁等待时间
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_time_avg';
-- 查看死锁次数
SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks';异常处理
活动事务数过多:
- 检查长时间运行的事务
- 优化事务设计,减少事务持有时间
- 考虑使用更细粒度的锁
锁等待时间长:
- 分析锁等待原因
- 优化索引,减少锁竞争
- 调整事务隔离级别
系统相关指标
CPU 使用
检查项
- MySQL 进程 CPU 使用率:通过操作系统命令检查
- 系统 CPU 使用率:通过操作系统命令检查
- 用户 CPU 使用率:通过
SHOW GLOBAL STATUS LIKE 'CPU_user%'查看 - 系统 CPU 使用率:通过
SHOW GLOBAL STATUS LIKE 'CPU_system%'查看
正常范围
- MySQL CPU 使用率:应低于系统总 CPU 的 70%
- 系统 CPU 使用率:应低于 80%
检查命令
bash
# 使用 top 检查 MySQL 进程 CPU 使用率
top -p $(pgrep -f mysqld)
# 使用 vmstat 检查系统 CPU 使用率
vmstat 1 10
# 使用 mpstat 检查 CPU 使用率详情
mpstat -P ALL 1 5异常处理
- CPU 使用率高:
- 分析慢查询和高 CPU 消耗的查询
- 优化查询语句
- 增加或优化索引
- 考虑升级硬件
内存使用
检查项
- MySQL 进程内存使用率:通过操作系统命令检查
- 系统内存使用率:通过操作系统命令检查
- InnoDB 缓冲池使用:
innodb_buffer_pool_size - 其他缓冲使用:
key_buffer_size,sort_buffer_size,read_buffer_size等
正常范围
- MySQL 内存使用率:应根据配置合理,避免内存溢出
- 系统内存使用率:应低于 80%
检查命令
bash
# 使用 top 检查 MySQL 进程内存使用率
top -p $(pgrep -f mysqld)
# 使用 free 检查系统内存使用率
free -h
# 使用 pmap 检查 MySQL 内存详情
pmap -x $(pgrep -f mysqld) | head -20异常处理
- 内存使用率高:
- 调整 MySQL 内存配置
- 优化查询,减少内存使用
- 考虑升级内存
安全相关指标
用户权限
检查项
- 特权用户数量:
SELECT COUNT(*) FROM mysql.user WHERE Super_priv = 'Y' - 无密码用户:
SELECT User, Host FROM mysql.user WHERE authentication_string = '' - 匿名用户:
SELECT User, Host FROM mysql.user WHERE User = '' - 远程 root 访问:
SELECT User, Host FROM mysql.user WHERE User = 'root' AND Host != 'localhost'
正常范围
- 特权用户数量:应尽可能少,仅保留必要的管理员用户
- 无密码用户:应为 0
- 匿名用户:应为 0
- 远程 root 访问:应禁用,或限制特定 IP
检查命令
sql
-- 查看特权用户
SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';
-- 查看无密码用户
SELECT User, Host FROM mysql.user WHERE authentication_string = '';
-- 查看匿名用户
SELECT User, Host FROM mysql.user WHERE User = '';
-- 查看远程 root 访问
SELECT User, Host FROM mysql.user WHERE User = 'root' AND Host != 'localhost';异常处理
特权用户过多:
- 审查和撤销不必要的特权
- 使用最小权限原则
存在无密码或匿名用户:
- 删除或密码保护这些用户
- 限制用户访问范围
安全配置
检查项
- SSL/TLS 配置:
SHOW GLOBAL VARIABLES LIKE 'ssl%' - 密码策略:
SHOW GLOBAL VARIABLES LIKE 'validate_password%' - 审计日志:
SHOW GLOBAL VARIABLES LIKE 'audit%' - 防火墙规则:通过操作系统命令检查
正常范围
- SSL/TLS:应在生产环境中启用
- 密码策略:应配置强密码策略
- 审计日志:应根据合规要求启用
- 防火墙:应限制不必要的端口访问
检查命令
sql
-- 查看 SSL/TLS 配置
SHOW GLOBAL VARIABLES LIKE 'ssl%';
-- 查看密码策略
SHOW GLOBAL VARIABLES LIKE 'validate_password%';
-- 查看审计日志配置
SHOW GLOBAL VARIABLES LIKE 'audit%';
-- 使用 iptables 检查防火墙规则
iptables -L -n | grep 3306异常处理
- 安全配置不完整:
- 启用 SSL/TLS
- 配置强密码策略
- 根据需要启用审计日志
- 配置防火墙规则
监控与告警
监控工具
推荐工具
- Prometheus + Grafana:开源监控和可视化工具
- Zabbix:企业级监控解决方案
- Nagios:传统监控工具
- MySQL Enterprise Monitor:MySQL 企业版监控工具
- Percona Monitoring and Management (PMM):Percona 提供的监控工具
关键告警指标
- 连接数:超过最大连接数的 80%
- 慢查询数:每秒超过 5 个
- 复制延迟:超过 30 秒
- 磁盘使用率:超过 80%
- CPU 使用率:超过 80% 持续 5 分钟
- 内存使用率:超过 80% 持续 5 分钟
- 复制状态异常:
Slave_IO_Running或Slave_SQL_Running为No - 死锁次数:每秒超过 1 次
定期检查计划
日常检查
- 连接状态和连接数
- 复制状态和延迟
- 慢查询数
- 磁盘和内存使用率
- 错误日志
周检查
- 索引使用情况
- 表碎片
- 用户权限
- 安全配置
- 备份状态
月检查
- 性能优化建议
- 存储规划
- 复制拓扑审查
- 安全审计
- 灾难恢复测试
常见问题(FAQ)
Q1: 如何设置合理的最大连接数?
A1: 应根据以下因素设置:
- 服务器 CPU 核数:一般为 CPU 核数的 2-4 倍
- 内存大小:每个连接大约需要 2-10MB 内存
- 应用程序负载:根据最大并发需求
- 其他服务占用的资源
Q2: 如何降低慢查询率?
A2: 可以通过以下方式降低慢查询率:
- 分析慢查询日志,优化慢查询语句
- 增加或优化索引
- 调整查询缓存(如果启用)
- 优化表结构,如分区表
- 升级硬件,如使用 SSD 磁盘
Q3: 如何处理复制延迟?
A3: 可以通过以下方式处理复制延迟:
- 检查网络连接是否稳定
- 优化主库写入性能
- 调整从库参数,如
slave_parallel_workers - 考虑使用并行复制
- 升级从库硬件
Q4: 如何监控 MySQL 的健康状态?
A4: 可以通过以下方式监控:
- 使用监控工具,如 Prometheus + Grafana
- 定期执行健康检查脚本
- 监控关键指标并设置告警
- 定期查看错误日志和慢查询日志
Q5: 如何优化 InnoDB 缓冲池?
A5: 可以通过以下方式优化:
- 调整
innodb_buffer_pool_size参数,一般设置为系统内存的 70%-80% - 调整
innodb_buffer_pool_instances参数,根据 CPU 核数设置 - 启用缓冲池预加载,如
innodb_buffer_pool_load_at_startup - 监控缓冲池命中率,及时调整配置
Q6: 如何处理死锁问题?
A6: 可以通过以下方式处理:
- 分析死锁日志,找出死锁原因
- 优化事务顺序,减少死锁概率
- 减少事务持有时间
- 调整事务隔离级别
- 使用更细粒度的锁
Q7: 如何确保 MySQL 的安全性?
A7: 可以通过以下方式确保安全性:
- 启用 SSL/TLS 加密
- 配置强密码策略
- 限制用户权限,遵循最小权限原则
- 禁用不必要的用户和服务
- 定期审计用户权限和安全配置
- 配置防火墙规则,限制访问来源
