7月20日: 8.20.1.jpg 7月24日: 8.20.2.jpg 在对问题时间段等待事件进行查看,该时间段内出现大量的”buffer busy waits”等待事件,等待的会话并无blocking 7月24日 8.20.6.jpg 通过上面的信息在表象中看到是由于系统中大量并发INSERT语句同时向98866对象插入数据,而引起的会话数突增,且会话均等待”buffer busy waits”。 而又同时向相同的对象中插入数据产生的”buffer busy waits”?还是由于”buffer busy waits”而引起的大量会话出现阻塞? 先看何为”buffer busy waits”,“buffer busy waits”等待事件的发生情况为当会话以独占模式持有buffer pin锁时,其他会话以非兼容模式申请buffer pin锁,此时申请 buffer pin锁的会话产生的等待事件为buffer busy waits。
客户一套Oracle 19c Dataguard的数据库环境,Standby端总是会间隔性出现较大GAP,同时DB alert log日志出现LGWR (ospid: 105521) waits for 2021_07_12/thread_2_seq_14361.1072.1077669019 2021-07-12T20:29:38.183656+08:00 LGWR (ospid: 105521) waits 'DLM cross inst call completion' for 1 secs. 2021-07-12T20:29:48.137737+08:00 LGWR (ospid: 105521) waits in an acceptable location (inwait 0x1.ffff). 2021-07-12T20:33:21.196764+08:00 LGWR (ospid: 105521) waits 'DLM cross inst call completion' for 2 secs. 2021-07-12T20:33:31.310737+08:00 LGWR (ospid: 105521) waits
High Waits on 'Db File Sequential Read' Due to Table Lookup Following Index Access (文档 ID 875472.1) 即使执行计划已经是最优的了
IS NOT NULL THEN total_waits_fg - NVL(prev_total_waits_fg, 0) ELSE (total_waits - NVL (prev_total_waits, 0)) - GREATEST(0, (NVL(bg_total_waits, 0) - NVL(prev_bg_total_waits, 0))) prev_total_waits, b.total_waits_fg AS prev_total_waits_fg, b.time_waited_micro , bg_prev.total_waits AS prev_bg_total_waits, bg_prev.time_waited_micro , NULL AS total_waits, NULL AS total_waits_fg,
events_waits_history_long events_waits_summary_by_account_by_event_name events_waits_summary_by_host_by_event_name events_waits_summary_by_instance events_waits_summary_by_thread_by_event_name events_waits_summary_by_user_by_event_name events_waits_summary_global_by_event_name table_io_waits_summary_by_index_usage table_io_waits_summary_by_table 等待事件需要执行结束时才被添加到events_waits_history表中(未结束时保存在events_waits_current表)。 = 'events_waits_history_long'; 查询示例 select * from events_waits_history_long ; 输出 3.6 events_waits_summary_by_account_by_event_name
---- 这部分指的是占用数据库时间靠前的一些事件,主要是等待事件 Event 代表事件的名称 Waits代表 该事件等待的次数,CPU Time不适用 Time(s)代表该事件等待的总时间,单位为秒 Avg Wait(ms) 代表平均等待时间(Time(s)/Waits),单位为毫秒 % Total Call Time 代表该事件占整个Call Time的比例,该栏位从10g开始提供 Wait Class 代表等待事件的类型,该栏位从10g开始提供 ---- 常见的Wait Class 如下 Administrative 由于DBA命令导致的等待(如 重建索引) Waits resulting from resulting from user application code (for example, lock waits caused by row level locking or explicit lock commands) ---- Cluster 和RAC 资源相关的等待(如gc cr block busy) Waits related to Real Application Cluster
,x$waits_by_host_by_latency 按照主机和事件名称分组的等待事件统计信息,默认情况下按照主机名和总的等待事件延迟时间降序排序,数据来源:events_waits_summary_by_host_by_event_name ,x$waits_by_user_by_latency 按照用户和事件名称分组的等待事件统计信息,默认情况下按照用户名和总的等待事件延迟事件降序排序,数据来源:events_waits_summary_by_user_by_event_name ,x$waits_by_host_by_latency 视图字段含义相同,不同的是waits_by_user_by_latency,x$waits_by_user_by_latency视图是按照用户名和事件名称分组 05.waits_global_by_latency,x$waits_global_by_latency 按照事件名称分组的等待事件统计信息,默认按照等待事件总延迟时间降序排序。 ,x$waits_by_host_by_latency 视图字段含义相同,不同的是waits_global_by_latency,x$waits_global_by_latency视图只按照事件名称分组
| | events_waits_summary_by_user_by_event_name | | events_waits_summary_global_by_event_name | | table_io_waits_summary_by_table | | table_lock_waits_summary_by_table 等待事件表(资源等待) events_waits_current - 当前等待事件 events_waits_history - 历史等待事件 events_waits_history_long - 长期等待事件 events_waits_summary_global_by_event_name - 等待事件全局统计 events_waits_summary_by_instance - 按实例的等待统计 events_waits_summary_by_account_by_event_name - 按账号的等待统计 events_waits_summary_by_user_by_event_name - 按用户的等待统计 events_waits_summary_by_host_by_event_name
数据来源:events_waits_summary_global_by_event_name 该视图会忽略空闲等待事件(idle事件)信息 下面我们看看使用该视图查询返回的结果。 数据来源:events_waits_summary_global_by_event_name 下面我们看看使用该视图查询返回的结果。 ,x$waits_by_host_by_latency 按照主机和事件名称分组的等待事件统计信息,默认情况下按照主机名和总的等待事件延迟时间降序排序,数据来源:events_waits_summary_by_host_by_event_name ,x$waits_by_user_by_latency 按照用户和事件名称分组的等待事件统计信息,默认情况下按照用户名和总的等待事件延迟事件降序排序,数据来源:events_waits_summary_by_user_by_event_name 05 waits_global_by_latency,x$waits_global_by_latency 按照事件名称分组的等待事件统计信息,默认按照等待事件总延迟时间降序排序。
) Application Waits resulting from user application code (for example, lock waits caused by row level Scheduler Resource Manager related waits (for example, 'resmgr: become active') System I/O Waits for for buffer busy waits. should be the biggest waits after the idle waits. should be the biggest waits after the idle waits.
performance_schema.data_locks; # 锁等待的对应关系 Mysql8.0 之前使用:select * from information_schema.innodb_lock_waits ; Mysql8.0 使用:select * from performance_schema.data_lock_waits; 锁等待的对应关系 # Mysql8.0 之前使用: select * from information_schema.innodb_lock_waits; # Mysql8.0 使用: select * from performance_schema.data_lock_waits ; 查看锁的情况 附有字段说明 show status like 'innodb_row_lock_%'; -- Innodb_row_lock_current_waits : 当前等待锁的数量 -- 锁定的总时间长度 -- Innodb_row_lock_time_avg : 每次平均锁定的时间 -- Innodb_row_lock_time_max : 最长一次锁定时间 -- Innodb_row_lock_waits
| | waits_by_user_by_latency | | waits_global_by_latency | | x$waits_by_user_by_latency | | x$waits_global_by_latency schema_tables_with_full_table_scans - 识别频繁全表扫描的表 schema_unused_indexes - 识别从未使用过的索引 schema_table_lock_waits - 全局等待事件统计 waits_by_host_by_latency - 按主机分组的等待事件统计 waits_by_user_by_latency - 按用户分组的等待事件统计 注:用于分析数据库资源等待情况 查看内存使用情况 SELECT * FROM memory_global_by_current_bytes LIMIT 10; -- 查看锁等待 SELECT * FROM innodb_lock_waits
385606RW-excl spins 0, rounds 1265658, OS waits 41898RW-sx spins 67610, rounds 2015448, OS waits 66228Spin 592941RW-excl spins 50582, rounds 1502625, OS waits 56124RW-sx spins 12583, rounds 360973, OS waits OS-waits/spins = 592/338 = 1.75表明大部分被分流进入了OS-wait(PAUSE的延迟不够)。 Use Case 2RW-shared spins 35943, rounds 777178, OS waits 19051RW-excl spins 4269, rounds 121796, OS waits Use Case 3RW-shared spins 39578, rounds 424553, OS waits 7329RW-excl spins 5828, rounds 78225, OS waits
> select sql_kill_blocking_connection from sys.innodb_lock_waits ; +------------------------------+ 二、sys.innodb_lock_waits的来源 实际上sys.innodb_lock_waits是一个视图,5.7.29来源为如下: SELECT r.trx_wait_started AS wait_started 在8中叫做performance_schema.data_lock_waits,其基本信息和5.7没有太大差别。 这里我们需要注意了,既然如此那么我们可以发现information_schema.innodb_lock_waits的blocking_trx_id中出现次数最多的事务ID很可能就是堵塞的源头,而sys.innodb_lock_waits 中的信息正是完全来自information_schema.innodb_lock_waits和其他两个表的join,同样也是6行如下: ?
Variable_name | Value | +-------------------------------+--------+ | Innodb_row_lock_current_waits Innodb_row_lock_time_avg | 27852 | | Innodb_row_lock_time_max | 51017 | | Innodb_row_lock_waits | +-------------------------------+--------+ 5 rows in set mysql> 变量说明: Innodb_row_lock_current_waits 系统启动后到现在总共等待的次数 重点关注 : Innodb_row_lock_time_avg 、Innodb_row_lock_waits 、Innodb_row_lock_time ---- MySQL select * from information_schema.INNODB_LOCKS; -- 查看锁等待 select * from information_schema.INNODB_LOCK_WAITS
开始 | events_waits_summary_by_account_by_event_name | events_waits_summary_by_host_by_event_name | events_waits_summary_by_instance | events_waits_summary_by_thread_by_event_name | events_waits_summary_by_user_by_event_name | events_waits_summary_global_by_event_name 上面的6张表 events_wait_summary_global_by_event_name select * from events_waits_summary_global_by_event_name 例如那些索引可能建立后从来没有使用 select object_name, index_name from performance_schema.table_io_waits_summary_by_index_usage
~~~~~~~~~~ wait Call Event Waits desc (idle events last) %Time Total Wait wait Waits Event Waits -outs Time (s) (ms) /txn ------------------- 2,409 99.5 120 50 0.1 buffer busy waits Event Waits -outs Time (s) (ms) /txn -------------------
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_long
by Direct Physical Writes、Segments by Table Scans、Segments by DB Blocks Changes、Segments by Row Lock Waits 、Segments by ITL Waits、Segments by Buffer Busy Waits。 Segments by Row Lock Waits重点关注那些索引导致了行锁等待。 Segments by Row Lock Waits Segments by Buffer Busy Waits,buffer busy,还不如说是热块争用,该表显然是热点表,更大的可能是全表扫描。
sys.schema_table_lock_waits 是 MySQL 5.7 引入的,用来定位 DDL 被阻塞的问题。 针对上面这个情况。 可以查看 sys.schema_table_lock_waits 的输出。 mysql> select * from sys.schema_table_lock_waits\G *************************** 1. row *************** 的注意事项 sys.schema_table_lock_waits 视图依赖了一张 MDL 相关的表 performance_schema.metadata_locks。 定位导致 DDL 被阻塞的会话,常用的方法如下:sys.schema_table_lock_waits select sql_kill_blocking_connection from sys.schema_table_lock_waits