Description:
Using ROOT user, and just selecting information from the events_statements_history table will cause the Performance schema to trace the action ALSO if the user AND the schema should be excluded.
How to repeat:
(root@localhost) [performance_schema]>select * from setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| EVENT | mysql | % | NO | NO |
| EVENT | performance_schema | % | NO | NO |<--- Excluded
| EVENT | information_schema | % | NO | NO |
| EVENT | % | % | YES | YES |
| FUNCTION | mysql | % | NO | NO |
| FUNCTION | performance_schema | % | NO | NO |<--- Excluded
| FUNCTION | information_schema | % | NO | NO |
| FUNCTION | % | % | YES | YES |
| PROCEDURE | mysql | % | NO | NO |
| PROCEDURE | performance_schema | % | NO | NO |<--- Excluded
| PROCEDURE | information_schema | % | NO | NO |
| PROCEDURE | % | % | YES | YES |
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |<--- Excluded
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
| TRIGGER | mysql | % | NO | NO |
| TRIGGER | performance_schema | % | NO | NO |<--- Excluded
| TRIGGER | information_schema | % | NO | NO |
| TRIGGER | % | % | YES | YES |
+-------------+--------------------+-------------+---------+-------+
20 rows in set (0.00 sec)
(root@localhost) [performance_schema]>select * from setup_actors;
+------+--------+------+---------+
| HOST | USER | ROLE | ENABLED |
+------+--------+------+---------+
| % | % | % | NO |
| % | stress | % | YES | <--- Only USER stress should be catch
+------+--------+------+---------+
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES | <---- History is activated
| events_statements_history_long | NO |
| events_transactions_current | YES |
| events_transactions_history | NO |
| events_transactions_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+
Using ROOT user, and just selecting information from the events_statements_history table will cause the Performance schema to trace the action ALSO if the user AND the schema should be excluded.
(root@localhost) [performance_schema]>truncate table events_statements_history;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [performance_schema]>
FIRST SELECT will report empty given the TRUNCATE;
(root@localhost) [performance_schema]>select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB,ISPL.User, TH.PROCESSLIST_ID, ESH.* from information_schema.processlist ISPL JOIN threads TH on ISPL.ID=TH.PROCESSLIST_ID JOIN events_statements_history ESH ON TH.THREAD_ID=ESH.THREAD_ID Where (EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%')\G
Empty set (0.00 sec)
Query again ...
(root@localhost) [performance_schema]>select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB,ISPL.User, TH.PROCESSLIST_ID, ESH.* from information_schema.processlist ISPL JOIN threads TH on ISPL.ID=TH.PROCESSLIST_ID JOIN events_statements_history ESH ON TH.THREAD_ID=ESH.THREAD_ID Where (EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%')\G
*************************** 1. row ***************************
PROCESSLIST_USER: root <---------- ROOT should NOT be included
HOST: localhost
DB: performance_schema <---------- Performance Schema should NOT be included
User: root
PROCESSLIST_ID: 7
THREAD_ID: 38
EVENT_ID: 393636
END_EVENT_ID: 393636
EVENT_NAME: statement/sql/select
SOURCE: socket_connection.cc:98
TIMER_START: 5050240377023000
TIMER_END: 5050241480813000
TIMER_WAIT: 1103790000
LOCK_TIME: 523000000
SQL_TEXT: select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB,ISPL.User, TH.PROCESSLIST_ID, ESH.* from information_schema.processlist ISPL JOIN threads TH on ISPL.ID=TH.PROCESSLIST_ID JOIN events_statements_history ESH ON TH.THREAD_ID=ESH.THREAD_ID Where (EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%')
DIGEST: 40d8cfb76de3242d83aed5ffa241d1e7
DIGEST_TEXT: SELECT `TH` . `PROCESSLIST_USER` , `ISPL` . `HOST` , `ISPL` . `DB` , `ISPL` . `User` , `TH` . `PROCESSLIST_ID` , `ESH` . * FROM `information_schema` . `processlist` `ISPL` JOIN `threads` `TH` ON `ISPL` . `ID` = `TH` . `PROCESSLIST_ID` JOIN `events_statements_history` `ESH` ON `TH` . `THREAD_ID` = `ESH` . `THREAD_ID` WHERE ( `EVENT_NAME` LIKE ? OR `EVENT_NAME` LIKE ? OR `EVENT_NAME` LIKE ? OR `EVENT_NAME` LIKE ? )
CURRENT_SCHEMA: performance_schema <---------- Performance Schema should NOT be included
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
ROWS_EXAMINED: 38
CREATED_TMP_DISK_TABLES: 1
CREATED_TMP_TABLES: 1
SELECT_FULL_JOIN: 2
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
1 row in set (0.00 sec)
As such only way to filter is post filtering like:
select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB,ISPL.User, TH.PROCESSLIST_ID, ESH.* from information_schema.processlist ISPL JOIN threads TH on ISPL.ID=TH.PROCESSLIST_ID JOIN events_statements_history ESH ON TH.THREAD_ID=ESH.THREAD_ID Where ISPL.User='stress' AND (EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%')\G
For more information the EXPLAIN as well:
root@localhost) [performance_schema]>explain FORMAT=JSON select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB,ISPL.User, TH.PROCESSLIST_ID, ESH.* from information_schema.processlist ISPL JOIN threads TH on ISPL.ID=TH.PROCESSLIST_ID JOIN events_statements_history ESH ON TH.THREAD_ID=ESH.THREAD_ID Where (EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%')\G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "10281.52"
},
"nested_loop": [
{
"table": {
"table_name": "ISPL",
"access_type": "ALL",
"used_columns": [
"ID",
"USER",
"HOST",
"DB",
"COMMAND",
"TIME",
"STATE",
"INFO"
]
}
},
{
"table": {
"table_name": "TH",
"access_type": "ALL",
"rows_examined_per_scan": 256,
"rows_produced_per_join": 51,
"filtered": "10.00",
"using_join_buffer": "Block Nested Loop",
"cost_info": {
"read_cost": "1.00",
"eval_cost": "10.24",
"prefix_cost": "104.80",
"data_read_per_join": "66K"
},
"used_columns": [
"THREAD_ID",
"PROCESSLIST_ID",
"PROCESSLIST_USER"
],
"attached_condition": "(`performance_schema`.`TH`.`PROCESSLIST_ID` = `ISPL`.`ID`)"
}
},
{
"table": {
"table_name": "ESH",
"access_type": "ALL",
"rows_examined_per_scan": 2560,
"rows_produced_per_join": 4924,
"filtered": "3.76",
"using_join_buffer": "Block Nested Loop",
"cost_info": {
"read_cost": "328.66",
"eval_cost": "984.81",
"prefix_cost": "10281.52",
"data_read_per_join": "9M"
},
"used_columns": [
"THREAD_ID",
"EVENT_ID",
"END_EVENT_ID",
"EVENT_NAME",
"SOURCE",
"TIMER_START",
"TIMER_END",
"TIMER_WAIT",
"LOCK_TIME",
"SQL_TEXT",
"DIGEST",
"DIGEST_TEXT",
"CURRENT_SCHEMA",
"OBJECT_TYPE",
"OBJECT_SCHEMA",
"OBJECT_NAME",
"OBJECT_INSTANCE_BEGIN",
"MYSQL_ERRNO",
"RETURNED_SQLSTATE",
"MESSAGE_TEXT",
"ERRORS",
"WARNINGS",
"ROWS_AFFECTED",
"ROWS_SENT",
"ROWS_EXAMINED",
"CREATED_TMP_DISK_TABLES",
"CREATED_TMP_TABLES",
"SELECT_FULL_JOIN",
"SELECT_FULL_RANGE_JOIN",
"SELECT_RANGE",
"SELECT_RANGE_CHECK",
"SELECT_SCAN",
"SORT_MERGE_PASSES",
"SORT_RANGE",
"SORT_ROWS",
"SORT_SCAN",
"NO_INDEX_USED",
"NO_GOOD_INDEX_USED",
"NESTING_EVENT_ID",
"NESTING_EVENT_TYPE",
"NESTING_EVENT_LEVEL"
],
"attached_condition": "((`performance_schema`.`ESH`.`THREAD_ID` = `performance_schema`.`TH`.`THREAD_ID`) and ((`performance_schema`.`ESH`.`EVENT_NAME` like '%select%') or (`performance_schema`.`ESH`.`EVENT_NAME` like '%insert%') or (`performance_schema`.`ESH`.`EVENT_NAME` like '%update%') or (`performance_schema`.`ESH`.`EVENT_NAME` like '%delete%')))"
}
}
]
}
}
HOW to repeat:
1) use 5.7.6 m-16
2) update setup_actors set ENABLED='NO' where user='%';
3) insert into setup_actors values('%','stress','%','YES');
4) activate consumer like update setup_consumers set ENABLED='YES' where NAME='events_statements_history';
5) disable some instruments and keep only:
(root@localhost) [performance_schema]>select * from setup_instruments where ENABLED='YES';
+-------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+-------------------------------+---------+-------+
| statement/sql/select | YES | YES |
| statement/sql/update | YES | YES |
| statement/sql/insert | YES | YES |
| statement/sql/insert_select | YES | YES |
| statement/sql/delete | YES | YES |
| statement/sql/replace_select | YES | YES |
| statement/sql/delete_multi | YES | YES |
| statement/sql/update_multi | YES | YES |
| statement/abstract/Query | YES | YES |
| statement/abstract/new_packet | YES | YES |
| statement/abstract/relay_log | YES | YES |
+-------------------------------+---------+-------+
6) truncate table events_statements_history;
7) run twice :
select TH.PROCESSLIST_USER,ISPL.HOST,ISPL.DB, TH.PROCESSLIST_ID, ESH.* from events_statements_history ESH, threads TH, information_schema.processlist ISPL where TH.THREAD_ID=ESH.THREAD_ID AND TH.PROCESSLIST_ID=ISPL.ID AND EVENT_NAME like '%select%' OR EVENT_NAME like '%insert%' OR EVENT_NAME like '%update%' OR EVENT_NAME like '%delete%'\G