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

MySQL的redolog和binlog真香

  今天这篇文章给大家带来MySQL中重要的两个日志 -  redo log  、binlog  ,从理论概念出发,结合图解分析,看完这篇文章之后,你能对redo log  、binlog  有深入的理解。文章导读
  MySQL两个日志 浅谈MySQL分层架构
  在讲具体的日志之前,先稍微铺垫下MySQL分层的架构,让大家知道 redo log  、binlog  是由MySQL的哪一层产生的。
  MySQL分层架构图
  MySQL整体分为3层:客户端层,Server层和存储引擎层。我们的binlog日志,由Server层生成,redo log是InnoDB特有的日志,由InnoDB引擎生成。 重做日志(redo log)什么是redo log
  InnoDB为了能够支持事务一系列操作,而事务有4种特性: 原子性  、一致性  、隔离性  、持久性  ,在事务操作中,要么全部执行,要么全部不执行,这就是事务的目的。而我们的redo log用来保证事务的持久性,即我们常说的ACID中的D。我们只需要知道它是通过一套什么样的机制,来保证持久性,就能掌握好redo log  。
  这里的说的持久性,是说最后落盘到redo log文件(即常见的 ib_logfile  文件),因为最后我们异常情况的恢复,都是根据文件来做恢复的。
  那么我们的MySQL InnoDB是通过一套什么样的机制来确保 速度 与可靠性 的呢?WAL
  在计算机体系中,CPU处理速度和硬盘的速度,是不在同一个数量级上的,为了让它们速度匹配,从而催生了我们的内存模块,但是内存有一个特点,就是掉电之后,数据就会丢失,不是持久的,我们需要持久化的数据,最后都需要存储到硬盘上。
  InnoDB引擎设计者也利用了类似的设计思想,先写内存,再写硬盘,这样就不会因为redo log写硬盘IO而导致数据库性能问题。在InnoDB中,这种技术有一个专业名称,叫做 Write-Ahead Log(预先日志持久化)
  先写buffer 再写磁盘 redo log写入策略
  上边是保证了处理的速度,但是怎么样保证写入到硬盘的可靠性呢?
  InnoDB引擎的设计者也设计了一种写入的策略,首先有一个后台线程,每隔1秒,就会把 redo log buffer  中的日志,调用write写到文件系统的page cache  ,然后调用fsync  持久化到磁盘(即redo log文件 ib_logfile0 ib_logfile1  )。
  为了控制 redo log写入策略,InnoDB提供了 innodb_flush_log_at_trx_commit  配置参数,它有三种取值:设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ; 设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘; 设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache。
  如果不是对性能要求高的,一般把该参数设置为 1 redo log的擦除
  通过上边的设计, 速度 和可靠性 的问题都解决了,但是我们仔细想想,还会有什么问题?
  随着文件的增加,落盘的速度会越来越慢,直到有一天 ...
  聪明的设计者这样子想着,如果我一直处理小文件,最大不能超过某个大小,不就行了?
  也确实是这样子处理的,但是这里就涉及到一个删除日志文件的算法,即我们的 redo log擦除 。
  redo log 的大小是固定的,比如可以配置一组4个文件,每个文件大小是8M,那么这个redo log总共就可以记录32M的操作,这个参数可以通过 innodb_log_file_size  设置。
  下图是具体的擦除算法,ib_logfile 从头开始写,写到末尾就又回到开头循环写。
  擦除示意图 - 来自丁奇MySQL连边编辑
  write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后移动并且循环的,擦除记录前要把记录更新到数据文件,write pos与check point之间为剩余可用写入的空间。
  何时会擦除redo log并更新到数据文件中 系统空闲时 Redo log文件没有空闲空间时,即write pos追上check point的时候; MySQL Server正常关闭时 crash-safe
  有了以上这一些机制保障,我们可以相信redo log是可靠的,只要持久化到redo log文件中了,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,而我们把这个能力称为  crash-safe  。归档日志(binlog)
  在写这篇文章的时候,纠结到底先写redo log还是binlog,最后还是秉承 先苦后甜 的原则,把redo log写在前面了。如果redo log的部分看懂了,binlog掌握是轻松的,跟着我的思路,我们继续binlog~
  前边讲过,redo log是InnoDB引擎特有的日志,是引擎层面的日志,而在我们的数据库的Server层面,也有自己的日志,称为binlog(归档日志)。
  binlog是逻辑日志,怎么样来理解这个 逻辑日志 呢?
  我们通过查看一段binlog来理解。 理解逻辑日志
  这里一大段的操作,都是为了查看binlog文件里边存储的是什么内容,熟悉的读者可以直接略过。
  执行命令,写入新binlog文件,不让之前的逻辑影响。
  执行一次flush logs命令行,就会在data目录下新增一个mysql-bin.00000x文件 ## 登陆MySQL命令行 mysql -uroot -p ## 刷新binlog flush logs; ## 确认刷新binlog成功 show master status; ## 查询binlog日志位置  show variables like"log_bin%";
  data目录下的mysql-bin文件
  测试数据 ## 创建表 CREATE TABLE `User`  (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(10) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NOT NULL,   `age` int(11) UNSIGNED NOT NULL,   PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;  ## 新增 INSERT `User` VALUES("1", "张三", 18); INSERT `User` VALUES("2", "李四", 20); ## 修改 DELETE FROM `User` WHERE id = 1;
  执行语句截图
  翻译binlog二进制文件 sudo /usr/local/mysql/bin/mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000006 > mysqlbin.sql
  binlog翻译
  这是翻译出来的sql文件,是因为我在 mysqlbinlog -v  参数加工而成的。
  由此可知,逻辑日志里边就是记录着sql语句,通过sql语句记录着逻辑的变化,比如insert, update等动作,但不是记录具体数据,那个由物理日志完成。 与redo log的区别redo log是innoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都能使用; redo log是循环写的,空间固定会用完;binlog是追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。 binlog写入策略
  通过与redo log的区别,我们知道,binlog是追加写入的,所以与redo log写入相比,没有擦除的概念。那么,还有一些什么样的其他的区别呢?
  binlog的写入逻辑比较简单:事务执行过程中,先把日志写到binlog cahce,事务提交的时候,再把binlog cache写到binlog文件中(落盘)。
  binlog写入
  从上图可以看到,每个线程都有自己的binlog cache,但是共用同一份binlog文件。
  图中的write,指的就是把日志写入到数据库系统的page cache,并没有把数据持久化到磁盘,所有速度很快;
  图中的fsync,才是将数据持久化到磁盘的操作。
  write 和 fsync 的时机,是由参数 sync_binlog 控制的:
  sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
  sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;
  sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync。 因此,在出现 IO 瓶颈的场景里,将 sync_binlog 设置成一个比较大的值,可以提升性能。在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。
  但是,将 sync_binlog 设置为 N,对应的风险是:如果主机发生异常重启,会丢失最近 N 个事务的 binlog 日志。
  引用《极客时间MySQL45讲》  浅谈两阶段提交
  这里讲的两阶段提交,就是纯粹的指redo log和binlog日志的两阶段提交。
  而两阶段提交的目的就是让redo log和binlog两个日志逻辑上一致。
  如果redo log持久化并进行了提交,而binlog未持久化数据库就crash了,则从库从binlog拉取数据会少于主库,造成不一致。因此需要内部事务来保证两种日志的一致性。 两阶段提交步骤
  两阶段提交 将语句执行 记录redo log,并将记录状态设置为prepare 通知Server,已经修改好了,可以提交事务了 将更新的内容写入binlog commit,提交事务 将redo log里这个事务相关的记录状态设置为commited
  prepare:  redolog写入log buffer,并fsync持久化到磁盘,在redolog事务中记录2PC的XID,在redolog事务打上prepare标识
  commit:  binlog写入log buffer,并fsync持久化到磁盘,在binlog事务中记录2PC的XID,同时在redolog事务打上commit标识 其中,prepare和commit阶段所提到的"事务",都是指内部XA事务,即2PC恢复步骤
  redolog中的事务如果经历了二阶段提交中的prepare阶段,则会打上prepare标识,如果经历commit阶段,则会打上commit标识(此时redolog和binlog均已落盘)。 按顺序扫描redolog,如果redolog中的事务既有prepare标识,又有commit标识,就直接提交(复制redolog disk中的数据页到磁盘数据页) 如果redolog事务只有prepare标识,没有commit标识,则说明当前事务在commit阶段crash了,binlog中当前事务是否完整未可知,此时拿着redolog中当前事务的XID(redolog和binlog中事务落盘的标识),去查看binlog中是否存在此XID 如果binlog中有当前事务的XID,则提交事务(复制redolog disk中的数据页到磁盘数据页) 如果binlog中没有当前事务的XID,则回滚事务(使用undolog来删除redolog中的对应事务)
  可以将mysql redolog和binlog二阶段提交和广义上的二阶段提交进行对比,广义上的二阶段提交,若某个参与者超时未收到协调者的ack通知,则会进行回滚,回滚逻辑需要开发者在各个参与者中进行记录。mysql二阶段提交是通过xid进行恢复。
  原文:https://mp.weixin.qq.com/s/M5CXNhMEh2QCLZp59HsSbA

问道手游平民玩家如何打塔顶很多道友通天塔已经通关可是打不了塔顶,小编就来聊聊这个塔顶要怎么打。首先队伍必须有水跟木,水可以拉防木拉血,玩过问道的道友多清楚要是有一个火最好了,毕竟火可以拉速度。组队打塔没火和王者荣耀S25赛季末双排上分推荐哈喽大家好,我是今天必要锻炼,转眼就到了2021年的年底,S25赛季呢也到了赛季末,小编在这里想问问大家是否。上到了自己想要的段位呢,如果没有,那小编今天就为大家带来S25赛季末双战舰世界新老舰长都实用的攻略,做到这些立于不败之地最近军事题材游戏战舰世界将放出大动作,12月14日将举办战舰世界日活动,将会邀请一众知名军事专家科普军舰知识,更是邀请到了南昌舰舰长实地教学如何开军舰。之后的12月15日,战舰世界让人欲罢不能的硬核游戏!人气高难度游戏TOP10评选相信很多玩家都有接触过超高难度的硬核游戏,以黑暗之魂系列为首地下冒险魔界村等作都因高难度而为人熟知,虽然很难,但还是让人欲罢不能沉迷其中。近日日网投票评选出了人气高难度游戏TOP1游戏王卡图故事9个版本的黑魔导卡牌,哪个是你喜欢的?黑色魔术师(黑魔导)作为初代决斗王武藤游戏的王牌怪兽可以说是非常的受到牌佬们的中意。再加上动漫的埃及篇中,高桥和希先生还让三千年前忠义无双的马哈德与黑魔导进行了融合,更进一步升华了轰隆隆大作战酷似弹弹堂,差评如潮,玩家要把所有游戏都兼容吗阿浩的游戏研究室,一心只为研究而生。王者最近上线了一个新的游戏模式,那就是轰隆隆大作战。或许有的小伙伴已经在其中体验过,并且拿到过第一名。其实王者最近很喜欢推出这种特别的小模式,所游戏王卡牌中偷工减料的行为,换了颜色就变为新怪兽之八今天继续为大家介绍游戏王中换了颜色变为新怪兽的卡牌,好了废话不多说,直奔主题。披着黑色披风装模作样的怪盗魅惑的怪盗,其攻击方式是挥动手中的手杖迷惑对方,然后出奇制胜地攻击。换了颜色游戏荒,电脑端大型游戏有哪些推荐?电子游戏作为第九艺术已经诞生多年了,同时它也在伴随着软硬件的进化而不断的进化,今天就来推荐几款电脑端的大型游戏。既然提到大型游戏那就不得不提到近些年来的枪车球代表游戏GTA5了,作王者荣耀神秘商店刷出哪款皮肤需要毫不犹豫立即购买?大家好,这里是逼格游戏。近期王者荣耀的神秘商店又再次开启。很多的小伙伴们都纷纷的去抽取属于自己的专属折扣。有不少小伙伴都抽到了五折六折这样的低价,可以随心的购买自己想要的英雄和皮肤刺激战场里面最实用的5种上梁术,都是干货,建议收藏!刺激战场海岛地图里面有很多的房子,每一种房子都有自己的特点,有的房子大,有的房子小,有的房子可以爬楼顶,有的房子不可以爬楼顶等等。下面龙百万和小伙伴们介绍一下光子隐藏在海岛的5种上那些值得游玩的最终幻想系列游戏最终幻想从1987年发售至今,已经走过了30多个年头。期间诞生了一大批经典的系列游戏。今天,我们就来盘点一下,那些值得游玩的最终幻想系列游戏。最终幻想零式一开始,这是作为psp末期
怎么看待花钱买盗版单机游戏的人?淘宝25元买了2000G的游戏,都是盗版。玩了快80个小时的奥德赛,别的没怎么玩。现在是有些后悔没买正版的了,因为有些东西是正版才有的,比如线上的任务。我也是因为CF给表弟玩被封了超级养老休闲的狩猎游戏,让你体验真实的打猎氛围有没有一款能玩不腻的游戏?有没有一款不氪金,不费脑子的养老游戏?有没有一款超休闲,能和队友一起玩的游戏?有没有一款慢节奏,风景好的游戏?有的!今天给大家说的这款游戏早在2017年我部落冲突升王阶段用啥阵容?雷龙流很强,哥布林可获取大量资源在部落冲突手游中,4位英雄角色的等级越高,升级所需的时间就越长,并且在升王的这段时间内玩家是使用不了这4位英雄角色了,但这样一来的话玩家的输出能力就会有所下降,那么游戏中有哪些不需一篇文章告诉你谁不怕金蝉控制,猴子不愧亲儿子,这射手天克金蝉子已经上王者峡谷了,大家有被金蝉一技能的紧箍咒克制到吗?不得不说,紧箍咒真的是一神技,克制李白,韩信,阿离等所有位移英雄。大家就可能好奇,有什么可以解除金蝉的控制?庄周的大招解部落与弯刀免费版部落与弯刀免费版是一款策略冒险类型角色扮演游戏,由汉家松鼠制作发行,游戏采用了手绘风格的游戏画面,2D的画面十分精美,游戏元素非常多,许多方面都有着令人眼前一亮的感觉。游戏的背景设光遇玩家太惨了,花了95根蜡烛,全是绿色的尾焰?光遇玩家太惨了,花了95根蜡烛,全是绿色的尾焰?前言大家好,我是林克。每日分享游戏电竞情报攻略玩法等。林克想问大家一件事,你们都换了彩虹屁了吗?林克三个号,就换了一个,结果并不如意剑网三中的灵魂画手众所周知,剑网三有个业务,就会给手绘图寻找原图或者外观商品这些,但一般给手绘图的很少有专业画手,就算有,一个在记忆中消失了很久的东西,留下的印象也很模糊,画出来的东西基本上除了能认传奇3复古手游,1。45神舰传说说到传奇,我们其实对这个游戏并不陌生,因为他经历了两个火爆时期。在游戏公测中有着超高的热度,这一阶段是7080甚至90都是众所周知的,而第二阶段则是那些互联网上的洗脑广告。是兄弟,DNF这两个职业迎来重生!技能大改角色调整阿修罗平打攻击冲刺攻击跳跃攻击攻击力10增加。裂波斩新增波动刻印习得后,对无法抓取的敌人攻击判定成功时,会生成波动环的功能。(决斗无效)攻击力10。2增加。波动刻印波动剑气R星命运多舛!GTA三部曲全部源代码惨遭泄露侠盗猎车手三部曲终极版的首发可谓是命途多舛,首先游戏遭遇了严重的性能表现问题,在PC和主机上帧数非常拉胯然后,PC版游戏因启动器维护无法游玩,遭R星下架接着游戏惨遭破解最后,媒体评LOL手游高端局常见的四个下路组合,双排上分的不二之选哈喽,大家好,我是栗原解说,每天都会带来不同的游戏资讯和攻略。前言在英雄联盟手游中,下路组合是很重要的,一个好的组合能够决定线上的优势,这些组合也不是随便乱组的,都是通过几千场,几