August 8, 2012

MySQL 源代码分析

[MySQL源码] 在复制线程事务提交与更新relay-log.info之间crash导致的复制不一致

转载请署名:印风 ——————————————- 最近发现一种情况,在xid event和flush_relay_log_info中间crash,可能会导致数据不一致。 即事务提交了,但relay-log.info文件还没更新,这会造成重启crash recovery后事务被重复执行一次。 幸好,在innodb层记录了这些信息。并且Percona也提供了一个选项来利用这些信息。 1.相关全局变量 在trx/trx0sys.c文件中定义了如下变量 最后一个commit的事务的slave信息: trx_sys_mysql_master_log_name trx_sys_mysql_master_log_pos trx_sys_mysql_relay_log_name trx_sys_mysql_relay_log_pos 最后一个commit的binlog信息: trx_sys_mysql_bin_log_name trx_sys_mysql_bin_log_pos 2.写入信息 那么在什么时候会记录这些信息呢? 在函数mysql_bin_log_commit_pos中,确定写入innodb的binlog位置,backtrace如下 #0  mysql_bin_log_commit_pos #1  0x00000000007c88d4 in innobase_commit_ordered_low #2  0x00000000007cca97 in innobase_commit_ordered #3  0x000000000071efc5 in run_commit_ordered #4  MYSQL_BIN_LOG::trx_group_commit_leader #5  0x000000000071f49d in MYSQL_BIN_LOG::write_transaction_to_binlog_events #6  0x000000000071f681 in MYSQL_BIN_LOG::write_transaction_to_binlog #7  0x000000000071ff6b in binlog_flush_cache #8  binlog_commit_flush_trx_cache #9  MYSQL_BIN_LOG::log_and_order #10 0x000000000068a112 in […]