MySQL 檢視最近的事務執行資訊
阿新 • • 發佈:2020-10-21
MySQL版本:5.7.31
根據《MySQL效能優化金字塔法則》做的實驗,好書推薦!
我們可以通過慢查詢日誌查詢到一條語句的執行總時長,但是如果資料庫中存在著一些大事務在執行過程中回滾了,或者在執行過程中異常中止,這個時候慢查詢日誌就不頂用了,這時可以藉助performance_schema
和events_transactions_*表
來檢視與事務相關的記錄資訊。
events_transactions_*表
中詳細記錄了是否有事務被回滾,事務是否活躍(長時間未提交的事務也屬於活躍事務),事務是否提交等資訊。
一、檢視事務記錄功能是否開啟
記錄事務資訊的表一般為performance_schema
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