成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有趣的 Events_Statements_Current 表問題

數據庫 其他數據庫
在GreatSQL中,PFS下有一張內存表: events_statements_current,看到這個名稱"xxx_current",小白如我可能會認為這張表中的數據就是當前系統的活躍(active)語句。

什么是events_statements_current表

在GreatSQL中,PFS下有一張內存表: events_statements_current,看到這個名稱"xxx_current",小白如我可能會認為這張表中的數據就是當前系統的活躍(active)語句。該表的描述如下(有部分省略):

mysql> desc events_statements_current;
+-------------------------+------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------------------------------------+------+-----+---------+-------+
| THREAD_ID | bigint unsigned | NO | PRI | NULL | |
| EVENT_ID | bigint unsigned | NO | PRI | NULL | |
| END_EVENT_ID | bigint unsigned | YES | | NULL | |
| EVENT_NAME | varchar(128) | NO | | NULL | |
| SOURCE | varchar(64) | YES | | NULL | |
| TIMER_START | bigint unsigned | YES | | NULL | |
| TIMER_END | bigint unsigned | YES | | NULL | |
| TIMER_WAIT | bigint unsigned | YES | | NULL | |
| LOCK_TIME | bigint unsigned | NO | | NULL | |
| SQL_TEXT | longtext | YES | | NULL | |
| DIGEST | varchar(64) | YES | | NULL | |
| DIGEST_TEXT | longtext | YES | | NULL | |
| CURRENT_SCHEMA | varchar(64) | YES | | NULL | |
...
| MYSQL_ERRNO | int | YES | | NULL | |
| RETURNED_SQLSTATE | varchar(5) | YES | | NULL | |
| MESSAGE_TEXT | varchar(128) | YES | | NULL | |
...
+-------------------------+------------------------------------------------+------+-----+---------+-------+
44 rows in set (0.01 sec)

直接使用當前語句表的問題

直接做個小實驗,終端1:

SELECT sleep(1);

終端2:

USE performance_schema;

-- 查看最近用戶語句
SELECT s.thread_id, s.sql_text FROM events_statements_current s, threads t
WHERE s.thread_id = t.thread_id AND t.type = 'FOREGROUND';

輸出:

mysql> SELECT s.thread_id, s.sql_text FROM events_statements_current s, threads t WHERE s.thread_id = t.thread_id AND t.type = 'FOREGROUND';
+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
| thread_id | sql_text |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
| 58 | select sleep(1) |
| 1849 | SELECT s.thread_id, s.sql_text FROM events_statements_current s, threads t WHERE s.thread_id = t.thread_id AND t.type = 'FOREGROUND' |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

反復執行上述語句,發現終端1當前執行的語句都是:SELECT sleep(1),看起來有點像BUG呀 。

真的是這樣嗎? 來細看一下文檔的定義:

The events_statements_current table contains current statement events. The table stores one row per thread showing the current status of the thread's most recent monitored statement event, so there is no system variable for configuring the table size.

發現了一些關鍵信息: "showing the current status of the thread's most recent monitored statement event",也就是說:保存的是線程最近被檢測到的語句事件,并非當前正在處于執行狀態的語句

獲取當前活躍的語句方法

為了了解這個問題的解決方案,來看看具體實現的代碼:

void pfs_end_statement_vc(PSI_statement_locker *locker, void *stmt_da) {
PSI_statement_locker_state *state =
reinterpret_cast<PSI_statement_locker_state *>(locker);
...
if (state->m_discarded) {
return;
}

...
// storage/perfschema/pfs.cc:6462
if (flags & STATE_FLAG_TIMED) {
timer_end = get_statement_timer();
wait_time = timer_end - state->m_timer_start;
}
...

if (flags & STATE_FLAG_THREAD) {
...
if(flags & STATE_FLAG_EVENT) {
...
// storage/perfschema/pfs.cc:6528
pfs->m_timer_end = timer_end;
pfs->m_cpu_time = cpu_time;
pfs->m_end_event_id = thread->m_event_id;
...
}
}

說明,在語句運行結束的時候,PFS會更新記錄:

  • m_timer_end 運行結束時間
  • m_end_event_id 語句結束事件ID

繼續閱讀代碼,發現除了在:pfs_start_statement_vc中對該值進行初始化外,修改該值的代碼僅有這一處,基本可以得出結論:m_timer_end > 0 或 m_end_event_id >0 代表語句運行已經結束。

整個簡易工具測一下:

. ./setenv

FOR i IN $(seq 1 1000000)
DO
mysql -h127.0.0.1 -P3306 -uroot <<EOF
USE performance_schema;

-- 打印所有的進行中用戶SQL(除了自身)
SELECT s.* FROM events_statements_current s, threads t WHERE s.thread_id = t.thread_id AND t.type = 'FOREGROUND' AND sql_text like '%FOREGROUND%' = FALSE AND s.end_event_id IS NULL \G
EOF
sleep 0.1 # 每0.1秒跑一下
DONE

運行結果:

*************************** 1. row ***************************
THREAD_ID: 15082
EVENT_ID: 127
END_EVENT_ID: NULL
EVENT_NAME: statement/sql/select
SOURCE: init_net_server_extension.cc:95
TIMER_START: 19879433851621000
TIMER_END: 19880288626029000
TIMER_WAIT: 854774408000
LOCK_TIME: 0
SQL_TEXT: select sleep(1), 3
...

將工具SQL替換成

-- 移除原來的 s.end_event_id is NULL
SELECT s.* FROM events_statements_current s, threads t
WHERE s.thread_id = t.thread_id AND t.type = 'FOREGROUND' AND sql_text like '%FOREGROUND%' = FALSE AND s.timer_end = 0 \G

再次運行:

## 真的是啥也沒有啊,真的是啥也沒有啊,

再仔細看看文檔 (https://dev.mysql.com/doc/refman/5.7/en/performance-schema-events-statements-current-table.html):

TIMER_START, TIMER_END, TIMER_WAIT

Timing information for the event. The unit for these values is picoseconds (trillionths of a second).
The TIMER_START and TIMER_END values indicate when event timing started and ended. TIMER_WAIT is the event elapsed time (duration).

If an event has not finished, TIMER_END is the current timer value and TIMER_WAIT is the time elapsed so far (TIMER_END ? TIMER_START).

重要信息: 當事件沒有完成,TIMER_END會持續參考當前時間更新

與想象的很不一樣,無奈打開源碼,看看有什么線索

//storage/perfschema/table_events_statements.cc:315(table_events_statements_common)
if (m_row.m_end_event_id == 0) {
timer_end = get_statement_timer();
} else {
timer_end = statement->m_timer_end;
}

換句話說:運行未結束時,statement->m_timer_end的值確實是0,但是timer_end賦值用的是語句計時器的當前時間。

測試結論:events_statements_current可以用于描述當前活躍語句,活躍這個條件可以使用:END_EVENT_ID IS NULL來過濾。

責任編輯:武曉燕 來源: GreatSQL社區
相關推薦

2010-05-14 10:55:04

java對象序列化

2013-11-27 16:32:51

宕機kswapd0CPU

2021-12-29 17:29:07

KubernetesEvents集群

2011-12-20 17:15:52

PhoneGap APEvents

2014-09-19 11:17:48

面試題

2023-07-14 22:36:42

Node.jsStorage

2010-07-17 01:03:13

CMD Telnet

2023-03-13 08:47:06

CSS數學函數

2016-10-21 10:15:53

2022-07-13 08:31:18

React問題排查

2011-07-25 13:34:08

ORACLEFLASHBACK T

2022-03-26 16:51:27

Node.jstrace架構

2011-07-05 17:29:53

PhoneGapevents

2014-01-22 09:46:42

JavaScript數組

2022-03-30 09:01:37

CSS屬性函數

2020-07-29 10:00:38

PythonEllipsis索引

2022-10-10 23:19:02

Python腳本語言工具庫

2021-08-05 05:02:04

DPU數據中心Pensando

2016-12-21 09:35:55

JavaScript原生數組函數

2017-08-08 16:04:30

Python圖片處理文章提取器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲日日操 | 欧美性一级 | 自拍偷拍亚洲一区 | 国产精品伦理一区二区三区 | 性福视频在线观看 | 最新日韩精品 | 日本不卡一区二区三区在线观看 | 日韩精品成人网 | 亚洲一区视频在线播放 | 91欧美| 中文字幕不卡在线88 | 午夜影院 | 国产精品视频一区二区三区 | 国产精品一区二区三级 | 黄色一级免费 | 欧美日韩中文字幕 | 在线观看国产精品一区二区 | 黄色片免费看视频 | 狠狠干天天干 | 欧美无乱码久久久免费午夜一区 | 一级毛片免费完整视频 | 久久国产欧美日韩精品 | aaaa日韩 | 亚洲精品久久久久久久久久久久久 | 激情一区二区三区 | 日韩一级二级片 | 色黄视频在线 | 美女视频网站久久 | 亚洲国产精选 | 欧美一级www片免费观看 | 日韩成人免费av | 国产精品久久久久久久久久久久 | 人人草天天草 | 91www在线观看 | 日本一二三区电影 | 一区二区三区四区不卡视频 | 欧美黄色绿像 | 亚洲精品乱码 | 日韩av免费在线观看 | 亚洲一区二区三区桃乃木香奈 | 久久精品色欧美aⅴ一区二区 |