范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

搞懂MySQL的redolog,binlog,undolog

  我们知道一条 select 语句是如何执行的。如果是 update 语句呢,执行步骤和查询语句其实是一样的,在执行语句前要连接数据库,这是连接器的工作。如果查询缓存中存在这条 SQL 的结果集缓存,直接取出返回客户端,前面说过,表上有更新的时候,这个表相关的查询缓存都会失效,所以查询缓存不建议使用,在 MySQL 8.0 版本把查询缓存删除了。接下来,分析器、优化器、执行器分别做各自的工作,查询出结果集返回给客户端。
  但 update 和 select 不一样的是,update还涉及两个重要的日志文件,就是 redo log 和 binlog。redo log
  update 操作其实是分为两步操作,先查询到对应的行记录,再根据条件进行更新操作。如果没有 redo log 的话,MySQL 每次的update操作都要更新磁盘文件,更新磁盘文件需要先在磁盘中找到对应的行记录,再更新,每一条 update 语句都要操作磁盘文件,整个过程的 I/O 成本,查找成本都很高。为了解决这个问题,InnoDB 引擎的设计者想到了一个办法,先将记录写到 redo log 中,并更新内存,这个时候更新就算完成了,操作内存比操作磁盘要快得多。同时,InnoDB 会在适当的时候,将 redo log 中的记录更新到磁盘文件中。这个更新往往是系统空闲时做。
  每次更新操作都要往 redo log 中写入,如果 redo log 满了,空间不够用了怎么办?
  InnoDB 的 redo log 文件是固定大小的,比如可以配置一组4个文件,每个文件大小是 1GB,那么 redo log 中可以记录 4GB 的操作,InnoDB 会从第一个文件开始写入,直到第四个文件写满了,又回到第一个文件开头循环写,如下图。
  redo日志
  write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
  write pos和checkpoint之间的是 redo log上还空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示 redo log 满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。
  有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。binlog
  刚刚说的 redo log 是执行引擎层的 log 文件,我们都知道,MySQL 整体来看,分为 Server 层和引擎层,而 binlog 是 Server 层面的 log 文件,也就是所有执行引擎都有 binlog
  那为什么 InnoDB 有一份 log 文件,MySQL 有一份 log 文件呢?
  因为以前的MySQL没有InnoDB引擎,MySQL5.5前使用的 MyISAM引擎,但是 MyISAM 没有 crash-safe 的能力,而 binlog 只能用于归档。InnoDB 是后来作为 MySQL 的引擎以插件形式引入的。既然只靠 binlog 无法实现 crash-safe 的能力,所以 InnoDB 使用另一套日志系统——redo log 来实现。update操作流程
  update T set c=c+1 where ID=2;
  1、执行器先通过引擎查询到 id = 2 这行数据,id 是主键,直接遍历主键索引树直接查到这行数据,如果这行数据所在的数据页在内存中,就直接返回结果给执行器,否则,需要先从磁盘读入内存,然后再返回。
  2、执行器拿到引擎给的行数据,把 这个值+1,得到新的一行数据,再调用引擎接口写入这行数据。
  3、引擎将这行数据更新到内存中,同时记录到 redo log 中,此时 redo log 处于 perpare 状态,此时就告知执行器已经更新完成了,随时可以提交事务。
  4、执行器生成这个操作的binlog,并把binlog写入磁盘
  5、执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成
  如下图为 update 语句的执行流程,深色代表 MySQL 执行器中执行的,浅色代表 InnoDB 内部执行的。
  update操作流程两阶段提交
  写入 redo log 分为两个步骤,prepare 和 commit,这就是"两阶段提交"。
  为什么要有两阶段提交,就是为了让 redo log 和 binlog 两个文件保持一致。我们还是用反证法来说明,假设没有两阶段提交会发生什么问题:先写 redo log,再写 binlog,假设 redo log 写完,binlog 还没写完,MySQL 进程异常重启,redo log 写完后,即使系统崩溃,仍然能把数据恢复回来,所有恢复后的数据是正确的。但是 binlog 没写完,这时候 binlog 中就没有记录这条语句的操作,因此,之后备份日志的时候,binlog 就没有这条操作记录,如果用这个 binlog 来恢复临时库的话,由于这条语句记录的丢失,临时库就会少了这一个语句的操作,恢复出来的数据就与原库的值不同。先写 binlog,再写 redo log,如果在 binlog 写完后系统崩溃了,由于 redo log 还没写,崩溃后这个事务无效,所以磁盘数据文件中的数据是没有这条语句的操作的,但是 binlog 中已经做了记录,所以以后用这个 binlog 来做数据恢复时,就多了一个事务操作,与原库的数据不一致。
  如果没有"两阶段提交",会导致 redo log 和 binlog 记录的操作不一致,那么数据库的状态就有可能和用它的日志恢复出来的库数据不一致。
  所以,能够保证 redo log 和 binlog 的操作记录一致的流程是,将操作先更新到内存,再写入 redo log,此时标记为 prepare 状态,再写入 binlog,此时再提交事务,将 redo log 标记为 commit 状态。redo log 与 binlogredo log 是InnoDB 引擎特有的;而 binlog 是MySQL Server 层实现的redo log 是物理日志,记录的是"在某个数据页做了什么修改";而 binlog 是逻辑日志,记录的是语句的原始逻辑。比如 update T set c=c+1 where ID=2;这条SQL,redo log 中记录的是 :xx页号,xx偏移量的数据修改为xxx;binlog 中记录的是:id = 2 这一行的 c 字段 +1redo log 是循环写的,固定空间会用完;binlog 可以追加写入,一个文件写满了会切换到下一个文件写,并不会覆盖之前的记录记录内容时间不同,redo log 记录事务发起后的 DML 和 DDL语句;binlog 记录commit 完成后的 DML 语句和 DDL 语句作用不同,redo log 作为异常宕机或者介质故障后的数据恢复使用;binlog 作为恢复数据使用,主从复制搭建。undo log
  undo log 和 redo log 也是引擎层的 log 文件,undo log 提供了回滚和多个行版本控制(MVCC),在数据库修改操作时,不仅记录了 redo log,还记录了 undo log,如果因为某些原因导致事务执行失败回滚了,可以借助 undo log 进行回滚。
  虽然 undo log 和 redo log 都是InnoDB 特有的,但 undo log 记录的是 逻辑日志,redo log 记录的是物理日志。对记录做变更操作时不仅会产生 redo 记录,也会产生 undo 记 (insert,update,delete),undo log 日志用于存放数据被修改前的值,比如 update T set c=c+1 where ID=2; 这条 SQL,undo log 中记录的是 c 在 +1 前的值,如果这个 update 出现异常需要回滚,可以使用 undo log 实现回滚,保证事务一致性。
  而多版本并发控制(MVCC) ,也用到了 undo log ,当读取的某一行被其他事务锁定时,它可以从 undo log 中获取该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。
  undo 记录默认被记录到系统表空间(ibdata1)中,但是从 MySQL5.6 开始,就可以使用独立的 undo 表空间了。不用担心 undo 会把 ibdata1 文件弄大。
  undo log 是采用段 (segment)的方式来记录的,每个 undo 操作在记录的时候占用一个 undo log segment
  rollback segment 称为回滚段,每个回滚段中有 1024 个 undo log segment,在以前的版本中,只支持一个 rollback segment,也就是只能记录 1024 个 undo log segment,MySQL 5.5 以后,可以支持 128 个 rollback segment,即支持 128*1024 个 undo 操作,还可以通过变量 innodb_undo_logs自定义 rollback segment 数量,默认是 128。

生个孩子让我怀疑人生没生孩子前和宝妈聊天,总是聊到生孩子的时候,宝妈们总是有说不完的回忆,好像生孩子的经历就在眼前一样,多久没无法忘怀。直到自己亲身经历了,才真正明白了那种恐惧和疼痛。还记得401那天茶香四溢的女孩名字,香远益清茶承载了丰富的中国文化元素,也成就了许多人的生活方式,提升了生活格调与品味。从茶名中起名不仅有情趣,更有雅兴。今天子墨老师从九款茶中为大家凝练出九个适合女宝宝的名字,茶香四溢的女孩T1战队四人续约图火了,Faker发文回应比赛,我一定会回来的2022电竞季前言S12赛季的比赛已经全部结束了,相信绝大多数的玩家都关注了这一次的世界赛,lpl赛区在比赛中的状态和发挥非常的一般,没能够拿到决赛的名额。Drx战队凭借着出色的发DRX夺冠管泽元被质疑,GALA把头像换成Deft,Bin表示明年会出手前言S12全球总决赛已经落下帷幕,来自LCK的黑马DRX击败三冠王T1,捧起了今年的召唤师奖杯,他们成为史上最强四号种子!回顾DRX今年的经历,真的很励志,这样的结果,确实配得上这平稳落地的战神诸神黄昏,做到了商业大片该做的一切以战神之名。11月4日晚,上映已经三年的复仇者联盟4在央视电影频道首播,立马登顶了全网收视榜冠军。即使这部片子在上映时总被各类影评吐槽剧情,依然不妨碍大众对这部电影的热爱。在提前通镇邪新手玩法推荐解析大赏鬼魂打虚弱用魂罐收进去,普通鬼魂精品鬼魂做法放生一次一张纸钱一个10经验,涨功德,多以多攒普通鬼魂一次性放生省纸钱。精品鬼魂因为放生也是10经验所以可以吃了。不能全吃,不然功德是负爱马仕Hermes女士秋冬高级定制系列女骑士驯服桀骜寒冬HERMES2022AutumnandWinterPremiumCustomFashionShow大秀主题衣物对话感官,驯服桀骜寒冬。用温柔的怀抱,唤醒自然本真,灵动的身姿流露出别打工新鲜事儿丨护士飞针采血,奶奶自学10多门外语行行出状元原标题护士飞针采血,奶奶自学10多门外语行行出状元!95后护士飞针采血,绝了!拇指与食指轻轻一弹针头瞬间刺入手臂采血近日,福建厦门一名95后护士练成一手飞针采血的绝活动作迅速麻利很杜兰特291212无缘今日最佳球员!因为卡特打出职业生涯最佳一战今天NBA又进行了很多场比赛,众多球星的表现也都非常出色,马瑟林绿军双探花马尔卡宁杜兰特小库里范弗利特英格拉姆布克布里奇斯莫兰特贝恩乔治詹姆斯亚历山大大洛佩斯米切尔等人的数据可圈可由于美国大选距离太近,加密货币命运悬而未决加密生态系统中的利益相关者特别注资,以使他们选择的候选人能够在这些中期选举中被看到。美国的选举投票于周二结束,结束了数月的共和党和民主党为众议院和参议院控制权而进行的中期选举竞选活中超大结局?山东夺冠,三镇海港拼足协杯,浙江进亚冠,广州双降24轮战罢眉目清晰,骡子和马溜了一大半,结局如何略知一二!先说四个看点一是联赛冠军。山东三镇大踏步领先,海港坐井观天。二是足协杯,山东三镇上半区,海港北京下半区。三是亚冠谁进四强?
还记得科比遗孀瓦妮莎吗?胜诉不屑要赔偿,获1亿赔款全部捐赠科比的离去让众多网友都唏嘘不已,但是最难过的莫过于科比身边的人,而这个人就是瓦妮莎,痛失丈夫和女儿,这种丧夫之痛和丧女之痛,最近两年也一直折磨着瓦妮莎,而比离世更让人难过的是,在科杜兰特选择留队!篮网组建新三巨头,进攻梳理点不行成缺陷随着杜兰特选择留队,篮网队的后宫大戏也终于尘埃落定。篮网队经历了一个月的布局之后,他们也将成为全联盟的公敌!联盟豪强队伍的,热火队,凯尔特人队,猛龙队,太阳队。为了争夺杜兰特不惜搞24岁的布克,24岁的科比,10项数据全面对比,没有对比就没有尴尬布克要是科比,太阳去年估计最起码得干到西决和勇士大战七场吧。不能只看得分,看看防守,抢断和盖帽最能说明问题,防守态度是可以感染全队的斗志,另外领袖的领导力,布克差科比不是一点半点,新赛季五大三巨头盘点之快船勇士随着又一个历史性的NBA赛季的结束,新的赛季即将到来。可能会有一些新的球队进入季后赛,同时也会有一些回归的球队希望在他们离开的地方重新开始。有几支球队已经进行了充足,这个休赛期也有NBA6大最新动态一詹姆斯携两个儿子登上体育画报封面今天湖人当家球星勒布朗携带2个儿子登上了体育画报的封面,全程三人展开了频繁的活动,尤其勒布朗还秀起了球技,对于此次的活动詹姆斯表示这太不可思议了,李春江了却心愿!儿子李京龙2年前未婚生娃,如今终于抱得美人归近日有媒体关注到了一桩喜事,李春江儿子的教练李京龙终于结婚了。在CBA这个大联盟里,李春江教练的地位不可撼动,他在执教广东宏远12年的时间里,帮助广东队拿下了7个总冠军的荣誉,如此揭皮克离婚原因!夏奇拉脾气火爆,平分28亿财产,新女友没怀孕最近一段时间,关于夏奇拉与巴萨球星皮克的婚姻关系,引发了外界关注,事实上,两人要在今年6月就签署了声明,宣布分手,西媒机密报也刊文对其中的一些秘辛进行了披露。首先,关于两人分手的原国安全新豪华教练组即将正式亮相,个个来头不小,前皇马助教在列日前,国安正式官宣荷兰教头斯坦利接手球队。斯坦利出任国安主教练之后,他就开始组建自己的教练团队。这位荷兰教练首先选择留任隋东亮和陶伟,让两位本土教练继续在国安一线队教练组工作。隋东难过!乔治娜独自祭奠已逝儿子,28岁面容疲惫,打扮似村姑原本乔治娜为C罗生下了一对双胞胎,但不幸的是,女婴顺利出生男婴却不幸夭折。虽然C罗在此之前已经有了三个孩子,但是对于他和乔治娜来说,失去一个属于他们两人的男婴还是非常痛苦和难过的。黄蜂竹篮打水一场空,鲍尔将加盟湖人联手老詹,乔老板面如死灰众所周知,夏洛特黄蜂是乔丹当年斥资1。75亿美元买下的球队,如今时隔十年黄蜂队的总价值已经高达16亿美元了,虽然和其他球队无法相提并论,但不得不说的是乔老板这些年可谓是赚的盆满钵满博格巴诅咒姆巴佩,德尚急了,世界杯卫冕冠军魔咒来了博格巴诅咒姆巴佩,德尚急了,世界杯卫冕冠军魔咒来了对于即将到来的卡塔尔世界杯,谁也不会想的,上届卫冕冠军法国队会再次出现更衣室矛盾,在先前轰轰烈烈的转会风波中,姆巴佩就传出和本泽马