MySQL 插入一条 SQL 语句,redo log 记录的内容

在 MySQL 的 InnoDB 存储引擎中,redo log(重做日志)主要用来保证事务的持久性和崩溃恢复能力。redo log 记录的是对数据页的物理变更,而不是 SQL 语句本身。

当执行一条插入语句时,redo log 的记录主要包括对数据页的修改信息,以及事务相关的元数据。以下是 redo log 在执行插入操作时的详细记录过程。


redo log 的核心作用

  1. 崩溃恢复:在数据库崩溃后,通过 redo log 恢复事务已提交但未写入磁盘的数据。
  2. 事务提交持久性:redo log 提供持久化保障,即使数据尚未完全刷入磁盘,也可以通过 redo log 恢复数据。

redo log 的记录内容

假设执行如下插入语句:

INSERT INTO users (id, name, age) VALUES (1, 'Alice', 30);

redo log 会记录以下内容:

  1. 事务元信息:

    • 事务开始(BEGIN)。
    • 事务结束(COMMIT 或 ROLLBACK)。
  2. 页修改操作:

    • 记录被修改的页(page)的编号和偏移量。
    • 修改的内容(如插入了哪些记录、更新了哪些数据)。
    • 仅记录具体的物理变更,而不是 SQL 语句本身。
  3. 日志类型:

    • 分为 PREPARE(事务准备阶段)和 COMMITTED(事务提交阶段)。
  4. 顺序性保证:

    • redo log 按顺序记录,以保证崩溃恢复时能按正确顺序重放日志。

redo log 的记录过程

  1. 事务开始:

    redo log 写入事务开始的记录。

  2. 内存中的数据页变更:

    • 修改页被加载到内存中(称为缓冲池)。
    • 在缓冲池中对数据页进行修改,同时将变更写入 redo log。
  3. redo log 持久化:

    • 事务提交时,先将 redo log 刷入磁盘(称为 "刷盘")。
    • 此时,即使数据页尚未写回磁盘(即未同步到表空间文件),也能通过 redo log 恢复。
  4. 事务提交:

    • redo log 记录事务提交的标志,表示事务完成。

示例 redo log 记录内容

以上述 INSERT 语句为例,redo log 的记录内容可能类似如下:

  1. 事务开始标志(BEGIN)。
  2. 修改第 N 页某位置的数据:
    • 在页的某个偏移量插入了一条记录(如用户 ID 为 1 的记录)。
    • 页的元数据(如记录计数、空闲空间等)发生了相应更新。
  3. 事务提交标志(COMMIT)。

总结

  • redo log 记录的是物理层面的数据页变更,而不是 SQL 语句或逻辑操作。
  • 其设计目标是通过最小化写操作的开销来提高性能,同时提供崩溃恢复的能力。
  • redo log 的记录过程遵循 WAL(Write-Ahead Logging) 原则,即先写日志,再更新数据。

MySQL 插入一条 SQL 语句,redo log 记录的是什么?的更多相关文章

  1. 一条SQL语句求前面记录的平均值

    有算法要求如下: For (i=1,i<=10,i++) { ta[i] = (t[1] + t[2] + ... + t[i]) / i; } 用一条SQL语句实现它: 分别用表变量 @ta ...

  2. nodejs mysql 执行多条sql语句

    执行多条查询语句 为了安全起见,默认情况下是不允许执行多条查询语句的.要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能: var connection = mysql.createC ...

  3. Yii查看(输出)当前页面执行的sql语句(log记录)

    在Yii框架下查看当前页面执行的所有sql语句的方法,主要是通过配置相关文件来达到调试sql的目的,具体方法如下: (1)修改 index.php 开启调试模式 在 index.php 文件内增加如下 ...

  4. 一次性插入多条sql语句的几种方法

    第一种:通过 insert select语句向表中添加数据 从现有表里面把数据插入到另外一张新表去前提必须先有test_2表的存在,并且test_2表中的列的数据类型必须和test表里面列的数据类型一 ...

  5. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  6. 一条 SQL 语句在 MySQL 中如何执行的

    一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...

  7. 一条SQL语句在MySQL中如何执行

    一条SQL语句在MySQL中如何执行 本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会 ...

  8. 一条SQL语句在MySQL中是如何执行的

    概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...

  9. mysql基础-- 一条请求执行多条SQL语句

    最近做一个数据库初始化工具的时候发现了这个问题,就是在一个Statement中执行一条SQL语句的时候可以正确执行,如果同时执行多条,就会报SQL语法错误,伤透了脑筋. 经过网上查找,发现有两种解决办 ...

  10. mysql(1)—— 详解一条sql语句的执行过程

    SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...

随机推荐

  1. React中的数据流管理

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 为什么数据流管理重要? React 的核心思想 ...

  2. 设置npm、yarn和pnpm的国内镜像地址和yarn命令相关问题

    1.npm 全局设置: 输入如下命令查看镜像地址: npm config get registry 输入如下命令设置镜像地址为淘宝: // 推荐地址 npm config set registry h ...

  3. 俄罗斯方块-shell脚本写的,学习学习

    #!/bin/bash APP_NAME="${0##*[\\/]}" APP_VERSION="1.0" #颜色定义 iSumColor=7 #颜色总数 cR ...

  4. OI 超几何函数与Gosper算法入门

    前言 据说这个东西是 19~20 初世纪数学研究的重大成果与主要研究方向.但是很可惜,由于世界形势的变化,以德国为中心的的超几何函数.椭圆函数研究开始没落于集中于美国.苏联的数学研究飞向. 第一章 定 ...

  5. Flink同步mysql到iceberg

    一.如何做一致性保障 1.全量数据分片读取,增量数据单并发读取,保证增量阶段不会乱序2.全量阶段写入失败会清空表后重新写入,避免重复数据.3.全量阶段多task并行读取,把每个task开始结束时间提交 ...

  6. Iceberg参数调整

    1.读取参数介绍 属性   默认值   描述 read.split.target-size 134217728 (128 MB) 组合数据输入分割时的目标大小 read.split.metadata- ...

  7. [WC2014] 紫荆花之恋 题解

    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...

  8. Week09_day05(Hbase的安装搭建)

    搭建完全分布式集群 HBase集群建立在hadoop集群基础之上,所以在搭建HBase集群之前需要把Hadoop集群搭建起来,并且要考虑二者的兼容性.现在就以5台机器为例,搭建一个简单的集群. 软件版 ...

  9. springboot项目发布war包

    1:修改pom.xml 将"jar"改为"war" <packaging>war</packaging> 将: <dependen ...

  10. MyCat分库分表-主从

    一.MySQL数据同步 1.主节点配置,log-bin,指定文件名称 2.主节点配置server-id,默认为1 vim /etc/my.cof 在[mysqld]下添加如下配置 log-bin=im ...