没有合适的资源?快使用搜索试试~ 我知道了~
15讲答疑文章(一):日志和索引相关问题1
需积分: 0 0 下载量 113 浏览量
2022-08-03
23:56:05
上传
评论
收藏 871KB PDF 举报
温馨提示
试读
18页
我在第2篇章《志系统:条SQL更新语句是如何执的?》中,和你讲到binlog(归档志)和redo log(重做志)配合崩溃恢复的时候,的是反证法,说明了如果没有
资源详情
资源评论
资源推荐
15讲答疑⽂章(⼀):⽇志和索引相关问题
在今天这篇答疑⽂章更新前,MySQL实战这个专栏已经更新了14篇。在这些⽂章中,⼤家在评论区留下了很多⾼质量的留
⾔。现在,每篇⽂章的评论区都有热⼼的同学帮忙总结⽂章知识点,也有不少同学提出了很多⾼质量的问题,更有⼀些同学帮
忙解答其他同学提出的问题。
在浏览这些留⾔并回复的过程中,我倍受⿎舞,也尽我所知地帮助你解决问题、和你讨论。可以说,你们的留⾔活跃了整个专
栏的氛围、提升了整个专栏的质量,谢谢你们。
评论区的⼤多数留⾔我都直接回复了,对于需要展开说明的问题,我都拿出⼩本⼦记了下来。这些被记下来的问题,就是我们
今天这篇答疑⽂章的素材了。
到⽬前为⽌,我已经收集了47个问题,很难通过今天这⼀篇⽂章全部展开。所以,我就先从中找了⼏个联系⾮常紧密的问
题,串了起来,希望可以帮你解决关于⽇志和索引的⼀些疑惑。⽽其他问题,我们就留着后⾯慢慢展开吧。
⽇志相关问题
我在第2篇⽂章《⽇志系统:⼀条SQL更新语句是如何执⾏的?》中,和你讲到binlog(归档⽇志)和redo log(重做⽇志)配
合崩溃恢复的时候,⽤的是反证法,说明了如果没有两阶段提交,会导致MySQL出现主备数据不⼀致等问题。
在这篇⽂章下⾯,很多同学在问,在两阶段提交的不同瞬间,MySQL如果发⽣异常重启,是怎么保证数据完整性的?
现在,我们就从这个问题开始吧。
我再放⼀次两阶段提交的图,⽅便你学习下⾯的内容。
图1 两阶段提交示意图
这⾥,我要先和你解释⼀个误会式的问题。有同学在评论区问到,这个图不是⼀个update语句的执⾏流程吗,怎么还会调⽤
commit语句?
他产⽣这个疑问的原因,是把两个“commit”的概念混淆了:
他说的“commit语句”,是指MySQL语法中,⽤于提交⼀个事务的命令。⼀般跟begin/start transaction 配对使⽤。
⽽我们图中⽤到的这个“commit步骤”,指的是事务提交过程中的⼀个⼩步骤,也是最后⼀步。当这个步骤执⾏完成后,这
个事务就提交完成了。
“commit语句”执⾏的时候,会包含“commit 步骤”。
⽽我们这个例⼦⾥⾯,没有显式地开启事务,因此这个update语句⾃⼰就是⼀个事务,在执⾏完成后提交事务时,就会⽤到这
个“commit步骤“。
接下来,我们就⼀起分析⼀下在两阶段提交的不同时刻,MySQL异常重启会出现什么现象。
如果在图中时刻A的地⽅,也就是写⼊redo log 处于prepare阶段之后、写binlog之前,发⽣了崩溃(crash),由于此时binlog
还没写,redo log也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog还没写,所以也不会传到备库。到这
⾥,⼤家都可以理解。
⼤家出现问题的地⽅,主要集中在时刻B,也就是binlog写完,redo log还没commit前发⽣crash,那崩溃恢复的时候MySQL会
怎么处理?
我们先来看⼀下崩溃恢复时的判断规则。
1. 如果redo log⾥⾯的事务是完整的,也就是已经有了commit标识,则直接提交;
2. 如果redo log⾥⾯的事务只有完整的prepare,则判断对应的事务binlog是否存在并完整:
a. 如果是,则提交事务;
b. 否则,回滚事务。
这⾥,时刻B发⽣crash对应的就是2(a)的情况,崩溃恢复过程中事务会被提交。
现在,我们继续延展⼀下这个问题。
追问1:MySQL怎么知道binlog是完整的?
回答:⼀个事务的binlog是有完整格式的:
statement格式的binlog,最后会有COMMIT;
row格式的binlog,最后会有⼀个XID event。
另外,在MySQL 5.6.2版本以后,还引⼊了binlog-checksum参数,⽤来验证binlog内容的正确性。对于binlog⽇志由于磁盘原
因,可能会在⽇志中间出错的情况,MySQL可以通过校验checksum的结果来发现。所以,MySQL还是有办法验证事务binlog
的完整性的。
追问2:redo log 和 binlog是怎么关联起来的?
回答:它们有⼀个共同的数据字段,叫XID。崩溃恢复的时候,会按顺序扫描redo log:
如果碰到既有prepare、⼜有commit的redo log,就直接提交;
剩余17页未读,继续阅读
MsingD
- 粉丝: 35
- 资源: 297
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Pytorch-pytorch深度学习教程之深度残差网络.zip
- Pytorch-pytorch深度学习教程之循环神经网络.zip
- Pytorch-pytorch深度学习教程之逻辑回归.zip
- Pytorch-pytorch深度学习教程之双向循环网络.zip
- Pytorch-pytorch深度学习教程之卷积神经网络.zip
- Pytorch-pytorch深度学习教程之前馈神经网络.zip
- Pytorch-pytorch深度学习教程之线性回归.zip
- Pytorch-pytorch深度学习教程之基本操作.zip
- 基于QT的地图可视化桌面系统后台数据库为MySQL5.7源码.zip
- 基于simulink的PLL锁相环系统仿真【包括模型,文档,参考文献,操作步骤】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0