第5章 performance_schema配置详解 - xiaoboluo768/qianjinliangfang GitHub Wiki
5.1 编译时配置
shell> cmake . \
-DDISABLE_PSI_STAGE=1 \ # 关闭STAGE事件监视器
-DDISABLE_PSI_STATEMENT=1 # 关闭STATEMENT事件监视器
# 如果发现以performance_schema开头的选项,则表示当前mysqld支持performance_schema;否则,说明当前数据库版本不支持performance_schema,可能需要升级MySQL版本
shell> mysqld --verbose --help
......
# Support字段值为YES表示当前数据库支持;否则,可能需要升级MySQL版本
mysql> SHOW ENGINES\G
......
9 rows in set (0.00 sec)
5.2.1 启动选项
[root@localhost ~]# mysqld --verbose --help |grep performance-schema |grep -v '\-\-' |sed\
'1d' |sed '/[0-9]\+/d'
......
# [=name]可以指定为具体的instruments名称(但是如果有多个instruments需要指定时,就需要使用该选项多次),还可以使用通配符,可以指定instruments相同的前缀+通配符,也可以使用%代表所有的instruments
## 指定开启单个instruments
--performance-schema-instrument='instrument_name=value'
## 使用通配符指定开启多个instruments
--performance-schema-instrument='wait/synch/cond/%=COUNTED'
## 开关所有的instruments
--performance-schema-instrument='%=ON'
--performance-schema-instrument='%=OFF'
5.2.2 system variables
mysql> show variables like '%performance_schema%';
......
42 rows in set (0.01 sec)
5.3.1 performance_timers表
mysql> SELECT * FROM performance_timers;
......
5.3.2 setup_timers表
mysql> SELECT * FROM setup_timers;
......
5.3.3 setup_consumers表
mysql> SELECT * FROM setup_consumers;
......
# 打开events_waits_current表的当前等待事件记录功能
mysql> UPDATE setup_consumers SET ENABLED ='YES' WHERE NAME ='events_waits_current';
# 关闭历史事件记录功能
mysql> UPDATE setup_consumers SET ENABLED ='NO' where name like '%history%';
# where条件 ENABLED ='YES' 即表示打开对应的记录表功能
......
- 图 5-2
5.3.4 setup_instruments表
mysql> SELECT * FROM setup_instruments;
......
# 第一个instruments表示与MyISAM存储引擎的文件I/O相关
wait/io/file/myisam/log
# 第二个instruments表示与MyISAM存储引擎的磁盘同步相关
wait/synch/cond/myisam/MI_SORT_INFO::cond
# 禁用所有的instruments,修改之后,生效的instruments修改会立即产生影响,即立即关闭收集功能
mysql> UPDATE setup_instruments SET ENABLED = 'NO';
# 禁用所有文件类instruments,使用NAME字段结合like模糊匹配
mysql> UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'wait/io/file/%';
# 仅禁用文件类instruments,启用所有其他instruments,使用NAME字段结合if函数,LIKE模糊匹配到就改为NO,没有匹配到就改为YES
mysql> UPDATE setup_instruments SET ENABLED = IF(NAME LIKE 'wait/io/ file/%', 'NO', 'YES');
# 启用所有类型的events的mysys子系统的instruments
mysql> UPDATE setup_instruments SET ENABLED = CASE WHEN NAME LIKE '%/mysys/%' THEN 'YES' ELSE 'NO' END;
# 禁用指定的instruments
mysql> UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/mysys/ TMPDIR_mutex';
# 切换instruments开关的状态,“翻转”ENABLED字段值,使用ENABLED字段值+if函数IF(ENABLED = 'YES', 'NO', 'YES')表示,如果ENABLED字段值为YES,则修改为NO;反之,修改为YES
mysql> UPDATE setup_instruments SET ENABLED = IF(ENABLED = 'YES', 'NO', 'YES') WHERE NAME = 'wait/synch/mutex/mysys/TMPDIR_mutex';
# 禁用所有instruments的计时器
mysql> UPDATE setup_instruments SET TIMED = 'NO';
mysql> select * from setup_instruments where name like 'wait/io/file/innodb/%';
......
3 rows in set (0.00 sec)
- 图 5-3
5.3.5 setup_actors表
mysql> SELECT * FROM setup_actors;
......
USER ='literal' and HOST ='literal'
USER ='literal' and HOST ='%'
USER ='%' and HOST ='literal'
USER ='%' and HOST ='%'
# 首先使用UPDATE语句禁用默认配置行
Mysql> UPDATE setup_actors SET ENABLED = 'NO', HISTORY = 'NO' WHERE HOST = '%' AND USER = '%';
# 插入用户joe@'localhost'对应的ENABLED和HISTORY字段值都为YES的配置行
Mysql> INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('localhost','joe','%', 'YES','YES');
# 插入用户joe@'hosta.example.com'对应的ENABLED=YES、HISTORY=NO的配置行
Mysql> INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('hosta.example.com', 'joe','%','YES','NO');
# 插入用户sam@'%'对应的ENABLED=NO、HISTORY=YES的配置行
Mysql> INSERT INTO setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUES('%','sam','%','NO', 'YES');
## 此时,在threads表中对应用户的前台线程配置行的INSTRUMENTED和HISTORY字段有效值如下
## 当joe从localhost连接到MySQL Server时,则连接符合第一个INSERT语句插入的配置行,在threads表中对应配置行的INSTRUMENTED和HISTORY字段值变为YES
## 当joe从hosta.example.com连接到MySQL Server时,则连接符合第二个INSERT语句插入的配置行,在threads表中对应配置行的INSTRUMENTED字段值为YES,HISTORY字段值为NO
## 当joe从其他任意主机(%匹配除localhost和hosta.example.com之外的主机)连接到MySQL Server时,则连接符合第三个INSERT语句插入的配置行,在threads表中对应配置行的INSTRUMENTED和HISTORY字段值变为NO
## 当sam从任意主机(%匹配)连接到MySQL Server时,则连接符合第三个INSERT语句插入的配置行,在threads表中对应配置行的INSTRUMENTED字段值变为NO,HISTORY字段值为YES
## 除joe和sam用户之外,其他任何用户从任意主机连接到MySQL Server时,则匹配到第一个UPDATE语句更新之后的默认配置行,在threads表中对应配置行的INSTRUMENTED和HISTORY字段值变为NO
## 如果把UPDATE语句改成DELETE,让未明确指定的用户在setup_actors表中找不到任何匹配行,则在threads表中对应配置行的INSTRUMENTED和HISTORY字段值变为NO
5.3.6 setup_objects表
mysql> SELECT * FROM setup_objects;
......
OBJECT_SCHEMA ='literal' and OBJECT_NAME ='literal'
OBJECT_SCHEMA ='literal' and OBJECT_NAME ='%'
OBJECT_SCHEMA ='%' and OBJECT_NAME ='%'
# setup_instruments表
mysql> select * from setup_instruments where name like '%/table/%';
......
2 rows in set (0.00 sec)
# setup_objects表
Mysql> select * from setup objects;
......
# 以上两个表中的配置项结合之后,只有db1.t1、db2.%、%.%表对象的instruments会被启用,db1.t2和db3.%不会被启用,因为这两个对象在setup_objects表中ENABLED和TIMED字段值都为NO
5.3.7 threads表
mysql> select * from threads where TYPE='FOREGROUND' limit 2\G
......
2 rows in set (0.00 sec)
# 关闭所有后台线程的事件采集功能
mysql> update threads set INSTRUMENTED='NO' where TYPE='BACKGROUND';
Query OK, 40 rows affected (0.00 sec)
Rows matched: 40 Changed: 40 Warnings: 0
# 开启所有后台线程的事件采集功能
mysql> update threads set INSTRUMENTED='YES' where TYPE='BACKGROUND';
Query OK, 40 rows affected (0.00 sec)
Rows matched: 40 Changed: 40 Warnings: 0
# 关闭除当前连接之外的所有前台线程的事件采集功能
mysql> update threads set INSTRUMENTED='NO' where PROCESSLIST_ID!=connection_id();
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
# 开启除当前连接之外的所有前台线程的事件采集功能
mysql> update threads set INSTRUMENTED='YES' where PROCESSLIST_ID!=connection_id();
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
# 当然,如果要连后台线程一起操作,请带上条件PROCESSLIST_ID is NULL
update ... where PROCESSLIST_ID!=connection_id() or PROCESSLIST_ID is NULL;
提示:关于文中提到的参数的详细解释,可参考本书下载资源中的“附录C”。
上一篇:第4章 performance_schema初相识 | 下一篇:第6章 performance_schema应用示例荟萃