MySQL学习笔记-redo log 和 binlog&两阶段提交

简介: MySQL学习笔记-redo log 和 binlog&两阶段提交

前面学习了一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎,而一条更新语句的执行流程也会按照查询查询语句的流程走一遍,但更新语句会涉及到两个日志模块,分别是 redo logbinlog,这篇文章学习一下这两个日志的作用。

1.笔记图

2.一条更新语句是如何被执行的


  • 连接器:负责跟客户端建立连接、获取权限、维持和管理连接
  • 分析器
  • 词法分析:识别出 SQL 语句里面的字符串分别代表什么,把 SQL 语句中字符串 T 识别成“表名 T,把字符串 ID 识别成 列 ID
  • 语法分析:根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法
  • 优化器:优化器是在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联 (join) 的时候,决定各个表的连接顺序
  • 执行器:调用存储引擎提供的接口

3.redo log

  • WAL(Write-Ahead Logging):先写日志,再写磁盘
  • 当有记录需要更新时,InnoDB 引擎就会先把记录写到 redo log,并更新内存,这时更新就算完成
  • InnoDBredo log 是固定大小的,可以配置为一组 4 个文件,每个文件的大小是 1GB,从头开始写,写到末尾就又回到开头循环写

Tips:write pos 表示当前记录的位置,写到第 3 号文件末尾后就回到 0 号文件开头,checkpoint 表示当前要擦除的位置,擦除记录前要把记录更新到数据文件


  • 如果 write pos 追上 checkpoint,表示 redo log 满了,这时不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下
  • crash-safeInnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失

4.binlog

       MySQL Server 层也有自己的日志,称为归档日志 (binlog)binlog 日志只能用于归档

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

5.为什么要有两份日志?

  • 最开始 MySQL 里并没有 InnoDB 引擎,MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档
  • InnoDB 是另一个公司以插件形式引入 MySQL 的,使用另外一套日志系统 redo log 来实现 crash-safe 能力

6.更新语句内部执行流程

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

7.两阶段提交

  • 怎样让数据库恢复到半个月内任意一秒的状态?
  • 首先,找到最近的一次全量备份,从这个备份恢复到临时库
  • 从备份的时间点开始,将备份的 binlog 依次取出来,重放想要恢复的那个时刻
  • 反证法说明两阶段提交:假设执行 update 语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?
  • 先写 redo log 后写 binlog:假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启,由于 binlog 没写完就 crash 了,如果用 binlog 来恢复临时库的话,与原库的值不同
  • 先写 binlog 后写 redo log:如果 binlog 写完之后 crashredo log 还没写,崩溃恢复以后这个事务无效,恢复出来的这一行与原库的值不同,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
363 6
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
993 23
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
数据库 文件存储 数据安全/隐私保护
YashanDB redo日志文件管理
YashanDB的redo日志文件用于记录数据库物理日志,支持宕机重演和主备复制。 redo日志有4种状态:NEW(新创建)、CURRENT(当前写入)、ACTIVE(未归档或未写盘)和INACTIVE(可复用)。可通过V$LOGFILE视图或直接查看$YASDB_DATA/dbfiles目录来管理redo日志。此外,支持添加、切换和删除redo日志以优化性能或应对磁盘故障等情况,但需注意仅能删除INACTIVE或NEW状态的日志以确保数据安全。
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
2087 0
|
11月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
639 158
|
11月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1712 152
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1137 156
|
11月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
748 156

推荐镜像

更多