Skip to content

statement event tables

xiaoboluo768 edited this page Jun 8, 2020 · 2 revisions
  • 语句事件的instruments用于记录语句类别的事件信息。 语句事件是处于较高级别的层次结构, 在事件层次结构中,等待事件嵌套在阶段事件中、阶段事件嵌套在语句事件中、语句事件嵌套在事务事件中(事务事件也可能嵌套在语句事件中)

  • 语句事件存储表如下:

    • events_statements_current:当前语句事件存储表
    • events_statements_history:每个线程最新的语句事件存储表
    • events_statements_history_long:全局最新的语句事件存储表(跨所有线程)
    • prepared_statements_instances:prepare语句实例和统计信息表(可能对于一些程序语言的数据库driver中,经常需要使用到prepare函数,这些prepare函数产生的prepare语句较多,实际上是基于binlary 协议调用mysql c api接口中的mysql_stmt_prepare()函数,另外还有基于文本协议的prepare语句)
  • 语句事件相关配置中,setup_instruments表中statement/*开头的所有instruments配置默认开启,setup_consumers表中statements相关的consumers配置默认开启了events_statements_current、events_statements_history、statements_digest(对应events_statements_summary_by_digest表,详见后续章节)但没有开启events_statements_history_long,setup_timers表中默认配置的计时器单位为MICROSECOND

  • 关于语句监控的一些说明:

    • 语句监控时间范围是server从发现某线程上有请求开始到线程上所有请求停止。通常,server从客户端获取到第一个数据包到server且server完成响应包的发送时间开始监控,另外,存储程序中的语句在监控时与其他不在存储程序中的语句监控方式一样
    • 当performance_schema采集一个请求(server command或SQL语句)时,刚开始的时候会使用一个通用的(抽象的)instruments来对其进行事件信息采集(因为此时并不知道一些具体的信息,无法判定是哪个具体的server command或SQL语句类型),然后通过后续的语句阶段执行过程当中逐步解析并判断出请求的一些具体信息,并根据解析出的信息逐步变更instruments为一个更具体的instruments,直到达到最终的instruments,而最终的instruments名称对应着server的command和sql语句的类型:
      • server command对应于mysql_com.h头文件中定义的COM_xxx代码,并在sql/sql_parse.cc中进行处理。例如:COM_PING和COM_QUIT。这两个comman对应着statement/com*开头的instruments名称 (如:statement/com/Ping和statement/com/Quit)
      • SQL语句是文本,例如:DELETE FROM t1或SELECT * FROM t2。对于SQL语句的instrument ,对应着statement/sql*开头的instruments名称(如: statement/sql/delete和statement/sql/select)
      • 除此之外,还有一些用于特定错误处理的instruments,例如:statement/com/Error,可以用于检测server不能解析的客户端command。进而可用于识别出客户端与server端版本是否不匹配或者客户端是否正在尝试对server端进行攻击,另外,statement/sql/error 可用于监控解析失败的sql。进而可以用于检测客户端向服务端发送的错误格式的查询,注意:无法解析的查询与执行失败的查询不同。例如,'SELECT * FROM' 是一个错误格式的查询,会使用statement/sql/error 这个instrument监控且执行时报语法错误(ERROR 1064 (42000): You have an error in your SQL syntax; ......)。但是,类似 SELECT * 的查询语句解析成功,但是执行失败(报错:No tables used ),会使用statement/sql/select 这个instruments监控且报执行时报具体错误信息(ERROR 1096 (HY000): No tables used)
  • 语句请求的来源包含以下几个方面(对于不同来源的语句请求,从最开始不知道具体详细信息时使用的抽象instruments到最后具体的instruments可能有所不同):

    • 来自客户机的command或语句请求,它将请求以数据包的形式发送给server
      • 当server在套接字级别检测到一个新的数据包时,一个新的语句开始执行时,将使用一个名为statement/abstract/new_packet的抽象的instruments来监控
      • 当server读取数据包编号时,它可以解析出一个请求的类型,并且performance_schema会优化instruments名称。例如:如果请求是COM_PING类型数据包,则instruments名称将变为statement/com/ping,如果请求是一个COM_QUERY数据包,这个时候就可以知道这是一个SQL语句的数据包(但此时还不能识别出具体的SQL语句类型),此时instruments将更改为更具体但仍是一个抽象的instruments名称statement/abstract/Query,但此时请求需要进一步分类
      • 如果请求被解析出是一个语句类型的数据包,则可以解析出语句文本。解析后,就可以知道确切的语句类型。例如:解析出的语句类型是INSERT语句,则performance_schema会将statement/abstract/Query更改为更具体的名为statement/sql/insert 的instruments,这就是最终的对应该语句的instruments名称。
    • 来自复制架构中从库的中继日志读取出来的语句字符串
      • 中继日志中的语句以文本形式存储,读取时也同样是文本读取。不使用网络协议,所以在语句刚开始执行时不使用statement/abstract/new_packet 这个抽象instruments,使用statement/abstract/relay_log抽象instruments代替,进而使用更具体的statement/abstract/Query instruments代替
      • 当语句被解析时,由于本身是语句文本,不需要像套接字连接那样还需要有一次网络协议解析,直接就解析出了语句类型,例如:解析出的语句类型是INSERT语句,则performance_schema将statement/abstract/Query更改为更具体的名为statement/sql/insert的instruments,这就是最终的对应该语句的instruments名称。
      • 注意:对于从中继日志中获取的语句,前面的描述仅适用于基于语句的复制。但是对于基于行的复制,在处理行更改时在从库可以使用表I/O相关的instruments进行检测,但是中继日志中的行事件不会被作为独立的语句事件进行检测和记录
    • 来自Event Scheduler中的语句
      • 这些事件执行使用名为statement/scheduler/event的instruments进行检测。这就是最终的instruments名称
      • 在调度事件主体中执行的语句使用statement/sql/*开头的instruments进行检测,而不使用抽象的instruments,因为调度事件是存储程序,存储程序在执行前被预先编译到内存中。所以在运行时没有解析步骤,其中的每个语句的类型在执行时都是已知的
      • 在调度事件主体中执行的语句被作为调度事件的子语句。例如:使用调度事件执行一个INSERT语句,则调度事件本身是父语句,使用statement/scheduler/event进行检测,而其中的INSERT语句是子语句,使用statement/sql/insert进行检测。父/子语句使用单独的instruments进行监控。这与从抽象到具体的instrument转换方式不同
  • 对于语句统计信息的收集,仅使用各个语句类型的对应的statement/sql/* instruments是不够的。 抽象的statement/abstract/* instruments也必须启用。默认情况下启用了所有statement instrument,但是不排除有时候有根据需要关闭一些instruments的场景。例如:要收集INSERT语句的统计信息,必须启用instruments statement/sql/insert,同时也需要启用instruments statement/abstract/new_packet和statement/abstract/Query。同样,对于复制语句的检测,必须启用instruments statement/abstract/relay_log

  • 对于统计信息,只汇总具有最终(具体名称而不是抽象名称)instruments的语句,对于statement/abstract/Query之类的abstract instruments,不汇总任何统计信息,因为没有任何语句被分类为abstract instruments 作为最终语句名称

  • 参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-statement-tables.html


上一篇: events_stages_history_long表 | 下一篇: events_statements_current表

Clone this wiki locally