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
中的值