MySQL如何查看正在運(yùn)行的SQL詳解
前言
? 在安裝MySQL的時(shí)候會(huì)默認(rèn)初始化幾個(gè)MySQL運(yùn)行所需的數(shù)據(jù)庫(kù):mysql, sys, information_schema, performance_schema.這幾個(gè)庫(kù)存儲(chǔ)了MySQL在運(yùn)行過(guò)程中的配置信息,運(yùn)行信息,參數(shù)配置,數(shù)據(jù)庫(kù)信息,表信息等等。今天這個(gè)要查看正在運(yùn)行的SQL主要用到的是information_schema和performance_schema這兩個(gè)庫(kù)。
processlist
processlist表位于information_schema庫(kù)中,主要是存儲(chǔ)的MySQL線(xiàn)程的一些基本信息。我們使用
desc information_schema.processlist來(lái)查看表結(jié)構(gòu):
- ID: 線(xiàn)程的id
- USER: 線(xiàn)程屬于哪一個(gè)用戶(hù)
- HOST:客戶(hù)端的host信息:hostname+端口
- DB:線(xiàn)程在哪一個(gè)數(shù)據(jù)庫(kù)下
- COMMAND:線(xiàn)程使用哪一種命令在執(zhí)行,空閑的線(xiàn)程狀態(tài)為sleep
- TIME:線(xiàn)程已經(jīng)運(yùn)行的時(shí)間,秒為單位
- STATE:線(xiàn)程正在做什么:當(dāng)前的狀態(tài),行為,或者事件
- INFO:線(xiàn)程正在執(zhí)行的語(yǔ)句,但是這個(gè)并不是很準(zhǔn)確,所以需要使用其他的方式來(lái)完成我們的目標(biāo)。
使用show processlist 或者 select * from information_schema.processlist查看processlist表
threads
threads 位于performance_schema庫(kù)中,每一行記錄的是一條服務(wù)器線(xiàn)程。當(dāng)performance_schema初始化的時(shí)候,它會(huì)根據(jù)當(dāng)時(shí)存在的線(xiàn)程填充線(xiàn)程表,之后每當(dāng)服務(wù)器創(chuàng)建線(xiàn)程時(shí),都會(huì)添加一條新數(shù)據(jù)。當(dāng)線(xiàn)程結(jié)束線(xiàn)程表中也會(huì)刪除這條數(shù)據(jù)。使用 desc performance_schema.threads 來(lái)查看表結(jié)構(gòu):
- THREAD_ID:線(xiàn)程唯一id
- NAME:與服務(wù)器中的線(xiàn)程監(jiān)測(cè)代碼相關(guān)聯(lián)的名稱(chēng)
- TYPE:線(xiàn)程類(lèi)型。分為前臺(tái)和后臺(tái)。用戶(hù)連線(xiàn)程是前臺(tái)線(xiàn)程,與內(nèi)部服務(wù)器活動(dòng)相關(guān)的線(xiàn)程是后端線(xiàn)程。例如InnoDB內(nèi)部線(xiàn)程。
- PROCESSLIST_ID:上邊的processlist的id
- PROCESSLIST_USER:上邊的processlist的user
- PROCESSLIST_HOST:上邊的processlist的host
- PROCESSLIST_DB:上邊的processlist的DB
- PROCESSLIST_COMMAND:上邊的processlist的COMMAND
- PROCESSLIST_TIME:上邊的processlist的TIME
- PROCESSLIST_STATE:上邊的processlist的STATE
- PROCESSLIST_INFO:上邊的processlist的INFO
- PARENT_THREAD_ID:衍生線(xiàn)程的id值
- ROLE:未使用
- INSTRUMENTED:線(xiàn)程執(zhí)行的事件是否插裝,(YES or ON)
- HISTORY:是否為線(xiàn)程記錄歷史事件
- CONNECTION_TYPE:用于建立連接的協(xié)議,或者NULL用于后臺(tái)線(xiàn)程。
- THREAD_OS_ID:MySQL線(xiàn)程對(duì)應(yīng)于操作系統(tǒng)的線(xiàn)程id
events_statements_current
events_statements_current 位于performance_schema庫(kù)中,它存儲(chǔ)的是當(dāng)前的語(yǔ)句事件,表為每個(gè)線(xiàn)程存儲(chǔ)一行,顯示賢臣哥最近監(jiān)視的語(yǔ)句事件的當(dāng)前狀態(tài)。使用desc performance_schema.events_statements_current查看表結(jié)構(gòu):
- THREAD_ID:與事件關(guān)聯(lián)的線(xiàn)程id,與上邊threads的id對(duì)應(yīng)
- EVENT_ID:事件啟動(dòng)時(shí)的線(xiàn)程當(dāng)前事件號(hào)
THREAD_ID和EVENT_ID一起標(biāo)志唯一一行,沒(méi)有兩行具有相同的鍵值對(duì)
- END_EVENT_ID:在事件開(kāi)始時(shí)設(shè)置null,并在事件結(jié)束時(shí)更新為線(xiàn)程當(dāng)前事件號(hào)
- EVENT_NAME:事件的名稱(chēng)
- SOURCE:包含生成事件的監(jiān)測(cè)代碼的源文件名稱(chēng)和監(jiān)測(cè)發(fā)生所在文件的行號(hào)
- TIMER_START,TIMER_END,TIMER_WAIT:事件的時(shí)間信息,開(kāi)始時(shí)間,結(jié)束時(shí)間,事件的運(yùn)行時(shí)間,單位是皮秒(萬(wàn)分之一秒)。
- LOCK_TIME:等待表鎖花費(fèi)的時(shí)間。微妙為單位
- SQL_TEXT:SQL語(yǔ)句的文本,對(duì)于沒(méi)有關(guān)聯(lián)SQL語(yǔ)句的命令為null
- DIGEST:MD5的32個(gè)字符
- DIGEST_TEXT:規(guī)范化語(yǔ)句摘要文本。
- CURRENT_SCHEMA:語(yǔ)句的默認(rèn)數(shù)據(jù)庫(kù)
- OBJECT_TYPE,OBJECT_SCHEMA,OBJECT_NAME :對(duì)于嵌套語(yǔ)句這些列包含有關(guān)父語(yǔ)句的信息
- OBJECT_INSTANCE_BEGIN:語(yǔ)句在內(nèi)存的對(duì)象地址
- MYSQL_ERRNO:語(yǔ)句錯(cuò)誤號(hào)
- RETURNED_SQLSTATE:sql狀態(tài)返回
- MESSAGE_TEXT:錯(cuò)誤信息
- ERRORS:該語(yǔ)句是否發(fā)生錯(cuò)誤。
- WARNINGS:警告次數(shù)
- ROWS_AFFECTED:受語(yǔ)句影響的行數(shù)
- ROWS_SENT:語(yǔ)句返回的行數(shù)
- ROWS_EXAMINED:服務(wù)器層檢查的行數(shù)
- 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
如何查看正在運(yùn)行的SQL
1、processlist表記錄的是MySQL正在運(yùn)行的線(xiàn)程信息,而每一個(gè)線(xiàn)程在threads表中都有用線(xiàn)程的一個(gè)唯一id >>> thread_id。events_statements_current表中記錄著唯一線(xiàn)程id和該線(xiàn)程對(duì)應(yīng)的SQL語(yǔ)句sql_text.
2、所以我們可以先在processlist拿到processlist對(duì)應(yīng)的id
3、通過(guò)threads表的字段分析,我們之后一個(gè)processlist_id和thread_id一一對(duì)應(yīng),所以之后在threads表中通過(guò)processlist_id拿到thread_id
4、最后一步就是關(guān)鍵,我們通過(guò)thread_id在events_statements_current表中拿到sql_text,也就是我們需要拿到的sql語(yǔ)句。
拿到正在執(zhí)行的processlist_id
select id from information_schema.processlist
拿到與processlist_id對(duì)應(yīng)的thread_id
select thread_id from performance_schema.threads where processlist_id in (上一步拿到的processlist_id列表)
拿到正在執(zhí)行的sql語(yǔ)句
select thread_id, sql_text from performance_schema.events_statements_current where thread_id in (上一步拿到的thread_id列表)
完整SQL
SELECT a.*, c.thread_id, c.sql_text from information_schema.processlist a LEFT JOIN performance_schema.threads b on a.id = b.PROCESSLIST_ID LEFT JOIN performance_schema.events_statements_current c on c.THREAD_ID = b.THREAD_ID
總結(jié)
到此這篇關(guān)于MySQL如何查看正在運(yùn)行的SQL的文章就介紹到這了,更多相關(guān)MySQL查看正在運(yùn)行SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL動(dòng)態(tài)字符串處理DYNAMIC_STRING
本文主要給大家簡(jiǎn)單講解了mysql如何使用DYNAMIC_STRING來(lái)進(jìn)行動(dòng)態(tài)字符串的保存,非常的實(shí)用,有需要的小伙伴可以參考下2016-10-10MySQL數(shù)據(jù)庫(kù)主從復(fù)制與讀寫(xiě)分離
大家好,本篇文章主要講的是MySQL數(shù)據(jù)庫(kù)主從復(fù)制與讀寫(xiě)分離,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12MySQL最大連接數(shù)max_connections設(shè)置的兩種方法
MySQL的最大連接數(shù)可以通過(guò)兩種方法進(jìn)行設(shè)置,通過(guò)命令行臨時(shí)修改和通過(guò)配置文件永久修改這兩種方法,本文將通過(guò)代碼示例給大家詳細(xì)的講解一下這兩種方法,需要的朋友可以參考下2024-05-05MySQL模糊查找like通配符使用(小白入門(mén)篇)
這篇文章主要為大家介紹了MySQL模糊查找like通配符使用的小白入門(mén)篇學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05MySQL如何使用使用Xtrabackup進(jìn)行備份和恢復(fù)
Xtrabackup是由Percona開(kāi)發(fā)的一個(gè)開(kāi)源軟件,可實(shí)現(xiàn)對(duì)InnoDB的數(shù)據(jù)備份,支持在線(xiàn)熱備份(備份時(shí)不影響數(shù)據(jù)讀寫(xiě))。本文講解如何使用該工具進(jìn)行備份和恢復(fù)2021-06-06mysql中的utf8與utf8mb4存儲(chǔ)及區(qū)別
本文主要介紹了mysql中的utf8與utf8mb4存儲(chǔ)及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02mysql 實(shí)現(xiàn)互換表中兩列數(shù)據(jù)方法簡(jiǎn)單實(shí)例
這篇文章主要介紹了mysql 實(shí)現(xiàn)互換表中兩列數(shù)據(jù)方法簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-10-10