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 ...
随机推荐
- vim系列-文本操作篇
基数行与偶数行分组 使用Vim的替换命令,可以轻松地将基数行和偶数行分组: %s/\(^.*$\)\n\(^.*$\)/\1 \2/g 然后,删除所有的基数行: %s/^.*$\n\(^.*$\)/\ ...
- mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处理
周末突然接到一位一年多没联系的妹妹打来电话,"刘哥,快来救救我",我脑海瞬间冒出妙瓦底,电信火苲马扁.....,当时就冒汗了,心想这个妹子怎么被... 问其原由,原来是他们公司服务 ...
- datagrip中调用oracle存储过程
declare mess varchar2(300); begin P_DETAIL_PROC(参数1,...,mess); DBMS_OUTPUT.PUT_LINE(mess); end; P_DE ...
- 一篇关于c语言的大补帖
一晃今年又开始了,作为一个失意的中年技术男,现在的心境真的是五味杂陈.赶紧写一篇吧,我怕过了这个点,今年就在没有那个心情去写了. 因为是基础嘛,从事软件开发以来c或者c++相关的东西断断续续 也刷了差 ...
- 面试官最想听到的Vue和React区别
前言 欧阳最近找工作面试时总是被问到两个问题:Vue和React的区别和从编译原理的角度来聊聊Vue的template和React的jsx.面试官问这些问题一般是想了解你对这两个框架的理解,所以这是一 ...
- 库卡机器人KR240电源模块维修思路讲解
一.库卡机器人KR240电源模块故障诊断 故障诊断是维修过程中的关键步骤.使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断.重点关注电源供应.输出电压.电流等关键参数.通过诊断 ...
- Flume - [01] 概述
一.什么是Flume Flume 是Cloudera提供的一个高可用,高可靠的,分布式的海量日志采集.聚合和传输的系统. Flume最主要的作用就是:实时读取服务器本地磁盘的数据,将数据写入HDFS. ...
- 如何构建多模态AI知识库?
转载:如何构建多模态AI知识库? 摘要 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量.其中,多模态 AI 知识库作为 AI 领域的重要创新,正引领我们迈向一个全新的智能时代.它 ...
- 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明)
3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明) @ 目录 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截 ...
- [解决方案][docker] Http: server gave HTTP response to HTTPS client
前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...