- 問題描述;
研發同事反應MySQL數據庫有鎖,檢查innodb_trx時,發現有很多長時間未結束的空事務。
這些事務的trx_mysql_thread_id都爲0,因此不能通過kill id 的方式強制關閉這些長時間未結束的殭屍事務。
SELECT trx_mysql_thread_id, trx_id, trx_started, sysdate(), trx_state, trx_query FROM information_schema.innodb_trx t WHERE (UNIX_TIMESTAMP(sysdate()) - UNIX_TIMESTAMP(t.trx_started)) > 10;
- 問題分析
從trx_state 列的信息來看,這些事務都在Running 狀態,但trx_query 爲null。直觀上無法分析出這些事務對應的SQL.
在information_schema中的PROCESSLIST, INNODB_LOCKS,INNODB_LOCK_WAITS 這幾張表中也沒分析出有價值的信息。 - 通過show engine innodb status\G 確實發現有很多Active的事務
---TRANSACTION 328393988035152, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 16946872173, ACTIVE (PREPARED) 1648933 sec recovered trx
1 lock struct(s), heap size 1136, 0 row lock(s), undo log entries 1
---TRANSACTION 16944705639, ACTIVE (PREPARED) 1708259 sec recovered trx
4 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
---TRANSACTION 16944693889, ACTIVE (PREPARED) 1708524 sec recovered trx
2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
---TRANSACTION 16944693748, ACTIVE (PREPARED) 1708549 sec recovered trx
1 lock struct(s), heap size 1136, 0 row lock(s), undo log entries 1
正常的事務不應該執行這麼長時間,而不被發現。有沒有可能是XA事務呢? - 通過xa recover; 檢查 , 果然發現很多XA事務。
XA RECOVER; +----------+--------------+--------------+------------------------------------------------------+ | formatID | gtrid_length | bqual_length | data | +----------+--------------+--------------+------------------------------------------------------+ | 1 | 32 | 8 | 5685c69b0df34ccc94e9da437c399344xdb1_002 | | 1 | 32 | 10 | 84e2f7d6fd674f5592f135415e9c0ad4idcent_002 | | 1 | 32 | 9 | f0eedc6c38894e88837771f019ddc090imail_002 | | 1 | 32 | 10 | 6677f0102a6c4a0aab2c4696bd20d690idcent_002 | +----------+--------------+--------------+------------------------------------------------------+
如何釋放這些長時間未提交的XA事務呢?
通過MySQL官方文檔,最終決定採用rollback的方式,回滾掉這些XA事務。
xa rollback '5685c69b0df34ccc94e9da437c399344','xdb1_002',1;
Query OK, 0 rows affected (0.00 sec)
依次回滾這些長時間未結束的XA事務, 再次檢查innodb_trx 未發現相關的事務信息。
參考文檔:https://dev.mysql.com/doc/refman/5.7/en/xa-statements.html