Mysql 数据恢复逻辑 基于binlog redolog undolog「建议收藏」

Mysql 数据恢复逻辑 基于binlog redolog undolog「建议收藏」注:文中有个易混淆的地方"事务" sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态。 日志持久化事

Mysql 数据恢复逻辑 基于binlog redolog undolog

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

  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实际的日志。

redolog日志

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. binlog写盘并存储xid,2PC事务标记已提交,redolog事务提交。

崩溃恢复

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

数据恢复流程 基于binlog redolog undolog

image

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

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

原文地址:https://www.cnblogs.com/soker/archive/2022/07/27/16525546.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4956.html

(0)
上一篇 2023-05-28
下一篇 2023-05-29

相关推荐

  • Python中使用字典实现高效查找

    Python中使用字典实现高效查找Python中的字典是一种无序的、可变的、可迭代的数据类型。字典中的元素都是用键值对的形式来表示,每个键值对之间用冒号隔开,不同的键值对之间用逗号隔开,整个字典需要用花括号{}来包裹。

    2023-12-29
    68
  • MySQL数据库:基本操作及增删改查语句「建议收藏」

    MySQL数据库:基本操作及增删改查语句「建议收藏」基本语法&&操作语句 create(创建) alter(更新) drop(删除) 一次性删除一个表中所有的数据 包括日志 truncate table 表名; 选中或者使用该数据库 说明接下来的操作都

    2022-12-21
    92
  • mysql 所有版本国内资源下载地址不一样_MySQL最新版本

    mysql 所有版本国内资源下载地址不一样_MySQL最新版本mysql 所有版本 国内资源下载地址 http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/

    2023-03-15
    113
  • Python中write()的用法和实例整理

    Python中write()的用法和实例整理Python中的write()方法是文件对象的一种方法,它可以向文件中写入字符串或字节流。在文件对象被创建后,用write()方法向其中写入的内容会原封不动地保存到磁盘上。

    2024-01-21
    56
  • mongodb常用函数_15个常用excel函数公式

    mongodb常用函数_15个常用excel函数公式
    use mock # 切换数据库 show collection # 列出所有的表 db.orders.findOne() # 查询orders表中第一个 …

    2023-04-09
    102
  • 自然语言处理:让Python更智能的能力

    自然语言处理:让Python更智能的能力自然语言处理(Natural Language Processing,简称NLP)是计算机科学、人工智能和语言学等学科交叉的一门技术。它致力于使计算机能够理解、分析、处理人类语言。在这一过程中,Python已经成为了一种不可或缺的编程语言。Python的简洁性和功能强大的库,如nltk、spaCy和gensim等,使其成为了处理自然语言的首选语言。以下从选取语料、分词、词性标注、命名实体识别、情感分析等方面阐述NLP在Python中实现的方法和技巧。

    2024-02-24
    58
  • Python字典:快速查找和操作数据的利器

    Python字典:快速查找和操作数据的利器Python是一门强大的编程语言,具有丰富的数据类型和数据结构,其中最常用的之一就是字典(dictionary)。字典是一个可变、无序的集合,它的元素是键值对(key-value pairs),可以通过键来快速访问对应的值。字典在数据处理、网络爬虫、机器学习等领域中都有广泛的应用。在本文中,我们将从多个方面深入探讨Python字典的使用方法和技巧。

    2024-01-31
    52
  • Sqlite—修改语句(Update)[通俗易懂]

    Sqlite—修改语句(Update)[通俗易懂]SQLite 的 UPDATE 语句用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。 基本语法:UPDATE table_name S

    2022-12-25
    112

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注