InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Transaction 0 4497755 was in the XA prepared state.
InnoDB: Transaction 0 4468551 was in the XA prepared state.
InnoDB: Transaction 0 4468140 was in the XA prepared state.
InnoDB: 3 transaction(s) which must be rolled back or cleaned up
...
[Warning] Found 3 prepared XA transactions
關鍵信息:3 筆 XA 事務停留在 PREPARED 狀態,需手動提交或回滾。
XA START xid → ACTIVE
XA END xid → IDLE
XA PREPARE xid → PREPARED (寫入 redo log,持久化,等待協調器決策)
XA COMMIT xid → 提交,釋放鎖
XA ROLLBACK xid → 回滾,釋放鎖
協調器(應用/事務管理器)崩潰導致 PREPARED 事務「懸掛」,MySQL 重啟後不會自動處理,需人工干預。
mysql> XA RECOVER;
+----------+--------------+--------------+--------------------------------------------------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------------------------------------------------+
| 131075 | 30 | 28 | 1-7f000001:bae5:4b6928eb:f06397f000001:bae5:4b6928eb:f0650 |
| 131075 | 30 | 28 | 1-7f000001:bae5:4b6928eb:fb5c37f000001:bae5:4b6928eb:fb5cd |
| 131075 | 30 | 28 | 1-7f000001:bae5:4b6928eb:f03ea7f000001:bae5:4b6928eb:f0400 |
+----------+--------------+--------------+--------------------------------------------------+
data = gtrid + bqual(全局事務 ID + 分支限定符)。formatID=131075 為 MySQL 內部固定值。-- 語法:XA ROLLBACK 'gtrid','bqual',formatID
XA ROLLBACK '1-7f000001:bae5:4b6928eb:fb5c3','7f000001:bae5:4b6928eb:fb5cd',131075;
-- 依次執行三條
mysql> XA RECOVER;
Empty set -- 無懸掛事務
Found prepared XA transactions 警告,恢復正常。XA START 不支持 JOIN/RESUME;XA END 不支持 SUSPEND [FOR MIGRATE]。bqual 必須不同(MySQL 額外限制)。| 場景 | 建議 |
|---|---|
配置 TM 重試機制,超時自動發起 XA RECOVER 掃描並決策提交/回滾 | |
啟動腳本中加入 XA RECOVER 自動檢查,發現懸掛事務報警人工介入 | |
Prometheus 抓取 innodb_xa_prepared_count(需自定義收集器),非 0 即告警 | |
| 業務邏輯拆分、縮短 PREPARED 持有時間,降低懸掛風險 |
XA 事務崩潰恢復核心:XA RECOVER 發現懸掛 → 業務決策 → XA COMMIT/ROLLBACK 清理 → 驗證無殘留。生產環境務必納入自動化巡檢與告警,避免懸掛事務長期佔用鎖資源導致業務阻塞。