-
Notifications
You must be signed in to change notification settings - Fork 111
Pre Filtering by objects
- 本小节主要讲解按照数据库对象(例如:事件、存储过程、表、触发器等)纬度进行配置
- setup_objects表控制performance_schema是否启用对某个特定表和存储程序的监控功能,该表中的初始配置信息如下(该表可以使用truncate语句清空,但不建议这么做,里边的配置信息是预设值,你可以根据需要把相应的字段通过update语句来进行修改,注意:对setup_objects表的修改会立即影响对象监控):
admin@localhost : performance_schema 11:36:16> SELECT * FROM setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| EVENT | mysql | % | NO | NO |
| EVENT | performance_schema | % | NO | NO |
| EVENT | information_schema | % | NO | NO |
| EVENT | % | % | YES | YES |
| FUNCTION | mysql | % | NO | NO |
| FUNCTION | performance_schema | % | NO | NO |
| FUNCTION | information_schema | % | NO | NO |
| FUNCTION | % | % | YES | YES |
| PROCEDURE | mysql | % | NO | NO |
| PROCEDURE | performance_schema | % | NO | NO |
| PROCEDURE | information_schema | % | NO | NO |
| PROCEDURE | % | % | YES | YES |
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
| TRIGGER | mysql | % | NO | NO |
| TRIGGER | performance_schema | % | NO | NO |
| TRIGGER | information_schema | % | NO | NO |
| TRIGGER | % | % | YES | YES |
+-------------+--------------------+-------------+---------+-------+
20 rows in set (0.00 sec)
-
下面分别这几个表的字段含义进行解释
- OBJECT_TYPE:表示对象的类型(任务调度器、函数、存储过程、表、触发器其中的一种),例如:TABLE类型会影响表的I/O事件(wait/io/table/sql/handler instrument)和表锁事件(wait/lock/table/sql/handler instrument),注意:如果你使用INSERT语句自行插入配置规则,该字段必须为EVENT,FUNCTION,PROCEDURE,TABLE,TRIGGER几个值,其他值无效
- OBJECT_SCHEMA和OBJECT_NAME:表示需要监视对象的库名和库内的表名,也可以使用“%”来匹配任意的库名或表名,也可以使用具体的库名和表名
- ENABLED:表示是否启用某行配置规则中的instruments,设置为YES时表示启用,注意:如果你使用INSERT语句自行插入配置规则,该字段必须为YES和NO两个值,其他值无效
- TIMED:表示是否启用某行配置规则中的instruments的时间收集功能,设置为YES表示启用,注意:如果你使用INSERT语句自行插入配置规则,该字段必须为YES和NO两个值,其他值无效
-
setup_objects配置表中默认的配置规则是不启用对mysql、INFORMATION_SCHEMA、performance_schema数据库下的对象进行监视的(ENABLED和TIMED列值全都为NO)
-
performance_schema在setup_objects表中进行查询匹配时,如果发现某个OBJECT_TYPE列值有多行,则会尝试着匹配更多的配置行,如下(performance_schema按照如下顺序进行检查):
- OBJECT_SCHEMA ='literal' and OBJECT_NAME ='literal'
- OBJECT_SCHEMA ='literal' and OBJECT_NAME ='%'
- OBJECT_SCHEMA ='%' and OBJECT_NAME ='%'
- 例如,要匹配表对象db1.t1,performance_schema在setup_objects表中先查找“OBJECT_SCHEMA = db1”和“OBJECT_NAME = t1”的匹配项,然后查找“OBJECT_SCHEMA = db1”和“OBJECT_NAME =%”,然后查找“OBJECT_SCHEMA = %”和“OBJECT_NAME = %”。匹配顺序很重要,因为不同的匹配行中的ENABLED和TIMED列可以有不同的值,最终会选择一个最精确的匹配项
-
对于表对象相关事件,instruments是否生效需要看setup_objects与setup_instruments两个表中的配置内容相结合,以确定是否启用instruments以及计时器功能(例如前面说的I/O事件:wait/io/table/sql/handler instrument和表锁事件:wait/lock/table/sql/handler instrument,在setup_instruments配置表中也有明确的配置选项):
- 只有在Setup_instruments和setup_objects中的ENABLED列都为YES时,表的instruments才会生成事件信息
- 只有在Setup_instruments和setup_objects中的TIMED列都为YES时,表的instruments才会启用计时器功能(收集时间信息)
- 例如:要监视db1.t1、db1.t2、db2.%、db3.%这些表,setup_instruments和setup_objects两个表中有如下配置项
# setup_instruments表
admin@localhost : performance_schema 03:06:01> select * from setup_instruments where name like '%/table/%';
+-----------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+-----------------------------+---------+-------+
| wait/io/table/sql/handler | YES | YES |
| wait/lock/table/sql/handler | YES | YES |
+-----------------------------+---------+-------+
2 rows in set (0.00 sec)
# setup_objects表
+-------------+---------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+---------------+-------------+---------+-------+
| TABLE | db1 | t1 | YES | YES |
| TABLE | db1 | t2 | NO | NO |
| TABLE | db2 | % | YES | YES |
| TABLE | db3 | % | NO | NO |
| TABLE | % | % | YES | YES |
+-------------+---------------+-------------+---------+-------+
# 以上两个表中的配置项综合之后,只有db1.t1、db2.%、%.%的表对象的instruments会被启用,db1.t2和db3.%不会启用,因为这两个对象在setup_objects配置表中ENABLED和TIMED字段值为NO
-
对于存储程序对象相关的事件,performance_schema只需要从setup_objects表中读取配置项的ENABLED和TIMED列值。因为存储程序对象在setup_instruments表中没有对应的配置项
-
如果持久性表和临时表名称相同,则在setup_objects表中进行匹配时,针对这两种类型的表的匹配规则都同时生效(不会发生一个表启用监控,另外一个表不启用)
-
关于setup_actors表字段详解详见3.1.4. setup_objects小节
-
参考链接:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-object-filtering.html
上一篇: Pre Filtering by instruments | 下一篇: Pre Filtering by threads
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!