注:文中有个易混淆的地方

  1. sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态。
  2. 日志持久化事务,为了保证redolog和binlog的一致性而用的Mysql内部独立维护的2PC提交事务。这个xid只有在redolog和binlog持久化文件中存储。

各日志的存储内容

阅读前提:需要对mysql的数据存储结构有一定了解,即数据页的持久化和内存读取逻辑。

binlog日志

binlog日志存储的是对数据库实际的数据操作,可以理解为存储的所有的数据库更新sql。

mysql默认不开启binlog,binlog主要用于主从同步和与其他数据库的数据共享(通过中间件监听binlog)。

undolog日志

undolog存储的是事务的回滚数据,存储的数据回滚的关键信息。undolog数据存储在undolog表空间中,也是通过数据页的形式存储,和普通的数据页一样,也会不定期的进行持久化。

undolog也通过页存储,有自己独立的表空间,所以undolog记录的时候,旧的undolog可能会被覆盖(当然mysql会保证未提交事务的undolog和用于mvvc的undolog是不会被覆盖的),同时也会生成相应的redolog。有的人理解为redolog里也存储了undolog的日志,其实是不对的,这个日志只是用来恢复undolog表空间的,并不是undolog实际的日志。

redo log日志

redolog存储的是对页结构的更新日志,可以理解为记录了数据页里修改了哪几个字节。用于mysql崩溃后的数据恢复,数据存储在ib_logfile中。

redolog中有一个重要参数即checkpoint_lsn记录了哪些redolog对应的数据页已经持久化了,是数据恢复的一个非常重要的参数。

同时为了保证数据持久化,事务提交时所有的redolog必须持久化,由于多个事务的redolog是可以穿插写入的,这就导致有部分未提交的事务被刷盘了。

redolog和binlog的二阶段提交

redolog和binlog的二阶段提交主要是为了防止系统崩溃时,redolog写完,binlog没有写,导致主从不一致的问题。

innodb维护了一套事务表(注意这里的事务不是mysql的事务,是redolog持久化的事务),redolog和binlog持久化时会生成一个新的事务,并分配一个xid即2PC事务id给这次持久化操作。

持久化流程

  1. redolog写盘并存储xid
  2. undolog写盘并存储xid,2PC事务标记已提交,redolog事务提交。

崩溃恢复

  1. 扫描最后一个binlog文件,提取其中的xid;
  2. InnoDB 维持了状态为Prepare的事务链表,将这些事务的xid和binlog中记录的xid做比较,如果在binlog中存在则提交,不存在则回滚事务。

数据恢复流程 基于binlog redolog undolog

  1. 通过binlog的xid和事务链表中的事务xid比较,找到不存在的事务的xid,去redolog中把这些事务回滚(删除)。
  2. 以checkpoint点的redolog为起点开始恢复数据,即恢复上图checkpoint到binlog之间的redolog数据。
  3. 由于undolog数据页的修改也记录在redolog中,未写盘的undolog数据页也被恢复。
  4. 在undolog表空间中查询中未提交的事务(Sql事务)执行undolog日志进行回滚
  5. 数据恢复完成

参考资料:《MySQL是怎样运行的》及其他网络资料

Mysql 数据恢复流程 基于binlog redolog undolog的更多相关文章

  1. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  2. MySQL系列:基于binlog的增量订阅与消费(一)

    在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...

  3. mysql主丛之基于binlog的不停业务配置主从

    一 环境准备 主:192.168.132.121 从:192.168.132.122 主的数据库上面已经有数据,而且还在不断的写入 mysql> select * from darren.tes ...

  4. MySQL数据库备份还原(基于binlog的增量备份)

    MySQL数据库备份还原(基于binlog的增量备份) 一.简介 1.增量备份      增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味 ...

  5. (4.11)mysql备份还原——mysql闪回技术(基于binlog)

    0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...

  6. 使用binlog,实现MySQL数据恢复

    mysql的binlog日志,用于记录数据库的增.删.改等修改操作,默认处于关闭状态.使用binlog实现数据恢复的条件为 1.binlog日志功能已开启 2.若binlog在数据库创建一段时候后开启 ...

  7. 基于binlog来分析mysql的行记录修改情况(python脚本分析)

          最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...

  8. MySQL基于binlog主从复制

    MySQL复制介绍 默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定 ...

  9. mysql数据恢复,binlog详解

    个人博客:mysql数据恢复,binlog详解 binlog日志恢复数据,是挽救错误操作和数据损坏一根救命稻草,所以认识和使用binglog对于技术人员还是很有必要的 binlog一般用于 主从复制 ...

随机推荐

  1. JUC自定义线程池练习

    JUC自定义线程池练习 首先上面该线程池的大致流程 自定义阻塞队列 首先定义一个双向的队列和锁一定两个等待的condition 本类用lock来控制多线程下的流程执行 take和push方法就是死等, ...

  2. apache tomcat 目录session应用信息漏洞

    Tomcat 是一款开源的 Web 应用服务器软件.Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选. 漏洞描述 apache T ...

  3. drools的类型声明(Type declarations)

    一.背景 在我们编写drl规则的时候,有些时候需要自己声明一些类,用于辅助之后的规则运行,如果需要用到的类还需要在java中预先声明出来,这样就不灵活了,那么是否可以在drl文件中声明一个类呢?可以使 ...

  4. [漏洞复现] [Vulhub靶机] Struts2-045 Remote Code Execution Vulnerablity(CVE-2017-5638)

    免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 Apache Struts 2是美国Apache软件基金会的一个开源项目,是一套用于创建企业级Java W ...

  5. SPPNet(特征金字塔池化)学习笔记

    SPPNet paper:Spatial pyramid pooling in deep convolutional networks for visual recognition code 首先介绍 ...

  6. 差分隐私(Differential Privacy)定义及其理解

    1 前置知识 本部分只对相关概念做服务于差分隐私介绍的简单介绍,并非细致全面的介绍. 1.1 随机化算法 随机化算法指,对于特定输入,该算法的输出不是固定值,而是服从某一分布. 单纯形(simplex ...

  7. Pycharm连接远程服务器并保持文件夹同步

    pycharm版本2021 服务器版本 Ubuntu 18 1.连接远程服务器 xxx这部省略了,因为之前就已经连接上了hh,后面用到再补充. 2.保持文件夹同步 1.首先在本地(windows环境创 ...

  8. Docker打包镜像并上传

    Docker打包镜像并上传 登录 账号 docker login --username=yourusername 密码 yourPassword 推送到仓库 docker镜像打标签 docker ta ...

  9. django框架3

    内容概要 注册登录功能编写 django请求生命周期流程图 路由层相关知识 1.路由匹配 2.无名有名分组 3.反向解析 4.名称空间 5.路由分发 内容详情 注册登录功能编写 1.使用自带的sqli ...

  10. 2021.05.04【NOIP提高B组】模拟 总结

    T1 题目大意, \(S_{i,j}=\sum_{k=i}^j a_k\) ,求 \(ans=\min\{ S_{i,j}\mod P|S_{i,j}\mod P\ge K \}\) 其中 \(i\l ...