MySQL恢復過程

aoerqileng發表於2023-01-03

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狀態的事務


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2930599/,如需轉載,請註明出處,否則將追究法律責任。

相關文章