MySQL查看当前正在连接的会话执行过的SQL
MySQL查看当前正在连接的会话执行过的SQL
版本信息:
(root@localhost 23:43:30) [mysql]> select version(); +-----------+ | version() | +-----------+ | 8.0.29 | +-----------+ 1 row in set (0.43 sec)
防爬虫:https://www.cnblogs.com/PiscesCanon/p/17294651.html
1.获取THREAD_ID号
首先,获取会话的thread_id号,如果你能直接操作你要查询的会话,可以使用如下方式:
(root@localhost 23:26:41) [mysql]> select ps_current_thread_id(); +------------------------+ | ps_current_thread_id() | +------------------------+ | 128 | +------------------------+ 1 row in set (0.00 sec)
或者:
(root@localhost 23:28:22) [mysql]> select thread_id from performance_schema.threads where PROCESSLIST_ID = connection_id(); +-----------+ | thread_id | +-----------+ | 128 | +-----------+ 1 row in set (0.00 sec)
如果是程序连接的,那么通过如下方式获取:
其中,子查询中where的条件越多越好,这样可以更加精确定位到你要的会话。
(root@localhost 23:32:09) [mysql]> select thread_id from performance_schema.threads where PROCESSLIST_ID in (select id from performance_schema.processlist where user='root' and host='192.168.1.179:34415'); +-----------+ | thread_id | +-----------+ | 131 | +-----------+ 1 row in set (0.00 sec)
2.查询视图获取
如果是当前或者上次执行的SQL(包括执行失败),可以使用如下查询:
关于视图performance_schema.events_statements_current,点击官网查看详细信息。
默认该视图只保留每个thread @@performance_schema_events_statements_history_size条记录(我的环境是该变量是10)。
(root@localhost 23:38:23) [mysql]> select * from performance_schema.events_statements_current where THREAD_ID = 131 \G *************************** 1. row *************************** THREAD_ID: 131 EVENT_ID: 3 END_EVENT_ID: 3 EVENT_NAME: statement/sql/select SOURCE: init_net_server_extension.cc:97 TIMER_START: 306364568264781000 TIMER_END: 306364632376136000 TIMER_WAIT: 64111355000 LOCK_TIME: 15000000 SQL_TEXT: select * from zkm.test244 DIGEST: bf8258b4bfb5ea0d5c64f50cd1ed9f2e34e59e37fb4d42b116daa78e829fdbc6 DIGEST_TEXT: SELECT * FROM `zkm` . `test244` CURRENT_SCHEMA: NULL OBJECT_TYPE: NULL OBJECT_SCHEMA: NULL OBJECT_NAME: NULL OBJECT_INSTANCE_BEGIN: NULL MYSQL_ERRNO: 1146 RETURNED_SQLSTATE: 42S02 MESSAGE_TEXT: Table 'zkm.test244' doesn't exist ERRORS: 1 WARNINGS: 0 ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 CREATED_TMP_DISK_TABLES: 0 CREATED_TMP_TABLES: 0 SELECT_FULL_JOIN: 0 SELECT_FULL_RANGE_JOIN: 0 SELECT_RANGE: 0 SELECT_RANGE_CHECK: 0 SELECT_SCAN: 0 SORT_MERGE_PASSES: 0 SORT_RANGE: 0 SORT_ROWS: 0 SORT_SCAN: 0 NO_INDEX_USED: 0 NO_GOOD_INDEX_USED: 0 NESTING_EVENT_ID: NULL NESTING_EVENT_TYPE: NULL NESTING_EVENT_LEVEL: 0 STATEMENT_ID: 2032 CPU_TIME: 0 EXECUTION_ENGINE: PRIMARY 1 row in set (0.00 sec)
如果是查询会话执行过的全部SQL(包括执行失败),可以这么查询(字段可以自己根据需要添加):
关于视图performance_schema.events_statements_history,点击官网查看详细信息。
(root@localhost 23:43:09) [mysql]> select TIMER_START,TIMER_END,SQL_TEXT,MESSAGE_TEXT from performance_schema.events_statements_history where thread_id=131; +--------------------+--------------------+----------------------------------+-----------------------------------+ | TIMER_START | TIMER_END | SQL_TEXT | MESSAGE_TEXT | +--------------------+--------------------+----------------------------------+-----------------------------------+ | 305868934761736000 | 305869186839229000 | select @@version_comment limit 1 | NULL | | 305870150600829000 | 305870150829451000 | select USER() | NULL | | 306364568264781000 | 306364632376136000 | select * from zkm.test244 | Table 'zkm.test244' doesn't exist | | 306689832599139000 | 306689833652352000 | select * from zkm.test1 | Table 'zkm.test1' doesn't exist | | 306694033041805000 | 306694033911856000 | select * from zkm.test2 | NULL | | 306697525763344000 | 306697537398594000 | select * from zkm.test | NULL | +--------------------+--------------------+----------------------------------+-----------------------------------+ 6 rows in set (0.00 sec)
网上比较美观使用的脚本如下(可以用thread_id或者processlist_id):传送门
SET @dt_ts=UNIX_TIMESTAMP(NOW()); SELECT MAX(sh.TIMER_START) into @dt_timer FROM performance_schema.threads AS t INNER JOIN performance_schema.events_statements_history AS sh ON t.`THREAD_ID`=sh.`THREAD_ID` WHERE t.PROCESSLIST_ID=CONNECTION_ID(); SELECT SH.CURRENT_SCHEMA AS database_name, REPLACE(REPLACE(REPLACE(SH.`SQL_TEXT`,'\n',' '),'\r',' '),'\t',' ') AS executed_sql, FROM_UNIXTIME(@dt_ts-CAST((@dt_timer-SH.TIMER_START)/1000000000000 AS SIGNED)) AS start_time, FROM_UNIXTIME(@dt_ts-CAST((@dt_timer-SH.TIMER_END)/1000000000000 AS SIGNED)) AS end_time, (SH.TIMER_END-SH.TIMER_START)/1000000000000 AS used_seconds, SH.TIMER_WAIT/1000000000000 AS wait_seconds, SH.LOCK_TIME/1000000000000 AS lock_seconds, SH.ROWS_AFFECTED AS affected_rows, SH.ROWS_SENT AS send_rows FROM performance_schema.threads AS T1 INNER JOIN performance_schema.events_statements_history AS SH ON T1.`THREAD_ID`=SH.`THREAD_ID` WHERE T1.THREAD_ID=135 AND SH.TIMER_START<@dt_timer ORDER BY SH.TIMER_START ASC;
效果:
(root@localhost 23:52:27) [mysql]> SELECT @dt_ts:=UNIX_TIMESTAMP(NOW()); +-------------------------------+ | @dt_ts:=UNIX_TIMESTAMP(NOW()) | +-------------------------------+ | 1680796349 | +-------------------------------+ 1 row in set, 1 warning (0.00 sec) (root@localhost 23:52:29) [mysql]> SELECT -> @dt_timer:=MAX(SH.TIMER_START) -> FROM performance_schema.threads AS T1 -> INNER JOIN performance_schema.events_statements_history AS SH -> ON T1.`THREAD_ID`=SH.`THREAD_ID` -> WHERE T1.PROCESSLIST_ID=CONNECTION_ID(); +--------------------------------+ | @dt_timer:=MAX(SH.TIMER_START) | +--------------------------------+ | 307241314149983000 | +--------------------------------+ 1 row in set, 1 warning (0.00 sec) (root@localhost 23:52:29) [mysql]> (root@localhost 23:52:29) [mysql]> SELECT -> SH.CURRENT_SCHEMA AS database_name, -> REPLACE(REPLACE(REPLACE(SH.`SQL_TEXT`,'\n',' '),'\r',' '),'\t',' ') AS executed_sql, -> FROM_UNIXTIME(@dt_ts-CAST((@dt_timer-SH.TIMER_START)/1000000000000 AS SIGNED)) AS start_time, -> FROM_UNIXTIME(@dt_ts-CAST((@dt_timer-SH.TIMER_END)/1000000000000 AS SIGNED)) AS end_time, -> (SH.TIMER_END-SH.TIMER_START)/1000000000000 AS used_seconds, -> SH.TIMER_WAIT/1000000000000 AS wait_seconds, -> SH.LOCK_TIME/1000000000000 AS lock_seconds, -> SH.ROWS_AFFECTED AS affected_rows, -> SH.ROWS_SENT AS send_rows -> FROM performance_schema.threads AS T1 -> INNER JOIN performance_schema.events_statements_history AS SH -> ON T1.`THREAD_ID`=SH.`THREAD_ID` -> WHERE T1.THREAD_ID=131 -> AND SH.TIMER_START<@dt_timer -> ORDER BY SH.TIMER_START ASC; +---------------+----------------------------------+---------------------+---------------------+--------------+--------------+--------------+---------------+-----------+ | database_name | executed_sql | start_time | end_time | used_seconds | wait_seconds | lock_seconds | affected_rows | send_rows | +---------------+----------------------------------+---------------------+---------------------+--------------+--------------+--------------+---------------+-----------+ | NULL | select @@version_comment limit 1 | 2023-04-06 23:29:37 | 2023-03-30 21:33:58 | 0.2521 | 0.2521 | 0.0000 | 0 | 1 | | NULL | select USER() | 2023-04-06 23:29:38 | 2023-03-30 21:33:58 | 0.0002 | 0.0002 | 0.0000 | 0 | 1 | | NULL | select * from zkm.test244 | 2023-04-06 23:37:52 | 2023-03-30 21:25:43 | 0.0641 | 0.0641 | 0.0000 | 0 | 0 | | NULL | select * from zkm.test1 | 2023-04-06 23:43:18 | 2023-03-30 21:20:18 | 0.0011 | 0.0011 | 0.0000 | 0 | 0 | | NULL | select * from zkm.test2 | 2023-04-06 23:43:22 | 2023-03-30 21:20:14 | 0.0009 | 0.0009 | 0.0000 | 0 | 1 | | NULL | select * from zkm.test | 2023-04-06 23:43:25 | 2023-03-30 21:20:10 | 0.0116 | 0.0116 | 0.0000 | 0 | 1 | | NULL | select connection_id() | 2023-04-06 23:46:48 | 2023-03-30 21:16:47 | 0.0003 | 0.0003 | 0.0000 | 0 | 1 | | NULL | select ps_current_thread_id() | 2023-04-06 23:47:36 | 2023-03-30 21:16:00 | 0.0002 | 0.0002 | 0.0000 | 0 | 1 | +---------------+----------------------------------+---------------------+---------------------+--------------+--------------+--------------+---------------+-----------+ 8 rows in set (0.00 sec)
一点点积累。