功能类指标
1、可用性:数据库是否可正常对外提供服务
mysqladmin -uroot -proot123 -hlocalhost ping
2、阻塞:当前是否有阻塞的会话
阻塞时由于多个并发的线程要对同一个资源加排它锁造成的,后面的线程只有等到前面的线程释放了锁之后才能继续执行。
MySQL版本小于 8.0时监控阻塞的方法如下:当阻塞超过30秒后查询出来
select b.trx_mysql_thread_id as '被阻塞线程', b.trx_query as '被阻塞SQL', c.trx_mysql_thread_id as '阻塞线程', c.trx_query as '阻塞SQL', (unix_timestamp()-unix_timestamp(c.trx_started)) as '阻塞时间' from information_schema.innodb_lock_waits a join information_schema.innodb_trx b on a.requesting_trx_id=b.trx_id join information_schema.innodb_trx c on a.blocking_trx_id=c.trx_id where (unix_timestamp()-unix_timestamp(c.trx_started)) > 30;
MySQL的版本是 8.0时监控阻塞方法如下:
select waiting_pid as '被阻塞的线程', waiting_query as '被阻塞的SQL', blocking_pid as '阻塞线程', blocking_query as '阻塞SQL', wait_age as '阻 塞时间', sql_kill_blocking_query as '建议操作' from sys.innodb_lock_waits;
3、死锁:当前事物是否产生了死锁
死锁是两个并发执行的事物,相互之间锁住了对方所需要的资源。死锁不怎么影响数据库性能,但会影响业务。
查看存储引擎状态查看最近一次发生的死锁:
show engine innodb status\G
使用pt工具把发生的死锁存入表当中:(推荐使用这一种方式)
把死锁内容输出到错误日志当中
set persist innodb_print_all_deadlocks=on;
4、慢查询:实时慢查询监控
实时监控慢SQL
select * from information_schema.processlist where time>60 and command <> 'sleep' and user <> 'event_scheduler';
5、主从延时:数据库主从延迟时间
第一种方法:
在主库建立一张表,只含有一个时间字段,主库定时插入时间,主库从库进行时间比较来监控主从延迟
第二种方法:
6、主从状态:数据库主从复制链路是否正常
show slave status\G
性能类指标
1、QPS:数据库每秒处理的请求数量
show global status like 'Com_%';
Queries的值是Com_%值的总和
show global status where variable_name in ('Queries','uptime');
QPS=(Queries2-Queries1)/ 时间间隔
2、TPS:数据库每秒钟处理的事物数量
show global status where variable_name in ('Com_insert','Com_delete','Com_update');
Tc ≈ Com_insert + Com_delete + Com_update
TPS ≈ (Tc2 - Tc1) / time2 - time1)
3、并发数:数据库实例当前并行处理的会话数量
show global status like 'Threads_running';
4、连接数:连接到数据库会话的数量
show global status like 'Threads_connected';
报警阈值:Threads_connected / max_connections > 0.8
5、缓存命中率:InnoDB的缓存命中率
innodb_buffer_pool_read_requests : 缓存池中读取总次数
innodb_buffer_pool_reads:表示从物理磁盘读取的次数
缓存命中率 = ( innodb_buffer_pool_read_requests - innodb_buffer_pool_reads ) / innodb_buffer_pool_read_requests
show global status like 'innodb_buffer_pool_read_requests';
show global status like 'innodb_buffer_pool_reads';
在一个繁忙的业务系统中,缓存命中率是不应该小于95%的。