设为首页 收藏本站
查看: 548|回复: 0

[经验分享] MySQL源码学习:ib_logfile、bin-log与主从同步

[复制链接]

尚未签到

发表于 2016-10-19 02:18:15 | 显示全部楼层 |阅读模式
    今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致。

本文简要说明下这个问题。
 
1、              写入流程
源码sql/handler.cc:
ha_commit_trans
{
  …
  if ((err= ht->prepare(ht, thd, all)))
  …
  tc_log->log_xid(thd, xid)
  …
  error=ha_commit_one_phase(thd, all)

}
说明:
实际上ib_logfile的两步写策略避免了上述的两个问题。流程大致如下:
a)        [ib_logfile] 写入当前事务的更新数据,并标志为事务准备(trx_prepare).
b)        写入bin-log
c)        [ib_logfile] 当前事务提交结束(trx_commit)
 
2、              恢复流程
实际上,若ib_logfile已经写入trx_prepare,则在恢复过程中,会根据bin-log中该事务是否存在来恢复数据(见函数xarecover_handlerton)。
流程如下(sql/handler.cc
xarecover_handlerton
{
  sql_print_information("Found %d prepared transaction(s) in %s",                             got, ha_resolve_storage_engine_name(hton));
  foreach (trx)
  {
If (found in bin-log)
{
  sql_print_information("commit xid %s", xid_to_str(buf, info->list+i));
  hton->commit_by_xid(hton, info->list+i);
}
Else
{
sql_print_information("rollback xid %s",xid_to_str(buf, info->list+i));
hton->rollback_by_xid(hton, info->list+i);
}
}
}
说明:从启动日志中能够看到上述代码输出的日志。
☆    假设在阶段a)结束之后程序异常, 此时没有写入bin-log 则从库不会同步这个事务。 主库上,在重启之后,从恢复日志中这个事务没有trx_commit,因此会被回滚。 逻辑上主从库都不会执行这个事务。
☆    假设在阶段b)结束后程序异常,此时bin-log已经写入,则从库会同步这个事务。 主库上,根据恢复日志和bin-log,也能够正常恢复此事务。
也就是说,若bin-log写入完成,则主从库都会正常完成事务;bin-log没有写入,则主从库都回滚事务。不会出现主从不一致的问题。
 
3、              操作系统崩溃造成的不一致
上述的流程并不是天衣无缝的。ib_logfile的写盘是能够被设置成非实时flush的。假设在bin-log写入完成后,系统崩溃,则可能出现这样的情况:bin-log写入所以从库能够执行事务。但主库中trx_prepare的日志没有被写入到ib_logifle中,导致主库不执行事务。这样就会出现主从不一致的情况。
解决方案:增加启动检测,将ib_logfile中不存在的事务,从bin-log删除掉。这样主从库都不执行此事务。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287961-1-1.html 上篇帖子: 如何用SQLyog来分析MySQL数据库详解 下篇帖子: MySQL查询及删除重复记录的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表