MySQL如何查看正在運行的SQL詳解
前言
? 在安裝MySQL的時候會默認初始化幾個MySQL運行所需的數(shù)據(jù)庫:mysql, sys, information_schema, performance_schema.這幾個庫存儲了MySQL在運行過程中的配置信息,運行信息,參數(shù)配置,數(shù)據(jù)庫信息,表信息等等。今天這個要查看正在運行的SQL主要用到的是information_schema和performance_schema這兩個庫。
processlist
processlist表位于information_schema庫中,主要是存儲的MySQL線程的一些基本信息。我們使用
desc information_schema.processlist來查看表結(jié)構(gòu):
- ID: 線程的id
- USER: 線程屬于哪一個用戶
- HOST:客戶端的host信息:hostname+端口
- DB:線程在哪一個數(shù)據(jù)庫下
- COMMAND:線程使用哪一種命令在執(zhí)行,空閑的線程狀態(tài)為sleep
- TIME:線程已經(jīng)運行的時間,秒為單位
- STATE:線程正在做什么:當前的狀態(tài),行為,或者事件
- INFO:線程正在執(zhí)行的語句,但是這個并不是很準確,所以需要使用其他的方式來完成我們的目標。
使用show processlist 或者 select * from information_schema.processlist查看processlist表
threads
threads 位于performance_schema庫中,每一行記錄的是一條服務器線程。當performance_schema初始化的時候,它會根據(jù)當時存在的線程填充線程表,之后每當服務器創(chuàng)建線程時,都會添加一條新數(shù)據(jù)。當線程結(jié)束線程表中也會刪除這條數(shù)據(jù)。使用 desc performance_schema.threads 來查看表結(jié)構(gòu):
- THREAD_ID:線程唯一id
- NAME:與服務器中的線程監(jiān)測代碼相關聯(lián)的名稱
- TYPE:線程類型。分為前臺和后臺。用戶連線程是前臺線程,與內(nèi)部服務器活動相關的線程是后端線程。例如InnoDB內(nèi)部線程。
- 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:衍生線程的id值
- ROLE:未使用
- INSTRUMENTED:線程執(zhí)行的事件是否插裝,(YES or ON)
- HISTORY:是否為線程記錄歷史事件
- CONNECTION_TYPE:用于建立連接的協(xié)議,或者NULL用于后臺線程。
- THREAD_OS_ID:MySQL線程對應于操作系統(tǒng)的線程id
events_statements_current
events_statements_current 位于performance_schema庫中,它存儲的是當前的語句事件,表為每個線程存儲一行,顯示賢臣哥最近監(jiān)視的語句事件的當前狀態(tài)。使用desc performance_schema.events_statements_current查看表結(jié)構(gòu):
- THREAD_ID:與事件關聯(lián)的線程id,與上邊threads的id對應
- EVENT_ID:事件啟動時的線程當前事件號
THREAD_ID和EVENT_ID一起標志唯一一行,沒有兩行具有相同的鍵值對
- END_EVENT_ID:在事件開始時設置null,并在事件結(jié)束時更新為線程當前事件號
- EVENT_NAME:事件的名稱
- SOURCE:包含生成事件的監(jiān)測代碼的源文件名稱和監(jiān)測發(fā)生所在文件的行號
- TIMER_START,TIMER_END,TIMER_WAIT:事件的時間信息,開始時間,結(jié)束時間,事件的運行時間,單位是皮秒(萬分之一秒)。
- LOCK_TIME:等待表鎖花費的時間。微妙為單位
- SQL_TEXT:SQL語句的文本,對于沒有關聯(lián)SQL語句的命令為null
- DIGEST:MD5的32個字符
- DIGEST_TEXT:規(guī)范化語句摘要文本。
- CURRENT_SCHEMA:語句的默認數(shù)據(jù)庫
- OBJECT_TYPE,OBJECT_SCHEMA,OBJECT_NAME :對于嵌套語句這些列包含有關父語句的信息
- OBJECT_INSTANCE_BEGIN:語句在內(nèi)存的對象地址
- MYSQL_ERRNO:語句錯誤號
- RETURNED_SQLSTATE:sql狀態(tài)返回
- MESSAGE_TEXT:錯誤信息
- ERRORS:該語句是否發(fā)生錯誤。
- WARNINGS:警告次數(shù)
- ROWS_AFFECTED:受語句影響的行數(shù)
- ROWS_SENT:語句返回的行數(shù)
- ROWS_EXAMINED:服務器層檢查的行數(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
如何查看正在運行的SQL
1、processlist表記錄的是MySQL正在運行的線程信息,而每一個線程在threads表中都有用線程的一個唯一id >>> thread_id。events_statements_current表中記錄著唯一線程id和該線程對應的SQL語句sql_text.
2、所以我們可以先在processlist拿到processlist對應的id
3、通過threads表的字段分析,我們之后一個processlist_id和thread_id一一對應,所以之后在threads表中通過processlist_id拿到thread_id
4、最后一步就是關鍵,我們通過thread_id在events_statements_current表中拿到sql_text,也就是我們需要拿到的sql語句。
拿到正在執(zhí)行的processlist_id
select id from information_schema.processlist
拿到與processlist_id對應的thread_id
select thread_id from performance_schema.threads where processlist_id in (上一步拿到的processlist_id列表)
拿到正在執(zhí)行的sql語句
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é)
到此這篇關于MySQL如何查看正在運行的SQL的文章就介紹到這了,更多相關MySQL查看正在運行SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL動態(tài)字符串處理DYNAMIC_STRING
本文主要給大家簡單講解了mysql如何使用DYNAMIC_STRING來進行動態(tài)字符串的保存,非常的實用,有需要的小伙伴可以參考下2016-10-10MySQL最大連接數(shù)max_connections設置的兩種方法
MySQL的最大連接數(shù)可以通過兩種方法進行設置,通過命令行臨時修改和通過配置文件永久修改這兩種方法,本文將通過代碼示例給大家詳細的講解一下這兩種方法,需要的朋友可以參考下2024-05-05mysql 實現(xiàn)互換表中兩列數(shù)據(jù)方法簡單實例
這篇文章主要介紹了mysql 實現(xiàn)互換表中兩列數(shù)據(jù)方法簡單實例的相關資料,需要的朋友可以參考下2016-10-10