1. 程式人生 > 實用技巧 >MySQL 檢視最近的事務執行資訊

MySQL 檢視最近的事務執行資訊

MySQL版本:5.7.31
根據《MySQL效能優化金字塔法則》做的實驗,好書推薦!

我們可以通過慢查詢日誌查詢到一條語句的執行總時長,但是如果資料庫中存在著一些大事務在執行過程中回滾了,或者在執行過程中異常中止,這個時候慢查詢日誌就不頂用了,這時可以藉助performance_schemaevents_transactions_*表來檢視與事務相關的記錄資訊。

events_transactions_*表中詳細記錄了是否有事務被回滾,事務是否活躍(長時間未提交的事務也屬於活躍事務),事務是否提交等資訊。

一、檢視事務記錄功能是否開啟

記錄事務資訊的表一般為performance_schema

中的3張表,分別為

  • events_transactions_current,預設記錄每個執行緒最近的一個事務資訊
  • events_transactions_history,預設記錄每個執行緒最近的十個事務資訊
  • events_transactions_history_long ,預設記錄每個執行緒最近的10000個事務資訊
mysql> select * from performance_schema.setup_consumers where name like 'events_transactions%';
+----------------------------------+---------+
| NAME                             | ENABLED |
+----------------------------------+---------+
| events_transactions_current      | YES     |
| events_transactions_history      | NO      |  < -- 未開啟
| events_transactions_history_long | NO      |  < -- 未開啟
+----------------------------------+---------+

二、開啟事務記錄功能

備註:可以通過修改performance_schema.threads表中的配置,針對特定的執行緒進行記錄資訊,降低對效能的影響程度

mysql> update setup_consumers set enabled='YES' where name in ('events_transactions_history','events_transactions_history_long');

三、模擬

3.1 模擬活躍事務的檢視

開啟會話1視窗

mysql> begin;
mysql> use sbtest;
mysql> update sbtest1 set pad='yyy' where id =1;
mysql> select sys.ps_thread_id(connection_id());
+-----------------------------------+
| sys.ps_thread_id(connection_id()) |
+-----------------------------------+
|                            173799 |
+-----------------------------------+

會話2,檢視

mysql> select * from performance_schema.events_transactions_current where thread_id=173799\G;
*************************** 1. row ***************************
                      THREAD_ID: 173799
                       EVENT_ID: 3878
                   END_EVENT_ID: NULL
                     EVENT_NAME: transaction
                          STATE: ACTIVE     <--- 活躍
                         TRX_ID: NULL
                           GTID: AUTOMATIC
                  XID_FORMAT_ID: NULL
                      XID_GTRID: NULL
                      XID_BQUAL: NULL
                       XA_STATE: NULL
                         SOURCE: 
                    TIMER_START: 1052739637991597000
                      TIMER_END: 1052859374760511000
                     TIMER_WAIT: 119736768914000
                    ACCESS_MODE: READ WRITE
                ISOLATION_LEVEL: READ COMMITTED
                     AUTOCOMMIT: NO
           NUMBER_OF_SAVEPOINTS: 0
NUMBER_OF_ROLLBACK_TO_SAVEPOINT: 0
    NUMBER_OF_RELEASE_SAVEPOINT: 0
          OBJECT_INSTANCE_BEGIN: NULL
               NESTING_EVENT_ID: 3871
             NESTING_EVENT_TYPE: STATEMENT

3.2 模擬回滾事務的檢視(提交同理)

會話1 我們將3.1的會話1的事務回滾掉

-- mysql> begin;
-- mysql> use sbtest;
-- mysql> update sbtest1 set pad='yyy' where id =1;
-- mysql> select sys.ps_thread_id(connection_id());
+-----------------------------------+
| sys.ps_thread_id(connection_id()) |
+-----------------------------------+
|                            173799 |
+-----------------------------------+
mysql> rollback;

會話2 我們檢視事務資訊歷史表,可以看到當前執行緒被回滾的ID

mysql> select * from performance_schema.events_transactions_history where thread_id=173799\G;
*************************** 1. row ***************************
                      THREAD_ID: 173799
                       EVENT_ID: 3878
                   END_EVENT_ID: 4139
                     EVENT_NAME: transaction
                          STATE: ROLLED BACK   <--- 已經回滾了
                         TRX_ID: NULL
                           GTID: AUTOMATIC
                  XID_FORMAT_ID: NULL
                      XID_GTRID: NULL
                      XID_BQUAL: NULL
                       XA_STATE: NULL
                         SOURCE: 
                    TIMER_START: 1052739637991597000
                      TIMER_END: 1052938188250308000
                     TIMER_WAIT: 198550258711000
                    ACCESS_MODE: READ WRITE
                ISOLATION_LEVEL: READ COMMITTED
                     AUTOCOMMIT: NO
           NUMBER_OF_SAVEPOINTS: 0
NUMBER_OF_ROLLBACK_TO_SAVEPOINT: 0
    NUMBER_OF_RELEASE_SAVEPOINT: 0
          OBJECT_INSTANCE_BEGIN: NULL
               NESTING_EVENT_ID: 3871
             NESTING_EVENT_TYPE: STATEMENT

3.3 補充

如果一個事務長時間未提交(長時間處於ACTIVE狀態),這種情況雖然可以從events_transactions_current表中可以查詢到未提交的事務資訊,但是並不能很直觀的看到事務是從什麼時間點開始的,我們可以藉助information_schema.innodb_trx表進行輔助判斷Y