Mysql 5.6的crash-safe replication中与relay-log.info相关的部分
Thu, Aug 28, 2014这篇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执行的区别:
- DDL:
Query_event(DDL) - transactional DML:
Query_event(Begin)->Query_event(DML)->Xid_event - 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中的值