第二讲日志系统

爱饮凉水 爱饮凉水     2022-11-30     392

关键词:

redo log (引擎层)

InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB

image
write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

write pos和checkpoint之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

binlog(Server层)

三点不同:

  • redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
  • redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
  • redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

update语句流程

image

  1. 执行器先找引擎取ID=2这一行。ID是主键,引擎直接用树搜索找到这一行。如果ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的binlog,并把binlog写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成。

崩溃恢复规则

redo log 和 binlog 有一个共同的数据字段,叫 XID。崩溃恢复的时候,会按顺序扫描 redo log:

  • 如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;
  • 如果碰到只有 parepare、而没有 commit 的 redo log,就拿着 XID 去 binlog 找对应的事务。
    • binlog无记录,回滚事务。
    • binlog有记录,提交事务。

由此得出,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

  • 先写redo log后写binlog。假设在redo log写完,binlog还没有写完的时候,MySQL进程异常重启。由于我们前面说过的,redo log写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行c的值是1。但是由于binlog没写完就crash了,这时候binlog里面就没有记录这个语句。因此,之后备份日志的时候,存起来的binlog里面就没有这条语句。然后你会发现,如果需要用这个binlog来恢复临时库的话,由于这个语句的binlog丢失,这个临时库就会少了这一次更新,恢复出来的这一行c的值就是0,与原库的值不同。
  • 先写binlog后写redo log。如果在binlog写完之后crash,由于redo log还没写,崩溃恢复以后这个事务无效,所以这一行c的值是0。但是binlog里面已经记录了“把c从0改成1”这个日志。所以,在之后用binlog来恢复的时候就多了一个事务出来,恢复出来的这一行c的值就是1,与原库的值不同。

第二讲:编码详解,防止中文乱码

编码详解编码支持: ASCII编码:美国信息交换标准代码(AmericanStandardCodeforInformationInterchange,简称ASCII)是一种用于信息交换的美国标准代码,它的作用是给英文字母、数字、标点、字符转换成计算机能识别的二进制数规定... 查看详情

第二讲:工厂方法模式

  查看详情

20170514第二讲

1、www.bejson.com在线json格式校验工具2、关联两种方式:正则表达式和jsonpath 名称+$.3、charles抓包工具,获取接口请求方式、response、cookies和报文等信息,方便进行测试 连接手机端:proxysetting 获取电脑的ip修改手机操作... 查看详情

第二讲python编程基础

2.1python介绍2.1.1什么是PythonPython是一门面向对象,解释型的动态类型的脚本编程语言,有GuidovanRossunm于1989年发明,第一个公开发行版发行于1991年;【开源免费、通用型】GuidovanRossunm#吉多·范罗苏姆荷兰计算机程序员 查看详情

第二讲网络侦查技术概述笔记

主要从三个方面对网络侦查技术景象了学习,侦查的目的、侦查的目标以及侦查的方法(主要是通过搜索引擎),网络信息的探测的三种手段——Goolehacking、社工库和公共互联信息。  查看详情

spring繁华的aop王国---第二讲(代码片段)

Spring繁华的AOP王国---第二讲SpringAOP的织入如何与ProxyFactory打交道1.基于接口的代理2.基于类的代理3.Introduction的织入看清ProxyFactory的本质ProxyConfigAdvisedAdvisedSupportProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系小结容器中的织入器---P... 查看详情

视觉slam十四讲笔记--第二讲

第二讲:课后题1.阅读文献[1]和[14],你能看懂其中的内容吗?文献1:Asurveyofmonocularsimultaneouslocalizationandmapping可以从百度学术上自行下载本文献是一篇SLAM的综述,首先从AR(Augmentedreality增强现实)切入&... 查看详情

ptyhon学习第二讲

第二讲、成绩的输入成绩的分布和判断,有人会问我,为啥input语句输入要用int去括起来呢?很明显,跟我上面第一讲说的,input输入的都是为字符型str,那么str怎么去和身为整数型的int数字去比较呢?那么只能去转化为整数型in... 查看详情

c#结构化编程基础(金老师编程课第二讲)(代码片段)

变量(variable)和数据类型(DataType)变量就是一块内存地址的别名(利用变量名找到对应的一块虚拟内存),不直接使用内存地址的编码,因为不同的计算机硬件或者计算机操作系统存取数据的方式不同。声明变量即为开设一个虚... 查看详情

第二讲pytorch使用(代码片段)

...首页向下找到如下页面进行选择第一行推荐选择稳定版本第二行根据系统性进行选择第三行windows系统选择conda并且要有anaconda,linux系统选择pip第四行根据自己情况选择,我使用的是python3.9版本第五行要先知道自己是GPU还是集显... 查看详情

病毒分析第二讲,分析病毒的主要功能

---恢复内容开始---             病毒分析第二讲,分析病毒的主要功能经过昨天病毒分析第一讲,得出一个被注入的DLL开始分析DLL主要功能PS:IDA中,DLL会有各种初始化的代码,和释放资源,所以不再看,只看重要的API一丶... 查看详情

word第二讲(0806)

word里的长度单位绝对长度单位(厘米,英寸)相对长度单位(字符,像素)样式问题:如何设置多个部分的格式多次选择,多次设置多次选择,一次设置应用格式刷(ctrl+shift+c,ctrl+shift+V)应用样式什么是样式格式的集合,包括字体、... 查看详情

跟我学《javascript高程3》第二讲,课程笔记

跟我学《JavaScript高程3》第二讲:第3章课程制作:bling,兴哥,5年Java,3年前端课程知识:JavaScript、Html、Css课程目标:前端体系课程,逐步深入,找到一份前端工作课程大纲:本书目录结构适合人群:前端初学者,可以0基础,... 查看详情

第二讲:我的第一个驱动

原文:http://blog.csdn.net/caperingrabbit/article/details/5285288 配置好了开发环境之后,下面就要通过具体的程序来了解驱动的开发了。下面我们以一个WDM驱动的框架来实现Windows驱动程序的HelloWorld。作为一个驱动程序,首先应该写的... 查看详情

vio第二讲_allen方差工具(代码片段)

1,首先,安装ceres依赖项,见高博14讲116页,然后下载编译安装ceres:gitclonehttps://github.com/ceres-solver/ceres-solvercdceresmkdirbuildcdbuildcmake..makesudomakeinstall2,下载编译cd~/catkin_ws/srcgitclonehttps://github.com/gaowenl 查看详情

深度学习大讲堂首期第二讲:深度学习简史

 主要内容:1.深度学习的基本概念2.深度学习的代表性技术3. 深度神经网络的三起两落的脉络,以及其中关键的工作第一部分:深度学习引导第二部分:深度学习简史  查看详情

spark第二讲scala简介(代码片段)

一.Scala简介    Scala 是 ScalableLanguage 的简写,是一门多范式的编程语言,由联邦理工学院洛桑(EPFL)的 MartinOdersky 于2001年基于 Funnel 的工作开始设计,设计初衷是实现可伸缩的语言,集成面向对象编程和... 查看详情

java循环结构第二讲

一、什么是for循环结构循环语句的主要作用是反复执行一段代码,直到满足一定的条件为止。循环结构可以分为四个部分:1.初始部分:设置循环的初始状态。2.循环体:重复执行的代码。3.迭代部分:下一次循环开始前要执行的... 查看详情