(一)MySQL性能监控

1. show profile查询剖析工具

| 此工具默认是禁止,修改 set profiling=1;设置成功后,服务器上执行的所有语句,都会测量其耗费的时间和其它一些执行状态变更的数据。注意:此工具被标记为过期,将来回逐步弃用。

  1. 查询所有
    • show profiles
  2. all:显示某条所有的性能信息
    • show profile all for query n
  3. block io:显示块io操作次数
    • show profile block io for query n
  4. context switches:显示上下文切换次数,被动和主动
    • show profile context switches for query n
  5. cpu:显示用户cpu时间、系统cpu时间
    • show profile cpu for query n
  6. IPC:显示发送和接受的消息数量
    • show profile ipc for query n
  7. Memory:暂未实现
  8. page faults:显示页错误数量
    • show profile page faults for query n
  9. source:显示源码中的函数名称与位置
    • show profile source for query n
  10. swaps:显示swap的次数
    • show profile swaps for query n

2. performance schema监控MySQL

https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html

2.1 performance_schema介绍

The MySQL Performance Schema is a feature for monitoring MySQL Server execution at a low level。我理解为:低耗能的性能监控工具。

2.2 performance_schema特点

  1. 提供了一种在数据库运行时时机检查server内部执行情况的方法。
  2. performance_schema通过监视server的事件来实现监视server内部运行情况,“事件”就是server内部活动中所做的任何事情以及对应的时间消耗,利用这些信息来判断server中的相关资源消耗在了哪里?
    一般来说,事件可以是函数调用、操作系统的等待、SQL语句执行的阶段(如sql语句执行过程中的parsing 或 sorting阶段)或者整个SQL语句与SQL语句集合。事件采集可以提供同步调用信息,如I|O
    表锁和一些存储引擎
  3. performance_schema中的事件与写入二进制日志中的事件(描述数据修改的events)、事件计划调度程序(这是一种存储程序)的事件不同。performance_schema中的事件记录的是server执行某些活动对某些资源的消耗、耗时、这些活动执行的次数等情况。
  4. performance_schema中的事件只记录在本地server的performance_schema中,其下的这些表中数据发生变化时不会被写入binlog中,也不会通过复制机制被复制到其他server中。
  5. 当前活跃事件、历史事件和事件摘要相关的表中记录的信息。能提供某个事件的执行次数、使用时长。进而可用于分析某个特定线程、特定对象(如mutex或file)相关联的活动。
  6. PERFORMANCE_SCHEMA存储引擎使用server源代码中的“检测点”来实现事件数据的收集。对于performance_schema实现机制本身的代码没有相关的单独线程来检测,这与其他功能(如复制或事件计划程序)不同
  7. 收集的事件数据存储在performance_schema数据库的表中。这些表可以使用SELECT语句查询,也可以使用SQL语句更新performance_schema数据库中的表记录(如动态修改performance_schema的setup_*开头的几个配置表,但要注意:配置表的更改会立即生效,这会影响数据收集)
  8. performance_schema的表中的数据不会持久化存储在磁盘中,而是保存在内存中,一旦服务器重启,这些数据会丢失(包括配置表在内的整个performance_schema下的所有数据)
  9. MySQL支持的所有平台中事件监控功能都可用,但不同平台中用于统计事件时间开销的计时器类型可能会有所差异。

2.3 performance_schema 入门

在mysql的5.7版本中,性能模式是默认开启的。如果想要显式的关闭的话需要修改配置文件,不能直接进行修改,会报错Variable ‘performance_schema’ is a read only variable
– 查看performance_schema的属性
mysql> SHOW VARIABLES LIKE ‘performance_schema’;
–在配置文件中修改performance_schema的属性值,on表示开启,off表示关闭
[mysqld]
performance_schema=ON
想要搞明白后续的内容,需要理解两个基本概念:

  1. instruments: 生产者,用于采集mysql中各种各样的操作产生的事件信息,对应配置表中的配置项我们可以称为监控采集配置项。
  2. consumers: 消费者,对应的消费者表用于存储来自instruments采集的数据,对应配置表中的配置项我们可以称为消费存储配置项。

2.4 performance_schema表分类

performance_schema库下的表可以按照监视不同的维度进行分组
语句事件记录表,这些表记录了语句事件信息。

  • 当前语句事件表 events_statements_current
  • 历史事件语句 event_statements_history
  • 长语句历史事件表 event_statements_history_long
  • 聚合后的摘要表 summary,可以根据帐号account、主机host、程序program、线程thread、用户user和全局global再进行细分
    –等待事件记录表,与语句事件类型的相关记录表类似:
    show tables like ‘%wait%’;

–阶段事件记录表,记录语句执行的阶段事件的表
show tables like ‘%stage%’;

–事务事件记录表,记录事务相关的事件的表
show tables like ‘%transaction%’;

–监控文件系统层调用的表
show tables like ‘%file%’;

–监视内存使用的表
show tables like ‘%memory%’;

–动态对performance_schema进行配置的配置表
show tables like ‘%setup%’;

2.4 performance_schema 简单配置和使用

数据库刚刚初始化并启动时,并非所有的instruments(事件采集项,在采集项的配置表中每一项都有一个开关,YES 或 NO)和consumers(消费者,和事件采集项类似,也有一张表;YES就表示对应的表保存性能数据
,为NO表示对应的表不保存性能数据)都启用了,所以默认不会收集所有的事件,可能需要检测的事件并没有打开,需要进行设置,可以使用如下语句打开对应的instrument和consumers

2.5 performance_schema 实践

--1、哪类的SQL执行最多?
SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--2、哪类SQL的平均响应时间最多?
SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--3、哪类SQL排序记录数最多?
SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--4、哪类SQL扫描记录数最多?
SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--5、哪类SQL使用临时表最多?
SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--6、哪类SQL返回结果集最多?
SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--7、哪个表物理IO最多?
SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC
--8、哪个表逻辑IO最多?
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC
--9、哪个索引访问最多?
SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC
--10、哪个索引从来没有用过?
SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> 'mysql' ORDER BY OBJECT_SCHEMA,OBJECT_NAME;
--11、哪个等待事件消耗时间最多?
SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC
-- TIMER_START, TIMER_END, TIMER_WAIT 事件的时间信息。这些值的单位是皮秒(万亿分之一秒)
--12 开启记录
UPDATE setup_consumers SET ENABLED = 'YES' where name = 'events_statements_history_long';
--12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息
SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%tickets%';
--12-2、查看每个阶段的时间消耗
SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1663;
--12-3、查看每个阶段的锁等待情况
SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_long WHERE nesting_event_id = 1663;
--13
-- 查看耗时超过5秒的sql
SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT        
FROM performance_schema.events_statements_history_long 
WHERE timer_wait > 5000000000000;

-- 备注 ,如果发现上表是空,记得开启生产和消费 日志
update performance_schema.setup_instruments set ENABLED = 'YES', TIMED = 'YES' where name like '%statement/%';
update performance_schema.setup_instruments set ENABLED = 'YES', TIMED = 'YES' where name like '%stage/%';

update performance_schema.setup_consumers set ENABLED = 'YES' where name like '%events_statements_%';
update performance_schema.setup_consumers set ENABLED = 'YES' where name like '%events_stages_%';

3. show processlist查看链接线程

| 观察是否有大量线程处于不正常的状态

你可能感兴趣的:(MySQL调优,mysql,服务器,数据库)