ordered_commit流程梳理

aoerqileng發表於2022-08-22

ordered_commit 是比較核心的函式,包含了組提交的3個階段,以及半同步的位置,下面是梳理的對應的流程


刷redo的呼叫堆疊

mysqld!innobase_flush_logs(handlerton*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/innobase/handler/ha_innodb.cc:4233)
mysqld!flush_handlerton(THD*, st_plugin_int**, void*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/handler.cc:2488)
mysqld!plugin_foreach_with_mask(THD*, char (**)(THD*, st_plugin_int**, void*), int, unsigned int, void*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_plugin.cc:2524)
mysqld!plugin_foreach_with_mask(THD*, char (*)(THD*, st_plugin_int**, void*), int, unsigned int, void*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_plugin.cc:2539)
mysqld!ha_flush_logs(handlerton*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/handler.cc:2498)
mysqld!MYSQL_BIN_LOG::process_flush_stage_queue(unsigned long long*, bool*, THD**) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:8975)
mysqld!MYSQL_BIN_LOG::ordered_commit(THD*, bool, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:9618)
mysqld!MYSQL_BIN_LOG::commit(THD*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/binlog.cc:8875)
mysqld!ha_commit_trans(THD*, bool, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/handler.cc:1806)
mysqld!trans_commit_stmt(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/transaction.cc:465)
mysqld!mysql_execute_command(THD*, bool) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:4995)
mysqld!mysql_parse(THD*, Parser_state*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:5584)
mysqld!dispatch_command(THD*, COM_DATA const*, enum_server_command) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1491)
mysqld!do_command(THD*) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/sql_parse.cc:1032)
mysqld!::handle_connection(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/sql/conn_handler/connection_handler_per_thread.cc:313)
mysqld!::pfs_spawn_thread(void *) (/Users/xiaoyu.bai/Downloads/mysql-5.7.29/storage/perfschema/pfs.cc:2197)
libsystem_pthread.dylib!_pthread_start (Unknown Source:0)
libsystem_pthread.dylib!thread_start (Unknown Source:0)


看到在刷redo的過程是放到了flush階段,沒有在commit階段,主要就是prepare事務的資訊在寫入binlog之前刷redo 即可。實現redo組提交

在flush階段是把redo flush到檔案了,在commit階段,會先執行binlog的提交,在執行innodb層的提交。

所以不存在redo提交了,binlog沒有提交的情況。

在崩潰恢復的過程中,檢視提交的binlog然後在去對比innodb prepare的事務,進行回滾或提交。


有興趣學習原始碼的加群一起學習啊 QQ:                                700072075

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

相關文章