MySQL监控

3,030 阅读3分钟

数据库管理的关键是要能提前发现问题,而要想提前发现问题,必须要有监控系统,开源的系统有

  • Zabbix
  • Nagios

不过这些系统,一般都是直接使用,重点是监控了什么指标,下面聚焦下具体是什么指标,而不是什么用了什么监控软件。

MySQL常用监控指标

非功能指标:

  • QPS:数据库每秒钟处理的请求数量,包括DML,DDL这样才能体现数据库的性能
  • TPS:数据库每秒处理的事务数量
  • 并发数:数据库当前的并行处理的会话数量
  • 连接数:连接到数据库会话的数量
  • 缓存命中率:InnoDB的缓存命中率

功能指标:

  • 可用性:数据库是否正常对外提供服务
  • 阻塞:当前是否有阻塞的会话,锁住了别人需要的资源
  • 死锁:当前事务是否产生了死锁,相互锁住了对方的资源
  • 慢查询:实时慢查询监控
  • 主从延迟:在异步复制架构中需要

QPS=(Queries1 - Queries2)/时间间隔

show global status where variable_name in ('Queries','uptime');
// 第一次查询
Queries	3532976857
Uptime	32769425
// 第二次查询
Queries	3532977031
Uptime	32769452

QPS = ( 3532977031 -  3532976857 ) / (32769452 - 32769425) = 6.44

TPS=sum(删除,增加,更新)/时间间隔

show global status where variable_name in ('com_insert','com_update','com_delete','uptime');

Com_delete	1721
Com_insert	3404633923
Com_update	30505256
Uptime	32769668

Com_delete	1721
Com_insert	3404633970
Com_update	30505314
Uptime	32769706

TPS = ((3404633970 - 3404633923) + (30505314 - 30505256 ) ) / (32769706 - 32769668) = 2.76

并发数,一般并发数越多,负载越大, 最大连接数为配置的max_connection变量

show global status where variable_name in ('Threads_running','Threads_connected');

Threads_connected	5
Threads_running	3

InnoDB缓存命中率,缓存命中就可以省去读磁盘

(innodb_buffer_pool_read_requests - innodb_buffer_pool_reads) / innodb_buffer_pool_read_requests

innodb_buffer_pool_read_requests:从缓存池中读取的次数

Innodb_buffer_pool_reads: 表示从物理磁盘读取的次数

show global status where variable_name like 'innodb_buffer_pool_read%'
Innodb_buffer_pool_read_requests	122914434867
Innodb_buffer_pool_reads	47710383

命中率 = (122914434867 - 47710383) / 122914434867 = 0.99

非功能指标

可用性,周期的连接服务器执行select @@version

阻塞,多个线程对同一个资源加排它锁导致的

  • 大于5.7版本,查sys.innodb_lock_waits表,wait_started > 多少秒

死锁:

  • Pt-deadlock-logger工具监控, 更直观一些
  • set global innodb_print_all_deadlocks=on,打印的日志比较多,需要自己分析

慢查询:通过日志监控,也可以查information_schema.processlist 表

主从延迟

show slave status;

参考