欧博娱乐开户

欧博会员平台    你的位置:欧博娱乐开户 > 欧博会员平台 >

亚博体育博彩平台大全_好意思团二面:如何措置 Bin Log 与 Redo Log 的一致性问题

发布日期:2023-10-30 05:06    点击次数:52

亚博体育博彩平台大全_好意思团二面:如何措置 Bin Log 与 Redo Log 的一致性问题

亚博体育博彩平台大全_

[[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 纪录了两条日记:

皇冠客服飞机:@seo3687

纪录 威尼斯人骰宝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 来实施,并将实施效果复返给客户端

关于更新语句来说,这套经由雷同亦然要走一遍的,不同的是,更新经由还触及两个症结的日记模块 bin log 和 redo log。

bet365 app下载

以底下这条浅易的 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)情状,更新完成

如下图所示:

欧博app

不错看到,所谓两阶段提交,其实即是把 redo log 的写入拆分红了两个秩序:prepare 和 commit。

是以,为什么要这么策划呢?这么策划怎么就概况兑现崩溃规复呢?

凭据两阶段提交,崩溃规复时的判断司法是这么的:

若是 redo log 内部的事务是无缺的,也即是依然有了 commit 标记,则顺利提交

若是 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 还没写,主库并莫得完成这个操作,是以从库比较主库就会多实施一个事务,导致主备不一致

临了放上这说念题的背诵版:

口试官:

问法 1:如何措置 bin log 与 redo log 的一致性问题? 问法 2:一条 SQL 更新语句是如何实施的? 问法 3:讲一下 redo log / redo log 两阶段提交旨趣

小牛肉:

所谓两阶段提交,其实即是把 redo log 的写入拆分红了两个秩序:prepare 和 commit。

宁波远洋董秘:您好,二级市场的股票价格波动受多重因素影响,公司将积极做好生产经营,保持良好的基本面。为了维护广大投资者的合法权益,公司已制定了上市后三年稳定股价预案,具体情况详见公司披露的《宁波远洋首次公开发行股票招股说明书》。感谢您对公司的关注。

安井食品董秘:尊敬的投资者,您好:今年5月20日新柳伍车间确有发生相关事故,具体原因尚待监管部门进一步调查认定。事故发生后集团公司和新柳伍皆高度重视、迅速组织救援、第一时间加派安全生产专业人员协助进行后续工作并积极配合监管部门调查。目前已同工亡员工家属达成善后协议,伤者均已康复出院,事故未对新柳伍生产经营造成严重影响。事故发生后公司深刻吸取教训,立即开展安全风险等级管控、事故隐患排查整治等相关工作;同时还将持续加强对新柳伍的规范管理、夯实主体责任、坚决遏制同类事故发生。感谢您的关注和监督。

最初,存储引擎将实施更新好的新数据存到内存中,同期将这个更新操作纪录到 redo log 内部,此时 redo log 处于 prepare 情状。然后见告实施器实施完成了,随时不错提交事务

然后实施器生成这个操作的 bin log,并把 bin log 写入磁盘

临了实施器调用存储引擎的提交事务接口,存储引擎把刚刚写入的 redo log 情状改成提交(commit)情状,更新完成

若是数据库在写入 redo log(prepare) 阶段之后、写入 binlog 之前,发生了崩溃:

此时 redo log 内部的事务处于 prepare 情状,binlog 还没写,之后从库进行同步的技能,无法实施这个操作,然则骨子上主库依然完成了这个操作,是认为了主备一致,MySQL 崩溃时会在主库上回滚这个事务

 

而若是数据库在写入 binlog 之后,redo log 情状修改为 commit 前发生崩溃,此时 redo log 内部的事务仍然是 prepare 情状,binlog 存在并无缺,这么之后就会被从库同步当年,然则骨子上主库并莫得完成这个操作,是认为了主备一致,即使在这个时刻数据库崩溃了,主库上事务仍然会被平常提交。

 



上一篇:没有了

下一篇:太平洋私网客服热线_2023安康半程马拉松赛散伙 近七千名跑者恍悟当然之好意思

Powered by 欧博娱乐开户 @2013-2022 RSS地图

皇冠体育导航皇冠体育皇冠现金网皇冠客服新2网址

top