mysql 如何查看每個連接中具體某個session 級別參數的值?

我們知道mysql中參數變量分爲session 會話級別和global 全局級別
如long_query_time 就是一個典型的會話級別參數。
set session long_query_time = 1.5; 設置後僅僅在當前會話中有效。重新打開一個會話仍然是默認值。session 可以省略
set global long_query_time =1.5 ;設置後重新打開一個會話,重新打開一個會話,值是1.5

注意:我們將一個會話級別的參數如long_query_time 的global 全局範圍值修改爲新的值,那麼以後新創建的會話會是這個新的值。但是對於原來已經創建的連接,它們的參數值還是老樣子。很多線上修改話級別的參數不生效就是這個原因(需要set session一下才能影響到當前會話)。

通過這樣來查看當前會話和全局的參數值:
show session variables like '%long_query_time%';
show global variables like '%long_query_time %';

但是這樣的show session variables 只能查看自己會話的參數值,而別的會話的參數值是什麼情況我們不知道呀,所以5.7版本推出了一種方式來查詢:

(root@localhost) [performance_schema]>select * from performance_schema.variables_by_thread where variable_name='long_query_time';
+-----------+-----------------+----------------+
| THREAD_ID | VARIABLE_NAME   | VARIABLE_VALUE |
+-----------+-----------------+----------------+
|        29 | long_query_time | 10.000000      |
|        30 | long_query_time | 1.500000       |
|        31 | long_query_time | 10.000000      |
+-----------+-----------------+----------------+
3 rows in set (0.00 sec)

thread_id 爲30的線程對應long_query_time值爲1.5,我們還想知道具體是哪個process 連接的值是1.5?
5.7提供了這個performance_schema.threads表,它保存了THREAD_ID和PROCESSLIST_ID還有THREAD_OS_ID的對應關係。

(root@localhost) [performance_schema]>select * from performance_schema.threads limit 1 \G
*************************** 1. row ***************************
          THREAD_ID: 1
               NAME: thread/sql/main
               TYPE: BACKGROUND
     PROCESSLIST_ID: NULL
   PROCESSLIST_USER: NULL
   PROCESSLIST_HOST: NULL
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: NULL
   PROCESSLIST_TIME: 22857
  PROCESSLIST_STATE: NULL
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: NULL
       THREAD_OS_ID: 26446
1 row in set (0.00 sec)


那麼我們查下THREAD_ID =30 的記錄

(root@localhost) [performance_schema]>select * from threads where THREAD_ID =30  limit 1 \G
*************************** 1. row ***************************
          THREAD_ID: 30
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 5
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Sleep
   PROCESSLIST_TIME: 333
  PROCESSLIST_STATE: NULL
   PROCESSLIST_INFO: set session long_query_time = 1.5
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: Socket
       THREAD_OS_ID: 26480
1 row in set (0.00 sec)

得到了 THREAD_ID: 30對應的 PROCESSLIST_ID: 5

得出結論:那麼show processlist 結果的第二條連接的long_query_time的值是1.5

(root@localhost) [performance_schema]>show processlist;
+----+------+-------------------+--------------------+---------+-------+----------+------------------+
| Id | User | Host              | db                 | Command | Time  | State    | Info             |
+----+------+-------------------+--------------------+---------+-------+----------+------------------+
|  4 | root | 192.168.6.1:20193 | mysql              | Sleep   | 17649 |          | NULL             |
|  5 | root | localhost         | NULL               | Sleep   |  2500 |          | NULL             |
|  6 | root | localhost         | performance_schema | Query   |     0 | starting | show processlist |
+----+------+-------------------+--------------------+---------+-------+----------+------------------+

processlistId 對應thread id,然後又對應操作系統進程的線程id thread_os_id

那麼上面操作可以使用join來直接完成:

select a.processlist_id,
a.thread_id,
a.thread_os_id,
a.processlist_user,
a.processlist_host,
a.processlist_db,
a.processlist_command,
a.processlist_state,
a.processlist_info,
b.* from performance_schema.threads a ,performance_schema.variables_by_thread b where a.thread_id=b.thread_id and b.variable_name='long_query_time';

結果如下

(root@localhost) [performance_schema]>select a.processlist_id, a.thread_id, a.thread_os_id, a.processlist_user, a.processlist_host, a.processlist_db, a.processlist_command, a.processlist_state, a.processlist_info, b.* from performance_schema.threads a ,performance_schema.variables_by_thread b where a.thread_id=b.thread_id and b.variable_name='long_query_time' limit 1\G
*************************** 1. row ***************************
     processlist_id: 4
          thread_id: 29
       thread_os_id: 26605
   processlist_user: root
   processlist_host: 192.168.6.1
     processlist_db: mysql
processlist_command: Sleep
  processlist_state: NULL
   processlist_info: SELECT STATE AS `Status`, ROUND(SUM(DURATION),7) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/0.003109*100,3), '') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=152 GROUP BY SEQ, STATE ORDER BY SEQ
          THREAD_ID: 29
      VARIABLE_NAME: long_query_time
     VARIABLE_VALUE: 10.000000
1 row in set (0.00 sec)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章