MySQL 插入一条 SQL 语句,redo log 记录的是什么?
MySQL 插入一条 SQL 语句,redo log 记录的内容
在 MySQL 的 InnoDB 存储引擎中,redo log(重做日志)主要用来保证事务的持久性和崩溃恢复能力。redo log 记录的是对数据页的物理变更,而不是 SQL 语句本身。
当执行一条插入语句时,redo log 的记录主要包括对数据页的修改信息,以及事务相关的元数据。以下是 redo log 在执行插入操作时的详细记录过程。
redo log 的核心作用
- 崩溃恢复:在数据库崩溃后,通过 redo log 恢复事务已提交但未写入磁盘的数据。
- 事务提交持久性:redo log 提供持久化保障,即使数据尚未完全刷入磁盘,也可以通过 redo log 恢复数据。
redo log 的记录内容
假设执行如下插入语句:
INSERT INTO users (id, name, age) VALUES (1, 'Alice', 30);
redo log 会记录以下内容:
事务元信息:
- 事务开始(
BEGIN
)。 - 事务结束(
COMMIT
或ROLLBACK
)。
- 事务开始(
页修改操作:
- 记录被修改的页(page)的编号和偏移量。
- 修改的内容(如插入了哪些记录、更新了哪些数据)。
- 仅记录具体的物理变更,而不是 SQL 语句本身。
日志类型:
- 分为
PREPARE
(事务准备阶段)和COMMITTED
(事务提交阶段)。
- 分为
顺序性保证:
- redo log 按顺序记录,以保证崩溃恢复时能按正确顺序重放日志。
redo log 的记录过程
事务开始:
redo log 写入事务开始的记录。内存中的数据页变更:
- 修改页被加载到内存中(称为缓冲池)。
- 在缓冲池中对数据页进行修改,同时将变更写入 redo log。
redo log 持久化:
- 事务提交时,先将 redo log 刷入磁盘(称为 "刷盘")。
- 此时,即使数据页尚未写回磁盘(即未同步到表空间文件),也能通过 redo log 恢复。
事务提交:
- redo log 记录事务提交的标志,表示事务完成。
示例 redo log 记录内容
以上述 INSERT
语句为例,redo log 的记录内容可能类似如下:
- 事务开始标志(
BEGIN
)。 - 修改第 N 页某位置的数据:
- 在页的某个偏移量插入了一条记录(如用户 ID 为 1 的记录)。
- 页的元数据(如记录计数、空闲空间等)发生了相应更新。
- 事务提交标志(
COMMIT
)。
总结
- redo log 记录的是物理层面的数据页变更,而不是 SQL 语句或逻辑操作。
- 其设计目标是通过最小化写操作的开销来提高性能,同时提供崩溃恢复的能力。
- redo log 的记录过程遵循 WAL(Write-Ahead Logging) 原则,即先写日志,再更新数据。
MySQL 插入一条 SQL 语句,redo log 记录的是什么?的更多相关文章
- 一条SQL语句求前面记录的平均值
有算法要求如下: For (i=1,i<=10,i++) { ta[i] = (t[1] + t[2] + ... + t[i]) / i; } 用一条SQL语句实现它: 分别用表变量 @ta ...
- nodejs mysql 执行多条sql语句
执行多条查询语句 为了安全起见,默认情况下是不允许执行多条查询语句的.要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能: var connection = mysql.createC ...
- Yii查看(输出)当前页面执行的sql语句(log记录)
在Yii框架下查看当前页面执行的所有sql语句的方法,主要是通过配置相关文件来达到调试sql的目的,具体方法如下: (1)修改 index.php 开启调试模式 在 index.php 文件内增加如下 ...
- 一次性插入多条sql语句的几种方法
第一种:通过 insert select语句向表中添加数据 从现有表里面把数据插入到另外一张新表去前提必须先有test_2表的存在,并且test_2表中的列的数据类型必须和test表里面列的数据类型一 ...
- 一条SQL语句在MySQL中如何执行的
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...
- 一条 SQL 语句在 MySQL 中如何执行的
一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...
- 一条SQL语句在MySQL中如何执行
一条SQL语句在MySQL中如何执行 本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会 ...
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- mysql基础-- 一条请求执行多条SQL语句
最近做一个数据库初始化工具的时候发现了这个问题,就是在一个Statement中执行一条SQL语句的时候可以正确执行,如果同时执行多条,就会报SQL语法错误,伤透了脑筋. 经过网上查找,发现有两种解决办 ...
- mysql(1)—— 详解一条sql语句的执行过程
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...
随机推荐
- openbox每日开机自动切换网络壁纸
目的 利用bing的每日一图, 每天切换壁纸 开干 联网后下载图片 利用networkmanage启动后执行脚本 netafter.sh 文件地址: /etc/NetworkManager/dispa ...
- MySQL分页性能思考
MySQL分页性能思考 关键词:深度分页 背景 最近有一个需求:在后台管理页面中,需要展示产品信息的列表. 之前版本开发中产品信息是用户填写完所有字段之后能进行保存.在之前的基础上需要支持用户不完全填 ...
- 独“数”一帜 双证加冕!TeleDB亮相可信数据库发展大会
近日,2024可信数据库发展大会在北京召开,主题为"自主.创新.引领".大会重磅发布多项中国信通院及中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)在数据库领域最 ...
- Apache Camel系列(1)----使用场景
Apache Camel是一个基于Enterprise Integration Pattern(企业整合模式,简称EIP)的开源框架.EIP定义了一些不同应用系统之间的消息传输模型,包括常见的Poin ...
- Java SPI机制及实现
一.简介 SPI 的全称为 (Service Provider Interface),是 JDK 内置的一种服务提供发现机制.主要由工具类 java.util.ServiceLoader 提供相应的支 ...
- Markdown语法基础教学
Markdown语法基础教学 简介 Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML.它的目标是实现"易读易写",并且 ...
- WPF Expander style
<!--ExpanderStyle--> <Style x:Key="ExpanderStyleOne" TargetType="{x:Type Exp ...
- 只需简单5步,Ansible脚本自动搭建AlwaysOn集群(已测试通过,可实际运行)
只需简单5步,Ansible脚本自动搭建AlwaysOn集群(已测试通过,可实际运行) 之前已经介绍过这套脚本,请看下面↓ 一分钟搞定!CentOS 7.9上用Ansible自动化部署SQL Serv ...
- CF895C Square Subsets 题解
看到 \(a_i\le 70\) 后,发现 \(n\) 啥用没有,因为只需要枚举 \(1-70\) 选几个即可. 看到求完全平方数后,想到分解质因数,由于 \(a_i\le 70\),所以只有 \(1 ...
- StarBlog博客开发笔记(33):全新的访问统计功能,异步队列,分库存储
前言 虽然现在工作重心以AI为主了,不过相比起各种大模型的宏大叙事,我还是更喜欢自己构思功能.写代码,享受解决问题和发布上线的过程. 之前 StarBlog 系列更新的时候我也有提到,随着功能更新,会 ...