当前位置: 首页 > news >正文

MySQL问题5

MySQL中的日志类型

MySQL是关系型数据库,日志是关键功能。常见的三种日志:
在这里插入图片描述

1. Binlog(二进制日志)

作用:

  • 记录对数据库进行更改的所有 DDL 和 DML 语句。
  • 用于主从复制中的主节点向从节点同步数据。
  • 可用于数据恢复

特点:

  • 是 MySQL Server 层的日志,与存储引擎无关
  • 以事件(event)形式记录 SQL 执行过程。
  • 有三种格式:Statement、Row、Mixed
  • 可以使用 mysqlbinlog 工具查看。

2. Redo Log(重做日志)

作用:

  • 用于崩溃恢复(Crash Recovery),保证已提交事务的数据不会丢失。
  • 是 InnoDB 引擎的 WAL(Write-Ahead Logging)机制的一部分。

特点:

  • InnoDB 存储引擎层的日志。

  • 写入顺序磁盘效率高。

  • 包括两个部分:

    • 内存中的 redo log buffer
    • 磁盘上的 redo log file
  • 在事务提交前,必须先将修改写入 redo log,再更新数据页。

典型流程:

  1. 修改数据页 → 写 redo log buffer
  2. 事务提交 → flush redo log buffer 到磁盘
  3. 写入 binlog
  4. 完成提交

3. Undo Log(回滚日志)

作用:

  • 支持事务的回滚。
  • 支持 MVCC(多版本并发控制),为读取提供一致性视图(快照读)。

特点:

  • 每执行一条 DML(INSERT、UPDATE、DELETE),会生成对应的 undo 信息。
  • 未提交事务的 undo log 会保留,可在事务失败时用于回滚。
  • 提交后如果不再需要 MVCC 的历史版本,就会被 purge 掉。

Binlog vs Redo Log vs Undo Log

特性BinlogRedo LogUndo Log
属于哪个层?MySQL Server 层InnoDB 引擎层InnoDB 引擎层
记录内容SQL语句/行更改事件数据页更改操作记录数据变更前的镜像
写入时机事务提交时写入每次数据修改时写入每次 DML 时生成
用于什么主从同步、增量备份崩溃恢复、持久性保障事务回滚、MVCC(快照)实现
是否支持恢复?支持 Point-in-time 恢复支持 Crash Recovery支持事务回滚
是否持久保存?持久保留(直到手动清除)循环使用(固定大小)随着事务清除或 purge 被删除

总结

  • Binlog 是用于复制与恢复的日志,在事务提交后写入;
  • Redo Log 是用于保证事务持久性的日志,确保即使崩溃也不丢数据;
  • Undo Log 是用于事务原子性快照读,支持回滚和一致性视图。

协同保障 MySQL 的高可靠性与并发性能

MySQL是如何实现事务的

在这里插入图片描述

MySQL 中的事务主要由 InnoDB 存储引擎 实现,它支持 ACID(原子性、一致性、隔离性、持久性)四大事务特性。MySQL 实现事务的核心依赖于:

  • 事务日志机制(Redo Log 和 Undo Log)
  • 锁机制(行锁、意向锁)
  • 多版本并发控制(MVCC)
  • 两阶段提交机制

一、事务的四大特性(ACID)

特性含义
原子性(Atomicity)事务中的所有操作要么全部执行,要么全部不执行
一致性(Consistency)执行事务前后,数据都应处于一致状态
隔离性(Isolation)多个事务并发执行时互不干扰
持久性(Durability)事务一旦提交,其结果应永久保存

二、事务实现机制

1. 原子性:Undo Log(回滚日志)

  • 每条 DML 操作(如 UPDATEDELETE)都会生成一条 Undo Log。
  • 如果事务执行失败或手动回滚,InnoDB 可根据 Undo Log 恢复数据到原状态。
  • 一条语句失败时只影响当前语句,整个事务失败会撤销全部修改。

2. 持久性:Redo Log(重做日志)

  • Redo Log 保证事务提交后,即使发生崩溃,数据也不会丢失。

  • 实现方式:

    • 修改数据时先写入内存 + Redo Log(WAL 机制)
    • 后续刷写数据页到磁盘(异步)

3. 隔离性:锁机制 + MVCC

  • 锁机制

    • InnoDB 使用行级锁(精细粒度)
    • 支持共享锁(S)和排他锁(X),并发高。
    • 意向锁优化多事务并发访问的锁冲突判断。
  • MVCC

    • 通过 Undo Log 生成数据的多个版本(快照)
    • REPEATABLE READ 级别下可读到启动事务时的视图

4. 一致性:由原子性 + 隔离性 + 应用逻辑保障

  • MySQL 本身通过日志和锁机制维持一致性
  • 开发者通过外键、触发器等控制逻辑级别的一致性

三、两阶段提交

BinlogRedo Log 并存的系统中,事务提交必须保持一致性。InnoDB 使用“两阶段提交”实现协调:

阶段一:Prepare(准备阶段)

  1. 将数据更改写入 Redo Log 的 prepare 状态(持久化到磁盘)
  2. 写入 binlog 但不提交

阶段二:Commit(提交阶段)

  1. Binlog 写成功后通知 InnoDB
  2. InnoDB 将 Redo Log 状态更新为 commit
  3. 提交完成

若在提交前宕机:

  • 恢复后根据 Redo Log 状态决定是否提交还是回滚(Crash Recovery)

四、事务隔离级别及实现

MySQL 支持四种标准隔离级别(默认:REPEATABLE READ):

隔离级别脏读不可重复读幻读实现方式
READ UNCOMMITTED不加锁,读最新值
READ COMMITTED每次读都读最新快照
REPEATABLE READ快照读 + 间隙锁
SERIALIZABLE全表锁
  • MVCC 可避免脏读和不可重复读
  • 间隙锁(Gap Lock)防止幻读(非精确范围内的插入)

MySQL 实现事务的关键机制

事务特性实现方式
原子性Undo Log,回滚机制
持久性Redo Log,WAL机制
隔离性MVCC + 锁机制
一致性事务控制 + 应用逻辑
提交一致性两阶段提交(2PC)

MySQL中的MVCC


1、MVCC 的作用

MVCC(Multi-Version Concurrency Control,多版本并发控制)的主要目标是:

  • 实现非阻塞读(快照读)
  • 支持事务隔离(如 REPEATABLE READ、READ COMMITTED)
  • 避免读写冲突,提高并发性能

MVCC 允许:

  • 读操作无需加锁
  • 写操作不会阻塞读,读也不会阻塞写

2、MVCC 的实现原理

MVCC 的核心依赖以下机制:

1. Undo Log(回滚日志)

每次对数据执行 INSERTUPDATEDELETE 操作时,InnoDB 会生成一份旧版本的数据保存在 Undo Log 中。这样在读取数据时可以构造历史快照,实现一致性读。

2. 隐藏版本字段

InnoDB 每行记录都会额外维护两个隐藏字段:

字段含义
trx_id最近一次修改该行的事务 ID
roll_pointer指向 Undo Log 的指针(保存历史版本)

这使得 InnoDB 能够根据当前事务的可见性规则找到合适的数据版本。

3. Read View(读视图)

在事务开始时,InnoDB 会生成一个 Read View,记录当前活跃事务的 ID。

查询操作时,InnoDB 会利用 Read View 判断某一行数据是否“可见”:

  • 如果是未来事务产生的数据(还未提交),则不可见;
  • 否则,可能回溯至 Undo Log 获取旧版本。

3、MVCC 在不同隔离级别下的行为

隔离级别是否使用 MVCC可避免的问题
READ UNCOMMITTED不避免脏读
READ COMMITTED避免脏读
REPEATABLE READ是(默认)避免脏读、不可重复读
SERIALIZABLE否(加锁方式)依赖加锁避免幻读

REPEATABLE READ 是 InnoDB 的默认隔离级别,结合间隙锁(Gap Lock)也可以避免幻读问题。


4、快照读 vs 当前读

类型是否使用 MVCC是否加锁典型语句
快照读普通 SELECT
当前读SELECT ... FOR UPDATE 等写操作

快照读用于非锁定读取,性能好;当前读必须读取最新版本数据,因此需要加锁。


5、MVCC 如何解决并发问题?

并发问题MVCC 能解决说明
脏读能(READ COMMITTED 起)不读取未提交的数据
不可重复读能(REPEATABLE READ)始终读取第一次查询的快照
幻读不能单靠 MVCC,需要间隙锁插入操作需结合锁机制

MySQL 中的 MVCC 是 InnoDB 存储引擎提供的并发控制机制,通过:

  • Undo Log 构建数据历史版本
  • 行记录隐藏字段记录版本信息
  • Read View 管理事务可见性

文章转载自:

http://Ue9D1Dk2.rzsxb.cn
http://xp7jwqIW.rzsxb.cn
http://QiLsQx9G.rzsxb.cn
http://2tXOyjTo.rzsxb.cn
http://xgWO99k9.rzsxb.cn
http://F4Kbewvr.rzsxb.cn
http://sqZp4mW2.rzsxb.cn
http://alz1WQUA.rzsxb.cn
http://g2oeggqd.rzsxb.cn
http://C4N9Ocsc.rzsxb.cn
http://98btS954.rzsxb.cn
http://kqbttYWD.rzsxb.cn
http://DFHPWVAC.rzsxb.cn
http://m7p7cfdk.rzsxb.cn
http://gpA2GhkO.rzsxb.cn
http://rBeov2Mi.rzsxb.cn
http://AjVdnlBF.rzsxb.cn
http://dBZzTnso.rzsxb.cn
http://NiZvIb3F.rzsxb.cn
http://QffveV1X.rzsxb.cn
http://AfzMne9C.rzsxb.cn
http://osSYGoR2.rzsxb.cn
http://NgUFTl4v.rzsxb.cn
http://nqgmJxoV.rzsxb.cn
http://hTr0D8AC.rzsxb.cn
http://BcytLIXZ.rzsxb.cn
http://1OnLPJZo.rzsxb.cn
http://jujHt1NZ.rzsxb.cn
http://U4vvdLe1.rzsxb.cn
http://ouwWtEOA.rzsxb.cn
http://www.dtcms.com/a/371247.html

相关文章:

  • MyBatis Example模式SQL注入风险
  • C语言数据结构——详细讲解《二叉树与堆的基本概念》
  • 【杂类】I/O
  • import type在模块引入中的作用
  • MySQL入门指南:从安装到工作原理
  • 【基础-判断】一个页面可以存在多个@Entry修饰的组件。
  • MapStruct详解
  • 新的打卡方式
  • GESP 7/8级免CSP-J/S初赛!申请注意事项!今年已过,明年提前关注!
  • esbuild入门
  • 决策树概念与原理
  • More Effective C++ 条款31:让函数根据多个对象来决定怎么虚拟
  • Python列表:从入门到灵活运用的全攻略
  • 校园洒水车cad+三维图+设计说书
  • 机械硬盘的工作原理
  • 生命周期方法:didUpdateWidget
  • Pie Menu Editor V1.18.7.exe 怎么安装?详细安装教程(附安装包)​
  • ragflow MCP 调用核心提示词解析:逻辑闭环与优化方向
  • Knative Serving:ABP 应用的 scale-to-zero 与并发模型
  • Xsens帮助独立工作室创造引人注目的冒险游戏真实角色动画
  • 《动手学深度学习v2》学习笔记 | 2.4 微积分 2.5 自动微分
  • 【开题答辩全过程】以 哈尔滨裕丰草莓园管理系统为例,包含答辩的问题和答案
  • 国内外支持个人开发者的应用市场
  • 【LLIE专题】SIED:看穿0.0001lux的极致黑暗
  • ANSYS HFSS边界条件的认识
  • python系列之综合项目:智能个人任务管理系统
  • IOC为什么交由spring容器管理?
  • spring事务传播机制
  • LeetCode_数学
  • (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)