Skip to content

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_commitCom_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_sizemax_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_capacityinnodb_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_RunningSlave_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_dataInnodb_buffer_pool_pages_total 计算
  • 脏页比例Innodb_buffer_pool_pages_dirty / Innodb_buffer_pool_pages_total
  • 缓冲池命中率:通过 Innodb_buffer_pool_read_requestsInnodb_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_RunningSlave_SQL_RunningNo
  • 死锁次数:每秒超过 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 加密
  • 配置强密码策略
  • 限制用户权限,遵循最小权限原则
  • 禁用不必要的用户和服务
  • 定期审计用户权限和安全配置
  • 配置防火墙规则,限制访问来源