
1. 服务器 MySQL 的用户权限不足(最常见)
Atomikos 启动时需要执行 XA RECOVER 命令来查询数据库中的悬空事务。如果服务器 MySQL 的连接用户(比如 root 或应用账号)没有被授予 XA_RECOVER_ADMIN 权限(MySQL 8.0 及以上),或者缺少对 performance_schema 表的读权限,就会直接报这个致命错误。
本地:你可能用的 root 高权限账号,没问题。
服务器:DBA 可能只给了一个 CRUD 权限的账号,缺少管理类权限。
2. 服务器 MySQL 中存在“脏”的悬空 XA 事务(数据残留)
在服务器上,可能之前有程序异常中断(比如 kill -9 杀进程、网络闪断),导致 MySQL 中残留了一些处于 PREPARE 状态的 XA 事务。Atomikos 启动时去读取这些残留事务,发现日志不一致(比如 Binlog 和 Redo log 对不上),立刻抛出 XAER_REMERR 阻止启动。
本地:数据库是干净的,没有残留事务。
3. MySQL 参数配置不一致
服务器上的 MySQL 参数和本地不同。
检查 binlog_format:必须为 ROW,如果是 STATEMENT 或 MIXED,XA 恢复可能失败。
检查 transaction_isolation:如果被改成了 READ-UNCOMMITTED,也可能引发 XA 内部的致命错误。
4. 连接超时或网络防火墙拦截
服务器上应用连 MySQL 的网段可能经过防火墙或代理,而 Atomikos 的恢复扫描(recover)会发送特定的 XA 指令包,可能被服务器上的安全策略(如阿里云 RDS 的 SQL 防火墙)拦截或阻断,导致 MySQL 返回 "Remote Error"。
处理办法
打开mysql 执行窗口执行
GRANT XA_RECOVER_ADMIN ON *.* TO '你的应用账号'@'%';
FLUSH PRIVILEGES;