mysql+after+commit_MySQL 5.7中sync_binlog参数和半同步中after_commit和after_sync的区别

本文详细解析了MySQL 5.7中`sync_binlog`参数的作用,包括其在binlog刷盘时机的影响,并讨论了半同步复制模式下`after_commit`和`after_sync`的区别,强调了在`sync_binlog=1`和`rpl_semi_sync_master_wait_point=after_sync`设置下的安全性。
摘要由CSDN通过智能技术生成

本文为我的一些零散记录供以后参考,本来知道已经很久了但是有朋友问到老是需要翻很久,这里干脆记录下来,但是水平有限都不深入,如有误导请见谅为什么将他们放在一起讨论因为他们都存在于同一个函数MYSQL_BIN_LOG::ordered_commit函数中。

代码版本:percona 5.7.14

以下讨论sync_binlog参数在5.7中的作用

一、sync_binlog参数设置在源码中的表示

这个参数大家都知道控制着binlog的刷盘时机,但是在5.7中其还有另外一个功能,我这里将解释他的两个功能。我摘取了源码中说明问题的部分进行展示如下:

flush阶段:

flush_error= process_flush_stage_queue(&total_bytes, &do_rotate,&wait_queue);//进行binlog的从binlog buffer或者临时文件写入到binlog文件(注意是写到kernel buffer还没做fsync),同时触发innodb的组提交逻辑,innodb组提交的逻辑代码是阿里的印风兄写的,我请教过他。

update_binlog_end_pos_after_sync= (get_sync_period() == 1);//sync_binlog参数 如果为1则为真如果不为1则为假

if (!update_binlog_end_pos_after_sync)//如果sync_binlog=1则 这里不发信号给dump 如果不是1则发信号进行dump

update_binlog_end_pos();

其中get_sync_period()函数返回就是sync_binlog的设置,这里能够清晰看到如果sync_binlog != 1才会 在flush阶段发送信号给dump线程。

sync阶段

if (flush_error == 0 && total_bytes > 0) //这里进行sync binlog,

{

DEBUG_SYNC(thd, "before_sync_binlog_file");

std::pair result= sync_binlog_file(false);

sync_error= result.first;

}

if (update_binlog_end_pos_after_sync) //如果sync_binlog = 1 这里才发送信号给dump线程通知进行发送binlog

{

THD *tmp_thd= final_qu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值