MySQL 性能模式 performance_schema

文章目录

    • 前言
    • 1. 性能模式特点
    • 2. 开启性能模式
    • 3. 性能模式表分类
      • 3.1 采集设置表
      • 3.2 实例信息表
      • 3.3 等待事件记录表
      • 3.4 阶段性事件记录表
      • 3.5 语句事件记录表
    • 后记

前言

performance_schema 是 MySQL 提供的一个较为底层的监控,它可以监控数据库中每个线程的所有动作,这些动作被称为事件,可以是一个函数调用,也可以是一条 SQL 执行过程。总体来讲 performance_schema 是一个相对专业的模块。

1. 性能模式特点

本小节,介绍 performance_schema 的特点,具体如下:

  • 能够实时对 MySQL 内部线程进行监控,并提供了一个数据库 performance_schema 用于存储数据和配置采集和数据消费。
  • performance_schema 中的变化更改是不会写入到 Binlog 中的,所以不会通过复制机制被复制到其他 Server 中。
  • performance_schema 中的数据不会持久化到磁盘中,而且存储在内存里面,用户可以使用 SELECT 语句查询,重启数据库服务后,数据也会被丢弃,将在数据库启动后重新采集。
  • 可以通过 SQL 语句对 performance_schema 采集进行动态配置,修改后会立即生效。
  • mysqldump 逻辑备份工具会忽略 performance_schema 库的备份。
  • MySQL 团队在仅可能减少 performance_schema 对数据库性能的损耗,存储引擎基于 MySQL Server 源代码中的 instrumentation points 收集事件数据。开启 performance_schema 不会影响线程调度,也不会导致查询执行计划发生变化,开销很小。
  • performance_schema 库中的表,大部分都有索引,可以避免全表扫描查询表中的数据,从而降低查询开销。

2. 开启性能模式

performance_schema 默认是开启的,不过在一些云数据库 RDS 上面,大部分是没有开启。

[mysqld]
performance_schema=ON

Tips:需要注意的是 performance_schema 属于只读参数,需要在配置文件中修改,重启数据库才能生效。

数据库启动后,使用下方语句查看是否生效:

show variables like 'performance_schema';

3. 性能模式表分类

本篇文章是基于 MySQL 8.2.0 版本编写的,performance_schema 库下共有 115 张表,本小节会先探讨这些表的分类。

3.1 采集设置表

动态配置 performance_schema 采集和消费数据策略的配置表,用户可按需对其采集进行配置。

show tables like '%setup%';
  • setup_instruments:该表可以配置事件监测对象的类别,用于开启或关闭事件采集。

  • setup_consumers:该表用于配置采集到的数据是否存储,开启对应的功能,将作为消费者将采集到的数据存储到对应的监控表中。

  • setup_actors:该表可以配置特定用户的监控信息采集。

  • setup_objects:该表可以配置特定对象的监控信息采集,默认是开启除元数据库以为所有对象数据采集。

  • setup_threads:该表可以控制线程粒度的采集配置,默认是全部都开启采集,一张相对来说比较专业的表。

setup_instruments 和 setup_consumers 需要用户按需配置,可以理解为 setup_instruments 开启监控生产数据,setup_consumers 是用来配置消费数据(指消费存储到监控表中)所以要查到监控数据,两张表都需要配置。另外几张表,默认都是全部开启采集,所以一般情况是不需要配置调整的。

ps:setup_meters 表是干啥的…

3.2 实例信息表

实例表记录了检测的对象类型。它们提供事件名称和解释性注释或状态信息,这些表专业性很强,不需要用户修改调整,属于只读表。

  • cond_instances:列出了服务器执行时性能模式看到的所有条件,字段包含采集采集仪器名称,和内存中的地址信息。
  • file_instances:列出了 performance_schema 监测 I/O 的所有文件,如果文件从未打开过那么在该表中不会记录,如果文件被删除,对应该表中的记录也会删除。
  • mutex_instances:列出了 performance_schema 监控的互斥对象的实例信息。
  • rwlock_instances:列出了 performance_schema 监控所有锁对象的实例信息。
  • socket_instances:列出了 MySQL 提供服务活动连接的实时快照信息。

3.3 等待事件记录表

等待事件表,存储了 performance_schema 采集到的等待事件的结果。

events_waits_current
events_waits_history
events_waits_history_long

配置采集在 setup_instruments 表 NAME 字段,以 wait 开头的采集项,例如:

mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'wait/io/file/innodb%';
+-------------------------------------------------+---------+-------+
| NAME                                            | ENABLED | TIMED |
+-------------------------------------------------+---------+-------+
| wait/io/file/innodb/innodb_tablespace_open_file | YES     | YES   |
| wait/io/file/innodb/innodb_data_file            | YES     | YES   |
| wait/io/file/innodb/innodb_log_file             | YES     | YES   |
| wait/io/file/innodb/innodb_temp_file            | YES     | YES   |
| wait/io/file/innodb/innodb_arch_file            | YES     | YES   |
| wait/io/file/innodb/innodb_clone_file           | YES     | YES   |
+-------------------------------------------------+---------+-------+
mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'wait/io/socket/%';
+----------------------------------------+---------+-------+
| NAME                                   | ENABLED | TIMED |
+----------------------------------------+---------+-------+
| wait/io/socket/sql/server_tcpip_socket | NO      | NO    |
| wait/io/socket/sql/server_unix_socket  | NO      | NO    |
| wait/io/socket/sql/client_connection   | NO      | NO    |
+----------------------------------------+---------+-------+

配置完成等待事件的采集后,也需要在 setup_consumers 表中配置消费到记录表中,默认没有开启消费。

SELECT * FROM performance_schema.setup_consumers WHERE NAME LIKE 'events_waits%';

开启所有等待事件的采集 SQL 语句如下。

-- 开启采集
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'wait/%';

-- 开启消费
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE 'events_waits%';

上面,介绍了如何开启等待事件的配置,接下来将介绍等待事件记录表。

  • events_waits_current:表包含当前等待事件。该表为每个线程存储一行,显示该线程最近监视的等待事件的当前状态信息。下面是一个行锁堵塞在该表中的记录。
                THREAD_ID: 220284
                 EVENT_ID: 20
             END_EVENT_ID: NULL
               EVENT_NAME: wait/io/table/sql/handler
                   SOURCE: handler.cc:3264
              TIMER_START: 91763343317412988
                TIMER_END: 91779644929472748
               TIMER_WAIT: 16301612059760
                    SPINS: NULL
            OBJECT_SCHEMA: test
              OBJECT_NAME: full_backup_metadata
               INDEX_NAME: PRIMARY
              OBJECT_TYPE: TABLE
    OBJECT_INSTANCE_BEGIN: 139775823422320
         NESTING_EVENT_ID: 17
       NESTING_EVENT_TYPE: STATEMENT
                OPERATION: fetch
          NUMBER_OF_BYTES: 244
                    FLAGS: NULL
    
  • events_waits_history:包含每个线程最近结束的 N 个等待事件。为每个线程存储多少个历史事件可以由系统自动分配,当然用户也可以通过 performance_schema_events_waits_history_size 参数,配置为每个线程保留等待事件的个数。事件没有结束不会记录到该表。
  • events_waits_history_long:相比于 events_waits_history 表,该表存储了更完整的历史等待记录信息,存储的上限由参数 performance_schema_events_waits_history_long_size 控制。

由此我们可以了解到,消费存储类型的表,都有三张,current 结尾存储的是当前,history 结尾存储的是最近,history_long 结尾的存储的是历史数据。分别由不同的参数来设置。

例如 events_waits_history 表,设置为为每个线程保留 10 条记录,events_waits_history_long 被设置为最大存储 10000 行记录。此时有两个线程 A 和 B,A 每秒发生 1 次等待事件,B 每秒发生 10 次等待事件,经过 5 秒后,A 线程有 5 次等待事件,B 线程有 500 次等待事件,那 events_waits_history 表存储了多少行记录?答案是 15 条记录,events_waits_history_long 由于存储上限是 10000 行,5 秒内共产生了 505 次等待事件,没有超出上限,所以有 505 条记录。

推荐阅读: Performance Schema Tables for Current and Historical Events

3.4 阶段性事件记录表

阶段性事件记录表,会记录语句执行的一些阶段性信息,比较典型的应用案例,就是监控 DDL 变更的进度,稍后会为大家演示。

events_stages_current
events_stages_history
events_stages_history_long

配置采集在 setup_instruments 表 NAME 字段,以 stage 开头的采集项,例如:

mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME RLIKE 'stage/sql/[a-c]';
+----------------------------------------------------+---------+-------+
| NAME                                               | ENABLED | TIMED |
+----------------------------------------------------+---------+-------+
| stage/sql/After create                             | NO      | NO    |
| stage/sql/allocating local table                   | NO      | NO    |
| stage/sql/altering table                           | NO      | NO    |
| stage/sql/committing alter table to storage engine | NO      | NO    |
| stage/sql/Changing master                          | NO      | NO    |
| stage/sql/Checking master version                  | NO      | NO    |
| stage/sql/checking permissions                     | NO      | NO    |
| stage/sql/cleaning up                              | NO      | NO    |
| stage/sql/closing tables                           | NO      | NO    |
| stage/sql/Connecting to master                     | NO      | NO    |
| stage/sql/converting HEAP to MyISAM                | NO      | NO    |
| stage/sql/Copying to group table                   | NO      | NO    |
| stage/sql/Copying to tmp table                     | NO      | NO    |
| stage/sql/copy to tmp table                        | NO      | NO    |
| stage/sql/Creating sort index                      | NO      | NO    |
| stage/sql/creating table                           | NO      | NO    |
| stage/sql/Creating tmp table                       | NO      | NO    |
+----------------------------------------------------+---------+-------+

配置完成等待事件的采集后,也需要在 setup_consumers 表中配置消费到记录表中,默认没有开启消费。

SELECT * FROM performance_schema.setup_consumers WHERE NAME LIKE 'events_stages%';

开启所有阶段事件的采集 SQL 语句如下。

-- 开启采集
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_stages%';

3.3 小节 等待事件记录中,介绍了三类表的区别,所以下面就只介绍表的使用场景和案例。下面介绍一个监控 DDL 执行案例。开启阶段性事件采集后,执行一个 DDL 语句。

ALTER TABLE sbtest1 ADD COLUMN middle_name varchar(200);

通过下方 SQL 不断刷新查看 DDL 执行进度。

select stmt.SQL_TEXT as sql_text,
       concat(WORK_COMPLETED, '/', WORK_ESTIMATED) as progress,
       (stage.TIMER_END - stmt.TIMER_START) / 1e12 as current_seconds,
       (stage.TIMER_END - stmt.TIMER_START) / 1e12 * (WORK_ESTIMATED - WORK_COMPLETED) /
       WORK_COMPLETED as remaining_seconds
from performance_schema.events_stages_current stage,
     performance_schema.events_statements_current stmt
where stage.THREAD_ID = stmt.THREAD_ID
  and stage.NESTING_EVENT_ID = stmt.EVENT_ID;
sql_textprogresscurrent_secondsremaining_seconds
ALTER TABLE sbtest1 drop COLUMN middle_name68182/6164412.56920781620.659284092463466
sql_textprogresscurrent_secondsremaining_seconds
ALTER TABLE sbtest1 drop COLUMN middle_name421800/61644123.38674598110.791891001630681

3.5 语句事件记录表

语句事件记录表,用于存储 performance_schema 表采集语句的执行信息,通过它可以查看数据库最近执行的 SQL 语句。

events_statements_current
events_statements_history
events_statements_history_long

配置采集在 setup_instruments 表 NAME 字段,以 statement 开头的采集项,例如:

mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'statement/%';
+---------------------------------------------+---------+-------+
| NAME                                        | ENABLED | TIMED |
+---------------------------------------------+---------+-------+
| statement/sql/select                        | YES     | YES   |
| statement/sql/create_table                  | YES     | YES   |
| statement/sql/create_index                  | YES     | YES   |
...
| statement/sp/stmt                           | YES     | YES   |
| statement/sp/set                            | YES     | YES   |
| statement/sp/set_trigger_field              | YES     | YES   |
| statement/scheduler/event                   | YES     | YES   |
| statement/com/Sleep                         | YES     | YES   |
| statement/com/Quit                          | YES     | YES   |
| statement/com/Init DB                       | YES     | YES   |
...
| statement/abstract/Query                    | YES     | YES   |
| statement/abstract/new_packet               | YES     | YES   |
| statement/abstract/relay_log                | YES     | YES   |
+---------------------------------------------+---------+-------+

配置完成等待事件的采集后,也需要在 setup_consumers 表中配置消费到记录表中。

SELECT * FROM performance_schema.setup_consumers WHERE NAME LIKE '%statements%';

开启语句事件采集,可使用下方 SQL。

UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'statement/%';

UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%statements%';

events_statements_current:记录当前线程执行的语句情况。

*************************** 1. row ***************************
              THREAD_ID: 378275 -- 线程 ID 对应的是 ps_current_thread_id()
               EVENT_ID: 284 -- 事件 ID
           END_EVENT_ID: NULL
             EVENT_NAME: statement/sql/select -- 采集工具名称
                 SOURCE: init_net_server_extension.cc:102 -- 检查工具源代码行号
            TIMER_START: 175715762085348000 -- 事件开始时间
              TIMER_END: 175715762727984000 -- 事件结束时间
             TIMER_WAIT: 642636000 -- 事件的持续时间
              LOCK_TIME: 4000000 -- 锁等待时间
               SQL_TEXT: select * from events_statements_current -- SQL 语句
                 DIGEST: d2cb1ecf648cf0ec173e79a74aa085d330c1cabcabbbd5785623ab5f69b0a811 -- SQL Hash 值
            DIGEST_TEXT: SELECT * FROM `events_statements_current` -- SQL 模版
         CURRENT_SCHEMA: performance_schema -- 库名
            OBJECT_TYPE: NULL
          OBJECT_SCHEMA: NULL
            OBJECT_NAME: NULL
  OBJECT_INSTANCE_BEGIN: NULL
            MYSQL_ERRNO: 0
      RETURNED_SQLSTATE: NULL
           MESSAGE_TEXT: NULL
                 ERRORS: 0 -- 异常
               WARNINGS: 0 -- 警告
          ROWS_AFFECTED: 0 -- 受影响行数
              ROWS_SENT: 0 -- SQL 返回行数
          ROWS_EXAMINED: 0 -- SQL 服务器层检查的行数
CREATED_TMP_DISK_TABLES: 0
     CREATED_TMP_TABLES: 0
       SELECT_FULL_JOIN: 0
 SELECT_FULL_RANGE_JOIN: 0
           SELECT_RANGE: 0
     SELECT_RANGE_CHECK: 0
            SELECT_SCAN: 1
      SORT_MERGE_PASSES: 0
             SORT_RANGE: 0
              SORT_ROWS: 0
              SORT_SCAN: 0
          NO_INDEX_USED: 1 -- 语句是否使用索引
     NO_GOOD_INDEX_USED: 0 -- 是否有更好的索引
       NESTING_EVENT_ID: NULL
     NESTING_EVENT_TYPE: NULL
    NESTING_EVENT_LEVEL: 0
           STATEMENT_ID: 3586018
               CPU_TIME: 0 -- CPU 花费的时间
  MAX_CONTROLLED_MEMORY: 0
       MAX_TOTAL_MEMORY: 0
       EXECUTION_ENGINE: PRIMARY

另外,两张表 events_statements_history 和 events_statements_history_long 就不在此多介绍了,存储的是历史记录,字段含义都相同。通过周期采集该表,可以从表中抓取一些消耗性能较大的 SQL 或者执行频次较高的 TOP SQL。

后记

本文介绍了 performance_schema 表分类,配置表和常见的事件记录表,如何配置以及表中字段的含义。performance_schema 采集的数据比较专业,也很丰富,本文只介绍了一些常用的事件表,后续有新场景会继续补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/605426.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简要介绍三大脚本语言 Shell、Python 和 Lua

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序,以提高任务执行的速度和效率。在众多脚本语言中,Shell、Python 和 Lua 是…

Python | Leetcode Python题解之第77题组合

题目: 题解: class Solution:def combine(self, n: int, k: int) -> List[List[int]]:ans []path []def dfs(x):remain k - len(path)if not remain:ans.append(list(path))returnif n 1 - x > remain:dfs(x 1)path.append(x)dfs(x 1)path.…

工业级路由器的穿透力是不是更强(原创科普)

今天我想和大家聊聊工业级路由器的一个重要特性——穿透力。作为一名从事工业网络通信的工程师,我发现很多用户在选择工业级路由器时,都会问到一个问题:"工业级路由器的穿透力是不是更强?"下面就让我来为大家解答这个疑问。当然如果有通信产品需要也可以关注星创易联…

09 - 数据清洗案例

流程图 kettle 面板图片 操作步骤 1、订阅数据源(kafka consumer) 2、抽取字段并转换key(JSON input) 3、判断img字段是否有值,有的话进行url转base64(JavaScript 代码) // 获取输入字段的值 v…

中金:如何把握不断轮动的资产“风口”

从比特币到日股,到黄金与铜再到当前的港股,每次超预期大涨后都透支回调。 今年以来资产的“风口”不断轮动,从比特币到日股,到黄金与铜,再到当前的港股,资产仿佛“接力”般交替领先,同时“风口”…

JavaScript 垃圾回收机制深度解析:内存管理的艺术

🔥 个人主页:空白诗 文章目录 🎭 引言一、JavaScript内存模型与生命周期的深度解析📌 基本数据类型与栈内存的精妙运作📌 复杂数据类型与堆内存的广袤世界📌 生命周期管理的智慧与实践策略📌 We…

uniapp开发小程序使用vue的v-html解析富文本图片过大过宽显示超过屏幕解决办法

如果没有设置的话,就会导致图片溢出,过宽显示或者错位显示,显示效果非常的丑陋: 修改后显示的效果: 网上比较low的解决办法:网上各种解决方法核心思想就是在数据层把数据模板上的img数据加上style样式&…

嵌入式Linux学习第四天启动方式学习

嵌入式Linux学习第四天 今天学习I.MX6U 启动方式详解。I.MX6U有多种启动方式,可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。 启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_M…

windows11获取笔记本电脑电池健康报告

笔记本电脑的电池关系到我们外出时使用的安全,如果电池健康有问题需要及时更换,windows系统提供了检查电池健康度的方法。 1、打开命令行 1)键入 winR 2)键入 cmd 打开命令行。 2、在命令行运行如下指令,生成电池健…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…

TCP三次握手四次挥手 UDP

TCP是面向链接的协议,而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据,三次握手的几个数据包中不包含数据内容。它的应用层,数据部分是空的,只是TCP实现会话建立,点到点的连接 TCP的四次挥手 第四…

介绍 ffmpeg.dll 文件以及ffmpeg.dll丢失怎么办的五种修复方法

ffmpeg.dll 是一个动态链接库文件,属于 FFmpeg运行库。它在计算机上扮演着非常重要的角色,因为它提供了许多应用程序和操作系统所需的功能和组件。当 ffmpeg.dll 文件丢失或损坏时,可能会导致程序无法正常运行,甚至系统崩溃。下面…

基于opencv的车辆统计

车辆统计) 一、项目背景二、整体流程三、常用滤波器的特点四、背景减除五、形态学开运算闭运算 六、项目完整代码七、参考资料 一、项目背景 检测并识别视频中来往车辆的数量 最终效果图: 二、整体流程 加载视频图像预处理(去噪、背景减除…

航空电子FC节点卡, FC交换机,主要采用LC或MPO光纤接口形式

FC节点卡主要采用LC或MPO光纤接口形式,可以作为4/2个独立端口使用,也可以作为2对/1对冗余端口使用,支持1.0625Gbps、2.125Gbps、4.25Gbps、8.5Gbps通信速率。节点卡完全遵循FC-LS,FC-FS,FC-AE-ASM、FC-AE-1553B等FC光纤…

springboot+vue+mybatis家教管理系统的设计与实现+PPT+论文+讲解+售后

家教管理系统是为了方便用户能够在网站上查看教师信息进行家教预约等,于是开发了基于springboot框架设计与实现了一款简洁、轻便的家教管理系统。本系统解决了家教管理事务中的主要问题,包括以下多个功能模块:公告信息、留言信息、预约家教老…

Isaac Sim 4 键盘控制小车前进方向(学习笔记5.8.2)

写的乱糟糟,主要是这两周忘了记录了...吭哧吭哧往下搞,突然想起来要留档,先大致写一个,后面再往里添加和修改吧,再不写就全忘了 有一个一直没解决的问题: 在保存文件时出现问题:isaac sim mism…

【OceanBase诊断调优】—— 磁盘性能问题导致卡合并和磁盘写入拒绝排查

适用版本 OceanBase 数据库 V3.x、V4.x 版本。 问题现象 OceanBase 集群合并一直未完成,同时 tsar 和 iostat 显示从凌晨 2:30 开始磁盘使用率一直是 100%。怀疑合并导致 IO 上升,IO 可能存在问题,observer.log 的确有大量报错 disk is hu…

概述篇——计算机网络学习笔记(基于谢希仁教材与PPT)

教材用的是谢希仁的教材,图片来源于谢希仁老师配套的PPT 计算机网络课程PPT(通过这个链接,你可以找到课程配套的ppt) 计算机网络的定义及其特点 定义 网络 过去大众熟知的三种网络分别是提供电话、电报及传真等服务的电信网络&am…

Linux主机排查工具-GScan

0x01 简介 本程序旨在为安全应急响应人员对Linux主机排查时提供便利,实现主机侧Checklist的自动全面化检测,根据检测结果自动数据聚合,进行黑客攻击路径溯源。 0x02 项目地址 https://github.com/grayddq/GScan 0x03 CheckList检测项 自…

每日一题——力扣面试题 17.04. 消失的数字

题目链接&#xff1a;https://leetcode.cn/problems/missing-number-lcci/description/ 菜鸡做法&#xff1a; #include <stdlib.h> // 包含标准库头文件&#xff0c;用于内存分配等功能// 函数定义&#xff1a;寻找缺失的数字 int missingNumber(int* nums, int numsSi…
最新文章