25.4.6 通过线程进行预过滤
threadstable 为每个服务器线程包含一行。每行都包含有关线程的信息,并指示是否为该线程启用了监视。为了使 Performance Schema 监视线程,必须满足以下条件:
-
setup_consumerstable 中的
thread_instrumentation
使用者必须是YES
。 -
threads.INSTRUMENTED
列必须为YES
。 -
仅对在setup_instrumentstable 中启用的工具所产生的那些线程事件进行监视。
threadstable 还指示每个服务器线程是否执行历史事件日志记录。这包括 await,阶段,语句和事务事件,并影响到这些 table 的日志记录:
events_waits_history
events_waits_history_long
events_stages_history
events_stages_history_long
events_statements_history
events_statements_history_long
events_transactions_history
events_transactions_history_long
要进行历史事件记录,这些条件必须为真:
-
必须启用setup_consumerstable 中与历史记录相关的适当使用者。例如,在events_waits_history和events_waits_history_longtable 中的 await 事件日志记录要求相应的
events_waits_history
和events_waits_history_long
使用者为YES
。 -
threads.HISTORY
列必须为YES
。 -
仅对由setup_instrumentstable 中启用的工具产生的那些线程事件进行记录。
对于前台线程(来自 Client 端连接),threadstable 行中INSTRUMENTED
和HISTORY
列的初始值取决于与线程关联的用户帐户是否与setup_actorstable 中的任何行匹配。这些值来自匹配的setup_actorstable 行的ENABLED
和HISTORY
列。
对于后台线程,没有关联的用户。 INSTRUMENTED
和HISTORY
默认为YES
,而未查询setup_actors。
最初的setup_actors内容如下所示:
mysql> SELECT * FROM performance_schema.setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| % | % | % | YES | YES |
+------+------+------+---------+---------+
HOST
和USER
列应包含 Literals 主机名或用户名,或'%'
以匹配任何名称。
ENABLED
和HISTORY
列指示是否为匹配线程启用检测和历史事件日志记录,但要遵守前面描述的其他条件。
当性能模式检查setup_actors
中每个新前景线程的匹配项时,它将尝试使用USER
和HOST
列(ROLE
未使用)首先查找更特定的匹配项:
-
具有
USER='literal'
和HOST='literal'
的行。 -
具有
USER='literal'
和HOST='%'
的行。 -
具有
USER='%'
和HOST='literal'
的行。 -
具有
USER='%'
和HOST='%'
的行。
匹配发生的 Sequences 很重要,因为不同的匹配setup_actors行可以具有不同的USER
和HOST
值。这样就可以根据ENABLED
和HISTORY
列的值,选择性地对每个主机,用户或帐户(用户和主机组合)应用检测和历史事件日志记录:
-
当最匹配的行是
ENABLED=YES
时,线程的INSTRUMENTED
值变为YES
。当最匹配的行是HISTORY=YES
时,线程的HISTORY
值变为YES
。 -
当最匹配的行是
ENABLED=NO
时,线程的INSTRUMENTED
值变为NO
。当最匹配的行是HISTORY=NO
时,线程的HISTORY
值变为NO
。 -
如果找不到匹配项,则线程的
INSTRUMENTED
和HISTORY
值变为NO
。
setup_actors行中的ENABLED
和HISTORY
列可以分别设置为YES
或NO
。这意味着您可以独立于是否收集历史事件来启用检测。
默认情况下,对所有新的前台线程都启用监视和历史事件收集,因为setup_actorstable 最初包含HOST
和USER
的带有'%'
的行。要执行更有限的匹配,例如仅启用对某些前台线程的监视,必须更改此行,因为它匹配任何连接,并添加更具体的HOST
/USER
组合的行。
假设您修改setup_actors如下:
UPDATE performance_schema.setup_actors
SET ENABLED = 'NO', HISTORY = 'NO'
WHERE HOST = '%' AND USER = '%';
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('localhost','joe','%','YES','YES');
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('hosta.example.com','joe','%','YES','NO');
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('%','sam','%','NO','YES');
UPDATE语句更改默认匹配以禁用检测和历史事件收集。 INSERT语句为更具体的匹配添加行。
现在,性能架构确定如何为新的连接线程设置INSTRUMENTED
和HISTORY
值,如下所示:
-
如果
joe
从 localhost 连接,则该连接与插入的第一行匹配。线程的INSTRUMENTED
和HISTORY
值变为YES
。 -
如果
joe
从hosta.example.com
连接,则连接匹配插入的第二行。线程的INSTRUMENTED
值变为YES
,而HISTORY
值变为NO
。 -
如果
joe
从任何其他主机连接,则没有匹配项。线程的INSTRUMENTED
和HISTORY
值变为NO
。 -
如果
sam
从任何主机进行连接,则该连接与插入的第三行匹配。线程的INSTRUMENTED
值变为NO
,而HISTORY
值变为YES
。 -
对于任何其他连接,将
HOST
和USER
设置为'%'
的行匹配。现在,该行的ENABLED
和HISTORY
设置为NO
,因此该线程的INSTRUMENTED
和HISTORY
值变为NO
。
对setup_actorstable 的修改仅影响在修改之后创建的前台线程,而不影响现有线程。要影响现有线程,请修改threads个 table 行的INSTRUMENTED
和HISTORY
列。