MySQL八股学习记录6-日志from小林coding

这篇具有很好参考价值的文章主要介绍了MySQL八股学习记录6-日志from小林coding。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL日志分类

  • undo log:InnoDB存储引擎层生成的日志,实现事务中的原子性,主要用于事务回滚和MVCC
  • redo log:InnoDB存储层生成的日志,用于事务的持久化,用于掉电等故障恢复
  • binlog:server层生成的日志,用于数据备份和主从复制

undo log

执行一条增删改语句的时候,不显式的输入begin和commit开启事务,MySQL也会隐式的开启事务来执行增删改语句
一个事务在执行的过程中,没有提交事务前,MySQL发生崩溃,如何回滚->undo log,保证事务ACID特性中的原子性

  • 在插入一条记录时,要把这条记录的主键值记录下来,回滚时删除对应的记录即可
  • 删除时,把记录全部记录下来,回滚时,将这些内容插入到表中即可
  • 更新一条记录时,旧值记录下来即可
    一条记录每一次更新产生的undo log都有一个roll_pointer指针和一个trx_id事务id
  • 通过trx_id可以知道记录是被哪个事务修改的
  • 通过roll_pointer可以将undo log串成一个链表
    MySQL八股学习记录6-日志from小林coding,mysql,学习,数据库
    undo log的两大作用:
  • 实现事务回滚,保障事务的原子性
  • 实现MVCC

Buffer Pool

MySQL的数据存放在磁盘中,为了提升数据库的读写性能,InnoDB设计了一个缓冲池
MySQL八股学习记录6-日志from小林coding,mysql,学习,数据库
MySQL在启动的时候,InnoDB会为Buffer Pool申请一篇连续的内存空间,按16KB的大小划分出一个个页,Buffer Pool中的页就叫缓存页
MySQL八股学习记录6-日志from小林coding,mysql,学习,数据库

redo log

buffer pool提高了读写性能,但是Buffer Pool是基于内存的,内存是不可靠的,为了防止断电导致的数据丢失问题,当有一条记录更新的时候,将对页的修改写道redo log中,这称为WAL技术(Write-Ahead logging)技术.因此,事务提交的时候,只需要将redo log持久化到磁盘即可,redo日志记录的内容是对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量的地方做了AAA 更新

binlog

undo log和redo log两个日志都是InnoDB存储引擎生成的,binlog则是MySQL的server层实现的日志

redo log 和undo log有什么区别

  • 适用对象不同:binlog是MySQL的server层实现的日志,所有的存储引擎都可以使用,redo log 是InnoDB存储实现的日志
  • 文件格式不同:binlog三种格式STATEMENT,ROW,MIXED
  • 写入方式不同:binlog是追加写,写满一个文件,就创建一个新的文件继续写,不会覆盖以前的日志,redo log是循环写
  • 用途不同,binlog用于备份,主从复制,redolog用于掉电等故障恢复

主从复制是如何实现

主从复制依赖binlog,记录MySQL上的所有变化并且以二进制形式保存在磁盘上,复制过程就是将binlog中的数据从主库传输到从库上
主从复制三个阶段

  • 写入binlog:主库写binlog日志,提交事务,更新本地存储
  • 同步binlog:把binlog复制到所有的从库上,每个从库把binlog写到暂存日志中
  • 回放binlog:回放binlog,更新存储引擎中的数据

update语句执行过程

  1. 执行器调用存储引擎的接口,查看是否在buffer pool中,不在的情况下,先读到bufferpool中
  2. 执行器得到聚簇索引后.看更新前和更新后的数据是否相同,相同不再往下执行
  3. 开启事务,InnoDB更新前,先更新undo log,并且记录对应的redo log
  4. InnoDB层开始更新,先更新内存,再将记录写到redo log上,自此一条记录更新完毕
  5. 更新完之后,记录语句对应的binlog,此时记录的binlog被保存到binlog cache,在事务提交时才将该事务的所有binlog刷新到磁盘
  6. 事务提交,两阶段更新

为什么需要两阶段提交

为了保证redolog和binlog这两个独立的log日志之间的逻辑日志一致
MySQL八股学习记录6-日志from小林coding,mysql,学习,数据库文章来源地址https://www.toymoban.com/news/detail-582328.html

到了这里,关于MySQL八股学习记录6-日志from小林coding的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python的日志模块学习记录

    1.导入 2.配置日志配置项(基本配置一般不能满足需要,一般使用字典配置如下) 此基础配置的日志打印格式示例 3.调用配置,是日志配置生效 4.打印日志

    2024年02月06日
    浏览(42)
  • 【MySQL学习】MySQL的慢查询日志和错误日志

    ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人主页:xiaoxieʕ̯

    2024年04月11日
    浏览(52)
  • P02项目诊断报警组件(学习操作日志记录、单元测试开发)

    ★ P02项目诊断报警组件 诊断报警组件的主要功能有: 接收、记录硬件设备上报的报警信息。 从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略,结合当前的报警情况对设备下发报警指示。 将报警消息发送到消息队列,由其它组件发送给前端。 从消息队列

    2024年02月04日
    浏览(43)
  • 【Spring Boot 源码学习】ConditionEvaluationReport 日志记录上下文初始化器

    《Spring Boot 源码学习系列》 上篇博文《共享 MetadataReaderFactory 上下文初始化器》, Huazie 带大家详细分析了 SharedMetadataReaderFactoryContextInitializer 。而在 spring-boot-autoconfigure 子模块中预置的上下文初始化器中,除了共享 MetadataReaderFactory 上下文初始化器,还有一个尚未分析。 那么

    2024年04月13日
    浏览(41)
  • C++八股记录

    C++内存管理         C++中,内存分成 5 个区。          栈: 函数内局部变量;自动管理,效率高,但空间较小;         堆: new分配的内存块;手动管理,效率低,但空间大;         自由存储区: malloc分配的内存块;         静态/全局存储区: 全局变

    2024年02月10日
    浏览(30)
  • ubuntu 18 intall HDF5 from source code

    edit: kleenelan@kleenelan-Workstation:~/software/hdf5-1.8.10$ grep -rn LL::   tools/h5dump/h5dump_ddl.c:1344:    /*LL:: attr_name = attr + j + 1; tools/lib/h5tools_str.c:635:/*LL::    ctx-need_prefix = 0;*/ test/th5s.c:733:        /*LL:: ret = H5Pset_alloc_time(plist_id, alloc_time); install HDF5:

    2024年02月13日
    浏览(42)
  • MySQL学习问题记录

    step1:建表 表项信息: 写入数据顺序id为10 2 7 1。查寻时返回记录顺序为1 2 7 10? 更新一条数据后仍然按照主键id排序显示查询结果 查看当前建表信息,发现MySQL有默认的一个查询规则,受该规则影响,查询结果按照主键的顺序排序显示。

    2024年02月09日
    浏览(38)
  • MySQL学习记录

    一、基础查询 /* 语法 : 特点 : 1、查询列表可以是字段、常量、表达式、函数,也可以是多个 2、查询结果是一个虚拟表 */ 1、查询表中单个字段 2、查询表中多个字段 3、查询表中所有字段 4、查询常量值 #注意:字符型和日期型常量值须用单引号引起来 5、查询表达式 6、查

    2024年02月13日
    浏览(29)
  • MySQL 学习记录 1

    原文:https://blog.iyatt.com/?p=12631 去年年初报考 3 月的计算机二级(C 语言)【https://blog.iyatt.com/?p=9266 】考过了,这次打算报考 3 月的计算机三级(数据库)。数据库这一块,很久之前用过 SQLite,基本没怎么深入学习。准备现学 MySQL,主要是面向应用目的,顺带后续结合开发。

    2024年02月21日
    浏览(35)
  • 个人学习记录——MySQL的模糊查询

    模糊查询实质上是用利用数据库SQL语言的模糊搜索,如‘like’,通配符‘%’,‘_’。 但我后来了解到还有‘[]’和\\\'[^]\\\'的用法,特此记录 1 “%” 表示0个或多个字符 Select * from 表名 where 列名 like \\\'%\\\' //查询出全部数据  Select * from 表名 where 列名 like \\\'x\\\' //完全匹配 Select * fro

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包