皇冠客服飞机:@seo3687
亚星捕鱼博彩平台注册送福利[[442100]]
刚看见这个题缱绻技能如故有点懵逼的,其后才反映过来其实问的便是 redo log 的两阶段提交
老章程,背诵版在文末。点击阅读原文不错直达我收录整理的各大厂口试真题
为什么说 redo log 具有崩溃还原的才气前边咱们说过,MySQL Server 层领有的 bin log 只可用于存档,不及以已毕崩溃还原(crash-safe),需要借助 InnoDB 引擎的 redo log 才气领有崩溃还原的才气。所谓崩溃还原便是:即使在数据库宕机的情况下,也不会出现操作一半的情况
至于为什么说 redo log 具有崩溃还原的才气,而 bin log 莫得,咱们先来浅薄看一下这两种日记有哪些不同点:
1)适用对象不同:bin log 是 MySQL 的 Server 层已毕的,扫数引擎都不错使用
博彩平台注册送福利而 redo log 是 InnoDB 引擎独到的
2)写入内容不同:bin log 是逻辑日记,纪录的是这个语句的原始逻辑,比如 “给 id = 1 这一溜的 age 字段加 1”
redo log 是物理日记,纪录的是 “在某个数据页上作念了什么修改”
3)写入格式不同:bin log 是不错追加写入的。“追加写” 是指 bin log 文献写到一定大小后会切换到下一个,并不会粉饰以前的日记
redo log 是轮回写的,空间固定会被用完
不错看到,redo log 和 bin log 的一个很大的区别便是,一个是轮回写,一个是追加写。也便是说 redo log 只会纪录未刷入磁盘的日记,还是刷入磁盘的数据都会从 redo log 这个有限大小的日记文献里删除。
而 bin log 是追加日记,保存的是全量的日记。这就会导致一个问题,那便是莫得象征能让 InnoDB 从 bin log 中判断哪些数据还是刷入磁盘了,哪些数据还莫得。
举个例子,bin log 纪录了两条日记:
纪录 美高梅金卡狮王1:给 id = 1 这一溜的 age 字段加 1 纪录 2:给 id = 1 这一溜的 age 字段加 1
假定在纪录 1 刷盘后,纪录 2 未刷盘时,数据库崩溃。重启后,只通过 bin log 数据库是无法判断这两札纪录哪条还是写入磁盘,哪条莫得写入磁盘,无论是两条都还原至内存,如故都不还原,对 id = 1 这行数据来说,都是别离的。
皇冠官网但 redo log 不一样,唯有刷入磁盘的数据,都会从 redo log 中被抹掉,数据库重启后,平直把 redo log 中的数据都还原至内存就不错了。
这便是为什么说 redo log 具有崩溃还原的才气,而 bin log 不具备。
redo log 两阶段提交前边咱们先容过一条 SQL 查询语句的施行过程,浅薄回顾:
MySQL 客户端与功绩器间建造联接,客户端发送一条查询给功绩器;
皇冠体育在线投注网站功绩器先查验查询缓存,如若掷中了缓存,则坐窝复返存储在缓存中的成果;不然干涉下一阶段;
功绩器端进行 SQL 剖释、预处理,生成正当的剖释树;
再由优化器生成对应的施行商量;
施行器凭据优化器生成的施行商量,调用相应的存储引擎的 API 来施行,并将施行成果复返给客户端
09款皇冠usb接口在哪关于更新语句来说,这套历程一样亦然要走一遍的,不同的是,更新历程还波及两个伏击的日记模块 bin log 和 redo log。
以底下这条浅薄的 SQL 语句为例,咱们来阐扬下施行器和 InnoDB 存储引擎在更新时作念了哪些事情:
update table set age = age + 1 where id = 1;
施行器:找存储引擎取到 id = 1 这一溜纪录
存储引擎:凭据主键索引树找到这一溜,如若 id = 1 这一溜处所的数据页原本就在内存池(Buffer Pool)中,就平直复返给施行器;不然,需要先从磁盘读入内存池,然后再复返
施行器:拿到存储引擎复返的行纪录,把 age 字段加上 1,取得一溜新的纪录,然后再调用存储引擎的接口写入这行新纪录
存储引擎:将这行新数据更新到内存中,同期将这个更新操作纪录到 redo log 内部,此时 redo log 处于 prepare 景况。然后奉告施行器施行完成了,随时不错提交事务
提防不要把这里的提交事务和咱们 sql 语句中的提交事务 commit 敕令搞混了哈,咱们这里说的提交事务,指的是事务提交过程中的一个小重要,亦然终末一步。当这个重要施行完成后,commit 敕令就施行得手了。
施行器:生成这个操作的 bin log,并把 bin log 写入磁盘
施行器:调用存储引擎的提交事务接口
存储引擎:把刚刚写入的 redo log 景况改成提交(commit)景况,更新完成
如下图所示:
不错看到,所谓两阶段提交,其实便是把 redo log 的写入拆分红了两个重要:prepare 和 commit。
是以,为什么要这么联想呢?这么联想若何就好像已毕崩溃还原呢?
凭据两阶段提交,崩溃还原时的判断措施是这么的:
如若 redo log 内部的事务是完竣的,也便是还是有了 commit 象征,则平直提交
皇冠代理登3如若 redo log 内部的事务处于 prepare 景况,则判断对应的事务 binlog 是否存在并完竣
a. 如若 binlog 存在并完竣,则提交事务; b. 不然,回滚事务。虽然,这么说小伙伴们详情没法王人集,底下来看几个本色的例子:
如下图所示,假定数据库在写入 redo log(prepare) 阶段之后、写入 binlog 之前,发生了崩溃,此时 redo log 内部的事务处于 prepare 景况,binlog 还没写(对应 2b),是以崩溃的技能,这个事务会回滚。
Why?
亚星捕鱼因为 binlog 还莫得写入,之后从库进行同步的技能,无法施行这个操作,可是本色上主库还是完成了这个操作,是认为了主备一致,在主库上需要回滚这个事务
况且,由于 binlog 还没写,是以也就不会传到备库,从而幸免主备不一致的情况。
而如若数据库在写入 binlog 之后,redo log 景况修改为 commit 前发生崩溃,此时 redo log 内部的事务仍然是 prepare 景况,binlog 存在并完竣(对应 2a),是以即使在这个时刻数据库崩溃了,事务仍然会被频频提交。
Why?
因为 binlog 还是写入得手了,这么之后就会被从库同步当年,可是本色上主库并莫得完成这个操作,是认为了主备一致,在主库上需要提交这个事务。
是以,其实不错看出来,处于 prepare 阶段的 redo log 加上完竣的 bin log,就能保证数据库的崩溃还原了。
可能有同学就会问了,MySQL 咋知谈 bin log 是不是完竣的?
浅薄来说,一个事务的 binlog 是有完竣神志的(这个咱们在背面的著作中会详备阐扬):
statement 神志的 bin log,终末会有 COMMIT row 神志的 bin log,终末会有 XID event而关于 bin log 可能会在中间出错的情况,MySQL 5.6.2 版块以后引入了 binlog-checksum 参数,用来考证 bin log 内容的正确性。
想考一个问题,两阶段提交是必要的吗?可不成以先 redo log 写完,再写 bin log 或者反过来?
1)关于先写完 redo log 后写 bin log 的情况:
假定在 redo log 写完,bin log 还莫得写完的技能,MySQL 崩溃。主库中的数据照实还是被修改了,可是这技能 bin log 内部并莫得纪录这个语句。因此,从库同步的技能,就会丢失这个更新,和主库不一致。
2)关于先写完 binlog 后写 redo log 的情况:
如若在 bin log 写完,redo log 还没写的技能,MySQL 崩溃。因为 binlog 还是写入得手了,这么之后就会被从库同步当年,可是本色上 redo log 还没写,主库并莫得完成这个操作,是以从库比较主库就会多施行一个事务,导致主备不一致
终末放上这谈题的背诵版:
www.crowncasino365888.com口试官:
问法 1:如何科罚 bin log 与 redo log 的一致性问题? 问法 2:一条 SQL 更新语句是如何施行的? 问法 3:讲一下 redo log / redo log 两阶段提交旨趣小牛肉:
所谓两阶段提交,其实便是把 redo log 的写入拆分红了两个重要:prepare 和 commit。
当先,存储引擎将施行更新好的新数据存到内存中,同期将这个更新操作纪录到 redo log 内部,此时 redo log 处于 prepare 景况。然后奉告施行器施行完成了,随时不错提交事务
然后施行器生成这个操作的 bin log,并把 bin log 写入磁盘
终末施行器调用存储引擎的提交事务接口,存储引擎把刚刚写入的 redo log 景况改成提交(commit)景况,更新完成
如若数据库在写入 redo log(prepare) 阶段之后、写入 binlog 之前,发生了崩溃:
此时 redo log 内部的事务处于 prepare 景况,binlog 还没写,之后从库进行同步的技能,无法施行这个操作,可是本色上主库还是完成了这个操作,是认为了主备一致,MySQL 崩溃时会在主库上回滚这个事务
“十三五”期间,各地按既定计划完成5年“能耗双控”目标,若保持节奏,可顺利达成“双控”目标。落实效果反映目标设置合理性可操作性。
而如若数据库在写入 binlog 之后,redo log 景况修改为 commit 前发生崩溃,此时 redo log 内部的事务仍然是 prepare 景况,binlog 存在并完竣,这么之后就会被从库同步当年,可是本色上主库并莫得完成这个操作,是认为了主备一致,即使在这个时刻数据库崩溃了,主库上事务仍然会被频频提交。