MySQL 空事務

  1. 問題描述;
    研發同事反應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;
  2. 問題分析
    從trx_state 列的信息來看,這些事務都在Running 狀態,但trx_query 爲null。直觀上無法分析出這些事務對應的SQL.

    在information_schema中的PROCESSLIST, INNODB_LOCKS,INNODB_LOCK_WAITS 這幾張表中也沒分析出有價值的信息。

     

  3. 通過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事務呢? 

  4. 通過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

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