mysqladmin -uroot -proot123 -hlocalhost ping
阻塞时由于多个并发的线程要对同一个资源加排它锁造成的,后面的线程只有等到前面的线程释放了锁之后才能继续执行。
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;
死锁是两个并发执行的事物,相互之间锁住了对方所需要的资源。死锁不怎么影响数据库性能,但会影响业务。
查看存储引擎状态查看最近一次发生的死锁:
show engine innodb status\G
使用pt工具把发生的死锁存入表当中:(推荐使用这一种方式)
把死锁内容输出到错误日志当中
set persist innodb_print_all_deadlocks=on;
实时监控慢SQL
select * from information_schema.processlist where time>60 and command <> 'sleep' and user <> 'event_scheduler';
第一种方法:
在主库建立一张表,只含有一个时间字段,主库定时插入时间,主库从库进行时间比较来监控主从延迟
第二种方法:
show slave status\G
show global status like 'Com_%';
Queries的值是Com_%值的总和
show global status where variable_name in ('Queries','uptime');
QPS=(Queries2-Queries1)/ 时间间隔
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)
show global status like 'Threads_running';
show global status like 'Threads_connected';
报警阈值:Threads_connected / max_connections > 0.8
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%的。