Mysql 5.6的crash-safe replication中与relay-log.info相关的部分

这篇blog目的是记录一下对Mysql 5.6 crash-safe replication的学习, 以及报给mysql的一个相关bug

先推荐Mats Kindahl写的关于crash safe的科普

crash-safe

按照Mats Kindahl的分类, 在此仅涉及”crash-safe slaves”中与relay-log.info相关的部分

Mysql crash-safe的名字起得并不好, 正确的名字应该是crash-safe-only-for-DML-of-innodb

涉及到DDL或非transactional型/非XA型的存储引擎时crash就不safe了, 比如这个bug

bug

为了达成crash-safe-only-for-DML-of-innodb, 需要开启relay-log-info-repository = TABLE.

简单说明一下DDL/transactional DML/non-transactional DML的binlog event执行的区别:

  1. DDL: Query_event(DDL)
  2. transactional DML: Query_event(Begin) -> Query_event(DML) -> Xid_event
  3. non-transactional DML: Query_event(Begin) -> Query_event(DML) -> Query_event(Commit)

其中Query_event中不会强制刷盘, 即inc_group_relay_log_pos中调用的flush_info(FALSE); 而Xid_event会强制刷盘.

如果使用relay-log-info-repository=FILE, 不强制刷盘时会进行flush_io_cache, 强制刷盘时进行my_sync (Rpl_info_file::do_flush_info)

如果使用relay-log-info-repository=TABLE, 不强制刷盘时什么都不会做, 强制刷盘时才会更新表

也就是说仅执行DDL/non-transactional DML时, slave_relay_log_info的信息不会更新, 与SHOW SLAVE STATUS中的信息不同

报给了mysql一个bug, 并被接受

结论是谨慎使用slave_relay_log_info中的值

comments powered by Disqus