MySQL的xa recover 过程记录 1 首先需要了解的是MySQL在启动的时候,会创建trx_sys,trx_sys_init_at_db_start在该函数中调用trx_lists_init_at_db_start,这个函数会去扫描undo 段,将未提交的事务添加到事务链表in_rw_trx_list中。 2 开启binlog xa恢复的过程调用堆栈如下
mysqld!ha_recover(st_hash*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/xa.cc:149) mysqld!MYSQL_BIN_LOG::recover(st_io_cache*, Format_description_log_event*, unsigned long long*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:9939) mysqld!MYSQL_BIN_LOG::open_binlog(char const*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:8507) mysqld!MYSQL_BIN_LOG::open(char const*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.h:662) mysqld!init_server_components() (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/mysqld.cc:4228) mysqld!mysqld_main(int, char**) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/mysqld.cc:4755) mysqld!main (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/main.cc:32) libdyld.dylib!start (Unknown Source:0)
plugin_foreach(NULL, xarecover_handlerton, MYSQL_STORAGE_ENGINE_PLUGIN, &info); 调用xarecover_handlerton进行一些判断,哪些事务提交,哪些回滚。 事务进行提交的hton->commit_by_xid(hton, info->list + i); innodb调用innobase_commit_by_xid(进行提交,之前的事务信息在启动的时候已经恢复,可以直接走提交的流程。 写入binlog的都是prepared 状态,所以xa recoever 提交的是prepared状态的事务
