MySQL 数据库的核心指标按 "运行状态、性能瓶颈、资源占用、数据安全、架构可用性" 五大维度分类,覆盖从基础连接到深层存储、从单实例到主从架构的全场景监控需求。
对于开发人员,可以使用具体SQL命令获取需要的结果;
对于运维人员,在配置Zabbix或Prometheus对MySQL的监控项时,需要获取某一监控项的具体数值,所以对 SQL命令的结果 与 awk、grep、sed 等命令进行值获取处理,直接配置成脚本,可让监控项直接得到具体数值,不必在监控中间件内部对值再进行处理
一、运行状态指标
这类指标反映 MySQL 实例的基础运行健康度,是判断数据库 "是否正常工作" 的首要依据。
1. 启动时长(Uptime)
定义:MySQL 实例启动后的持续运行时间(秒)。
核心作用:可以通过 Uptime 是否重置,判断数据库是否重启过,评估稳定性。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Uptime'
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Uptime';" | awk 'NR==2 {print $2}'
2. 当前连接数(Threads_connected)
定义:正在与 MySQL 建立的活跃连接数,包括空闲 + 正在执行查询的连接。
核心作用:可以反映当前数据库的并发连接压力,关联应用的连接池配置。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Threads_connected';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';" | awk 'NR==2 {print $2}'
3. 最大连接数(max_connections)
定义:MySQL 允许的最大并发连接数,配置项 默认 151。
核心作用:限制连接池上限,避免连接耗尽导致服务不可用。
bash
查询命令
SHOW VARIABLES LIKE 'max_connections';
值获取
mysql -p<password> -e "SHOW VARIABLES LIKE 'max_connections';" | awk 'NR==2 {print $2}'
4. 连接成功率(Connection Success Rate)
定义 :成功连接次数 / 总连接请求数 × 100%,成功连接次数 基于 总连接次数
Connections和 失败连接次数Aborted_connects计算。核心作用:评估数据库是否能正常接收连接,排查权限错误、密码错误、连接数耗尽等问题。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Connections'; # 总连接次数 Connections
SHOW GLOBAL STATUS LIKE 'Aborted_connects'; # 失败连接次数 Aborted_connects
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Connections'; SHOW GLOBAL STATUS LIKE 'Aborted_connects';" | awk '/Connections/ {all=$2} /Aborted_connects/ {fail=$2} END {printf "%.2f%%\n", (1 - fail/all) * 100}'
5. 活跃连接数(Threads_running)
定义:当前正在执行查询、事务、存储过程等操作的线程数量(不包括空闲连接)。
核心作用:反映数据库当前的并发查询压力,判断是否存在查询堵塞。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Threads_running';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Threads_running';" | awk 'NR==2 {print $2}'
6. 空闲连接数(Threads_idle)
定义 :已建立但未执行任何查询的连接数,基于 当前总连接数
Threads_connected==减去== 正在运行的连接数Threads_running核心作用:反映连接池的闲置情况,可以通过 空闲连接是否持续增长 判断是否存在连接泄露。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Threads_connected'; # 当前总连接数 Threads_connected
SHOW GLOBAL STATUS LIKE 'Threads_running'; # 正在运行的连接数 Threads_running
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Threads_running';" | awk '/Threads_connected/ {con=$2} /Threads_running/ {run=$2} END {printf "%d\n", con - run}'
二、查询性能指标
这类指标直接反映数据库的查询效率,是性能优化的核心关注点,需结合业务场景(OLTP/OLAP)判断阈值。
2.1 吞吐量指标(查询 / 事务量级)
1. QPS(Queries Per Second)
定义 :每秒执行的 SQL 查询总数(含 SELECT/INSERT/UPDATE/DELETE),通过 数据库启动后SQL语句总数
Queries==除以== 数据库启动时长Uptime可计算 平均QPS ,通过监控工具可得到单位时间内的 实时QPS。核心作用:反映数据库的整体查询压力,是容量规划的核心指标。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Queries'; # 数据库启动后SQL语句总数 Queries
SHOW GLOBAL STATUS LIKE 'Uptime'; # 数据库启动时长 Uptime
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Queries'; SHOW GLOBAL STATUS LIKE 'Uptime';" | awk '/Queries/ {que=$2} /Uptime/ {upt=$2} END {printf "%2f\n", (que/upt) }'
2. TPS(Transactions Per Second)
定义 :每秒完成的事务数(含提交 + 回滚),通过 总提交事务数 与 总回滚事务数 的 和
(Com_commit + Com_rollback)除以 数据库启动时长Uptime可计算平均TPS,通过监控工具可得到单位时间内的 实时TPS。核心作用:反映数据库处理写操作的能力,如电商下单、支付场景。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Com_commit'; # 总提交事务数 Com_commit
SHOW GLOBAL STATUS LIKE 'Com_rollback'; # 总回滚事务数 Com_rollback
SHOW GLOBAL STATUS LIKE 'Uptime'; # 数据库启动时长 Uptime
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Com_commit';SHOW GLOBAL STATUS LIKE 'Com_rollback';SHOW GLOBAL STATUS LIKE 'Uptime';" | awk '/Com_commit/ {com=$2} /Com_rollback/ {roll=$2} /Uptime/ {upt=$2} END {printf "%2f\n",(com+roll)/upt}'
3. 读 / 写比例(Read/Write Ratio)
定义:读操作数(Com_select)与写操作数(Com_insert + Com_update + Com_delete)的比值。
核心作用:判断数据库访问模式(读多写少、写多读少或读写均衡),指导索引和分库分表设计。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Com_select'; # 读操作数 Com_select
SHOW GLOBAL STATUS LIKE 'Com_insert'; # 插入操作数 Com_insert
SHOW GLOBAL STATUS LIKE 'Com_update'; # 更新操作数 Com_update
SHOW GLOBAL STATUS LIKE 'Com_delete'; # 删除操作数 Com_delete
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS WHERE Variable_name LIKE 'Com_select' OR Variable_name LIKE 'Com_insert' OR Variable_name LIKE 'Com_update' OR Variable_name LIKE 'Com_delete';" | awk '/select/ {sel=$2} /insert/ {ins=$2} /update/ {upd=$2} /delete/ {del=$2} END {printf "%2f\n",sel/(ins+upd+del)}'
2.2 查询效率指标(慢查询、锁等待)
1. 慢查询数(Slow_queries)
定义 :执行时间超过
long_query_time(默认 10 秒)的查询总数。核心作用:定位低效查询,是性能优化的主要线索,如未加索引、SQL 写得差。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Slow_queries';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" | awk 'NR==2 {print $2}'
2. 全表扫描次数(Select_scan)
定义:数据库启动以来执行全表扫描的次数(未使用索引的 SELECT)。
核心作用:反映索引设计是否合理,全表扫描会消耗大量 IO 和 CPU。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Select_scan';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Select_scan';" | awk 'NR==2 {print $2}'
3. 锁等待次数(Innodb_row_lock_waits)
定义:数据库启动以来,事务因等待行锁而被阻塞的总次数。
核心作用:反映事务并发冲突程度(如同一行数据被多个事务同时修改)。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits';" | awk 'NR==2 {print $2}'
4. 死锁次数(Innodb_deadlocks)
定义:数据库启动以来,发生的死锁总次数。
核心作用:死锁会导致事务回滚,影响业务稳定性(如电商下单重复扣减库存)。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks';" | awk 'NR==2 {print $2}'
5. 排序效率(Sort_merge_passes)
定义 :数据库启动以来,执行
ORDER BY或GROUP BY操作时,因 排序数据量超过内存排序缓冲区sort_buffer_size而需要通过「临时文件 + 多次合并排序」完成的排序次数。核心作用 :反映
sort_buffer_size配置是否合理,是否存在严重的 I/O 开销,磁盘排序会显著降低查询速度。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Sort_merge_passes';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Sort_merge_passes';" | awk 'NR==2 {print $2}'
三、存储引擎核心指标
MySQL 主流存储引擎为 InnoDB,其专属指标直接反映存储层的性能和稳定性,是数据库核心瓶颈点。
3.1 缓冲池相关(InnoDB 核心缓存)
1. 缓冲池命中率(Innodb_buffer_pool_read_hit_rate)
定义:应用查询数据时,从缓冲池(内存)中读取数据的比例(而非从磁盘读取),''
物理读次数
Innodb_buffer_pool_reads,总读取请求次数Innodb_buffer_pool_read_requests,命中率 = (1 - 物理读次数 / 总读取请求次数) × 100%,。核心作用:反映缓冲池(InnoDB 核心缓存)的缓存效果,命中率越高,磁盘 IO 越少。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads'; # 物理读次数 Innodb_buffer_pool_reads
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests'; # 总读取请求次数 Innodb_buffer_pool_read_requests
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS WHERE Variable_name LIKE 'Innodb_buffer_pool_reads' OR Variable_name LIKE 'Innodb_buffer_pool_read_requests';" | awk '/reads/ {rds=$2} /read_requests/ {rdr=$2} END {printf "%.2f%%\n",(1-rds/rdr) * 100}'
2. 缓冲池脏页比例(Dirty Pages Ratio)
定义:缓冲池(Buffer Pool)是内存中的一块区域,用于缓存磁盘上的数据页(Data Pages)和索引页(Index Pages)。
干净页(Clean Page):缓冲池中的页与磁盘上的数据完全一致,没有被修改过。
脏页(Dirty Page):缓冲池中的页被修改过,但还没有写入到磁盘上,此时内存中的数据和磁盘上的数据不一致。
脏页比例 就是指缓冲池中 脏页的数量占总页数量的百分比。Innodb_buffer_pool_pages_dirty / Innodb_buffer_pool_pages_total × 100%。
核心作用:脏页是缓冲池中已修改但未写入磁盘的数据页,比例过高会导致刷盘压力。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty'; # 脏页数量 Innodb_buffer_pool_pages_dirty
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; # 总页数量 Innodb_buffer_pool_pages_total
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS WHERE Variable_name LIKE '%pages_dirty' OR Variable_name LIKE '%pages_total';" | awk '/dirty/ {dir=$2} /total/ {tot=$2} END {printf "%.2f%%\n",dir/tot *100}'
3. 缓冲池页面淘汰数(Innodb_buffer_pool_pages_flushed)
定义:数据库启动以来,从 InnoDB 缓冲池中被 淘汰(或称为 "刷新")到磁盘的页面总数。
核心作用:反映缓冲池的容量是否足够,淘汰频繁可能是缓存不足或数据访问分散。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_flushed';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_flushed';" | awk 'NR==2 {print $2}'
3.2 事务日志与刷盘指标
1. 重做日志写入量(Innodb_log_writes)
定义:数据库启动以来,InnoDB 存储引擎向 重做日志文件(Redo Log Files)发起的 物理写入操作的总次数。
核心作用:反映事务的写入压力,redo log 刷盘是事务提交的关键步骤。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_log_writes';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Innodb_log_writes';" | awk 'NR==2 {print $2}'
2. 日志刷盘效率(Innodb_log_fsyncs)
定义:每秒调用 fsync () 刷写 redo log 到磁盘的次数(保证数据持久化)。
核心作用 :关联事务提交性能,
innodb_flush_log_at_trx_commit配置直接影响该指标。
bash
查询命令
SHOW GLOBAL STATUS LIKE '%log_fsyncs';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE '%log_fsyncs';" | awk 'NR==2 {print $2}'
3. 数据文件刷盘量(Innodb_data_writes)
定义:数据库启动以来,InnoDB 存储引擎向 数据文件(.ibd 文件) 发起的 物理写入操作的总次数,简单说就是 InnoDB 将 "脏数据" 从内存真正写入到磁盘数据文件的频繁程度。
核心作用:反映数据持久化的 IO 压力,与脏页刷盘、大事务写入相关。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Innodb_data_writes';
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Innodb_data_writes';" | awk 'NR==2 {print $2}'
3.3 表空间与磁盘占用
1. 表空间总大小(Tablespace Total Size)
定义:所有 InnoDB 表空间(系统表空间 + 独立表空间)的总占用磁盘大小。
核心作用:容量规划核心指标,避免磁盘满导致数据库只读或崩溃。
2. 数据文件增长率(Data File Growth Rate)
定义:每日 / 每周表空间增长的大小(通过监控工具持续采集计算)。
核心作用:预测磁盘容量耗尽时间,提前规划扩容(如分表、归档历史数据)。
3. 临时表空间使用量(Innodb_temp_data_file_size)
定义:InnoDB 临时表空间的占用大小(用于存储临时表、排序结果等)。
核心作用:反映复杂查询(如多表关联、大排序)的临时存储压力。
四、资源占用指标
这类指标关联 MySQL 对服务器 CPU、内存、磁盘、网络的占用,是判断 "数据库是否过度消耗资源" 的关键。
4.1 内存占用
1. 总内存占用(MySQL Memory Usage)
定义 :MySQL 进程占用的物理内存(含缓冲池、线程缓存、查询缓存等),通过
ps -aux | grep mysql查看。核心作用:避免内存溢出(OOM),确保 MySQL 不抢占其他服务(如 Nginx、应用程序)的内存。
bash
1. 查出mysqld的PID
ps -ef | grep [m]ysqld | awk '{print $2}'
2. 查询mysql占用的物理内存
ps -o rss $(ps -ef | grep [m]ysqld | awk '{print $2}')
3. 提取具体值
ps -o rss $(ps -ef | grep [m]ysqld | awk '{print $2}') | awk 'NR==2 {print}'
2. 线程缓存命中率(Thread Cache Hit Rate)
定义:在 MySQL 中,每当有一个客户端连接进来时,MySQL 会创建一个新的线程来处理这个连接的请求。线程的创建和销毁是有开销的(消耗 CPU 和内存)。
当一个客户端断开连接后,MySQL 并不会立即销毁对应的线程,而是将其放入一个 "空闲线程池"(即线程缓存)中。当新的连接请求到来时,MySQL 会首先检查线程缓存,如果有空闲线程,就直接复用这个线程,而不是创建一个新线程。
1 - (Threads Created - Threads Cachaed) / Threads Created * 100
1 - ( 总创建线程数 - 线程缓存池中的空闲线程数 ) / 总创建线程数 * 100,也就是 实际新建线程数 / 总创建线程数 的比例
核心作用 :反映
thread_cache_size配置是否合理,线程创建频繁会消耗 CPU。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Threads_created'; # 总创建线程数 Threads_created
SHOW GLOBAL STATUS LIKE 'Threads_cached'; # 线程缓存池中的空闲线程数 Threads_cached
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS WHERE Variable_name LIKE 'Threads_created' OR Variable_name LIKE 'Threads_cached';" | awk '/created/ {cre=$2} /cached/ {cac=$2} END {printf "%.2f%%\n",(1-(cre-cac)/cre) * 100}'
3. 查询缓存命中率(Qcache_hits / (Qcache_hits + Qcache_inserts))
定义:(仅适用于 MySQL 5.7 及以下,8.0 已废弃)查询缓存复用率。
核心作用:评估查询缓存的有效性(仅适用于读多写少、查询重复率高的场景)。
4.2 CPU / 磁盘 / 网络
1. MySQL CPU 使用率
定义 :MySQL 进程占用的 CPU 核心百分比(通过
top、pidstat查看)。核心作用:反映查询计算压力(如复杂 JOIN、排序、聚合函数)。
bash
值获取
pidstat | grep mysqld | awk '{print $8}'
2. 磁盘 IO 利用率(Disk IO Utilization)
定义 :数据库所在磁盘的读写 IO 使用率(通过
iostat查看,关注%util字段)。核心作用:判断是否存在 IO 瓶颈(如全表扫描、大事务写入、磁盘性能不足)。
3. 网络吞吐量(Network Traffic)
定义 :MySQL 实例的进出网络流量(通过
iftop查看 3306 端口)。核心作用:反映数据库的网络传输压力(如大量大结果集查询、主从复制流量)。
bash
查询命令
SHOW GLOBAL STATUS LIKE 'Bytes_sent'; # 总发送字节数 Bytes_sent
SHOW GLOBAL STATUS LIKE 'Bytes_received'; # 总接收字节数 Bytes_received
值获取
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Bytes_sent';" | awk 'NR==2 {print $2}'
mysql -p<password> -e "SHOW GLOBAL STATUS LIKE 'Bytes_received';" | awk 'NR==2 {print $2}'
五、主从复制指标
若使用 MySQL 主从复制、读写分离、容灾等,以下指标直接反映复制架构的稳定性和数据一致性。
1. 主从复制延迟(Seconds_Behind_Master)
定义 :从库 SQL 线程与主库的时间差(从库
SHOW SLAVE STATUS中查看)。核心作用:反映主从数据同步的滞后程度,影响读写分离的一致性(如从库查不到刚主库写入的数据)。
bash
查询命令,从库执行
SHOW SLAVE STATUS\G # 关注 Seconds_Behind_Master 的值(秒)
值获取
mysql -p<password> -e "SHOW SLAVE STATUS\G" | grep Seconds_Behind_Master | awk '{print $2}'
2. 主从复制状态(Slave_IO_Running / Slave_SQL_Running)
定义:从库 IO 线程(接收主库 binlog)和 SQL 线程(执行 binlog)的运行状态(Yes/No)。
核心作用:判断复制是否正常运行(双Yes),是容灾架构的核心指标。
bash
查询命令,从库执行
SHOW SLAVE STATUS\G # 关注 Seconds_Behind_Master 的值(秒)
值获取
mysql -p<password> -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running:|Slave_SQL_Running:" | awk '{print $2}'
3. 二进制日志文件大小(Binlog File Size)
定义 :主库生成的二进制日志文件大小(通过
show binary logs查看)。核心作用:控制 binlog 轮转频率,避免单个文件过大导致复制延迟或恢复时间过长。
bash
查询命令
SHOW BINARY LOGS; # 所有 binlog 文件
SHOW MASTER STATUS; # 当前活跃 binlog 文件
值获取
mysql -p<password> -e "SHOW BINARY LOGS;" | awk 'NR==2 {print $2}'
mysql -p<password> -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $2}'
4. 中继日志积压量(Relay Log Backlog)
定义:从库未执行的中继日志(relay log)大小。
IO 线程已读取但 SQL 线程未执行的主库 binlog 数据量:
Read_Master_Log_Pos-Exec_Master_Log_Pos核心作用:从库的核心监控指标,反映从库 SQL 线程的执行压力,积压过多会导致复制延迟扩大。
bash
查询命令,从库执行
SHOW SLAVE STATUS\G # 关注 中继日志总大小Relay_Log_Space,IO 线程已读取到的主库 binlog 位置Read_Master_Log_Pos,SQL 线程已执行到的主库 binlog 位置Exec_Master_Log_Pos
值获取
mysql -p<password> -e "SHOW SLAVE STATUS\G" | grep -E "Read_Master_Log_Pos:|Exec_Master_Log_Pos:" | awk '/Read/ {read=$2} /Exec/ {exec=$2} END {printf "%2d\n",read-exec}'
5. 复制一致性校验(Checksum Mismatch)
定义 :验证主库(Master)和从库(Slave)数据是否完全一致的过程(通过
pt-table-checksum工具检测)。核心作用:确保主从数据一致,避免复制异常导致数据丢失或不一致。
bash
查询命令,两个库都执行
CHECKSUM TABLE testDB.testTB EXTENDED;
六、数据安全与完整性指标
1. 备份完成状态(Backup Status)
定义:备份任务是否成功执行(全量 / 增量备份),通过备份工具日志(如 mysqldump、xtrabackup)查看。
核心作用:确保数据可恢复,是灾难恢复的基础。
bash
命令
mysqldump -u root -p<password> --databases test_db > /backup/test_db_$(date +%Y%m%d).sql 2>/backup/mysqldump_$(date +%Y%m%d).log
后续查看生成的日志文件
2. 备份恢复时间(Recovery Time Objective, RTO)
定义:从业务系统发生故障(如数据丢失、数据库崩溃、服务器宕机)到系统完全恢复正常运行、业务可正常提供服务的最长可接受时间。
核心作用:评估容灾能力,指导备份策略优化(如增量备份缩短恢复时间)。
bash
做好备份后,手动模拟故障,并记录每个阶段时间
RTO = 恢复流程总耗时 = 各阶段耗时之和
备份文件准备--数据库初始化--数据导入--数据一致性验证--业务切换与验证
3. 数据校验错误数(Checksum Errors)
定义 :在数据传输、存储或复制过程中,通过 "校验和(Checksum)" 对比发现的 数据不一致或损坏的次数。(InnoDB 自带页校验,通过
Innodb_checksum_algorithm配置)。核心作用:检测数据文件是否损坏(如磁盘错误、硬件故障)。
bash
1.通过 pt-table-checksum 计算 主库执行
pt-table-checksum --host=主库IP --user=root --password=密码 --databases=test_db
SELECT COUNT(*) AS checksum_errors FROM percona.checksums WHERE status = 'MISMATCH'; --统计所有不一致的表/分片数量(即校验错误数)
2.用 CHECKSUM TABLE 手动计算
CHECKSUM TABLE test_db.t1 EXTENDED; -- 主库
CHECKSUM TABLE test_db.t1 EXTENDED; -- 从库