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
