数据库_日志 📅 发布时间:2026/9/3 20:28:44 👁 浏览次数: 日志文件种类•redo log 重做日志是 Innodb 存储引擎层生成的日志实现了事务中的持久性主要用于掉电等故障恢复事务执行过程中生成的 redolog 会在 redolog buffer 中也就是在内存中等事务提交的时候会把 redolog 写入磁盘。•undo log 回滚日志是 Innodb 存储引擎层生成的日志实现了事务中的原子性主要用于事务回滚和 MVCC。undo log保证了ACID特性中的原子性事务没有提交前修改前旧数据写入 Undo Log Buffer 内存后台会刷入磁盘 undo 日志事务回滚优先读取 Undo Log Buffer 内存中的旧数据执行反向操作实现回滚如果内存中不存在则读取磁盘 undo log 文件.具体操作是回滚时读取undo log中数据然后做原操作相反的操作比如delete一条操作就会把记录记到undo log中执行回滚时读取undo log数据进行insert操作相反插入回滚就会做删除操作更新操作回滚就直接更新旧值。• bin log 二进制日志是 Server 层生成的日志主要用于数据备份和主从复制MySQL完成一条更新操作Server层会生成一条binlog,等事务提交时将事务执行中产生的所有binlog写入binlog文件。是 Server 层生成的日志所有引擎都可以使用。是追加写写满一个文件就继续写不会覆盖之前的日志保存全量日志用于数据备份和主从复制。记录了所有数据库表结构变更和表数据修改的日志不会记录查询类的操作。包含三种模式statement,row,mixed格式记录内容优点缺点STATEMENT原始 SQL 语句日志小动态函数主从不一致ROW行变更前后数据复制安全无歧义大数据量 binlog 体积大MIXED自动切换二者兼顾体积与安全极少场景仍有隐患•relay log 中继日志用于主从复制场景下slave通过io线程拷贝master的bin log后本地生成的日志• 慢查询日志用于记录执行时间过长的sql需要设置阈值后手动开启redo log、undo log、bin log详细区分redo‑binlog 两阶段提交两阶段提交的时序三者刷盘时机undo log :异步刷盘事务提交不强制刷盘定期刷盘条件触发redo log :prepare阶段就刷盘bin log :事务commit之前刷盘有了undolog为啥还需要redolog呢redo log 和 undo log 这两种日志是属于 InnoDB 存储引擎的日志它们的区别在于undo log 保存修改前旧数据用于事务失败回滚保证原子性记录了此次事务「开始前」的数据状态记录的是更新之前的值redo log 记录修改之后的新变化事务提交后机器崩溃依靠 redo log 重做改动保证持久性。记录了此次事务「完成后」的数据状态记录的是更新之后的值undo 只有旧版本不能恢复已经提交成功的新数据所以必须要有 redo log。为什么用binlog还要redolog1.binlog是服务层逻辑日志服务于备份与主从复制不能用于 InnoDB 崩溃恢复。2.redo log 是InnoDB 存储引擎日志用于崩溃恢复宕机后恢复内存中尚未刷入 ibd 文件的数据页。3.两阶段提交机制下先将 redo log 刷盘打上 prepare 标记之后才写入 binlog 磁盘文件。如果故障发生在 redo prepare 完成、binlog 尚未写完此时只有 prepare 状态的 redo没有 binlog重启后事务回 滚。依靠 redo 与 binlog 两份日志互相校验保证数据一致性。为什么要写RedoLog而不是直接写到B树里面性能提升把大量随机磁盘 IO转变成顺序 IO事务提交只需要写 redo log顺序写不需要立刻改动 B 树磁盘。脏页交给后台线程慢慢刷盘。崩溃恢复能力机器宕机内存 Buffer Pool 全部丢失内存脏页还没刷到 B 树磁盘。 重启 MySQL读取磁盘上的 redo log把还没刷盘的数据页变更重新恢复到内存保证数据不丢失。Mysql的两次写保障后台异步刷盘数据页到idb文件不会因为页断裂故障我们常见的服务器一般都是Linux操作系统Linux文件系统页OS Page的大小默认是4KB。而MySQL的页Page大小默认是16KB。MySQL程序是跑在Linux操作系统上的需要跟操作系统交互所以MySQL中一页数据刷到磁盘要写4个文件系统里的页。刷脏页断电时有可能只写入部分数据造成磁盘上数据页半损坏。redo log 记录的是页的变更操作无法修复本身已经物理损坏的页。doublewrite buffer 既有内存部分也有磁盘备份区域。刷脏页先拷贝到内存 DWB再持久化到磁盘 DWB磁盘备份成功后才写入真实 ibd 文件。机器崩溃后内存数据全部丢失恢复依靠磁盘上 doublewrite 保存的完整页副本修复破碎的数据页修复完成再执行 redo log。不同崩溃阶段处理方式崩溃发生阶段磁盘 DWB 备份状态ibd 数据页状态恢复行为②拷贝内存 DWB 阶段无备份ibd 页完好旧版本丢弃内存数据直接 redo log 重放③写磁盘 DWB 中途备份页本身损坏无效ibd 页完好旧版本丢弃损坏 DWB 备份走 redo log 重放③成功④写 ibd 中途DWB 备份完整有效ibd 页断裂损坏先用 DWB 磁盘副本修复破碎页再执行 redo log 重放④ibd 全部写完之后备份过期可被覆盖ibd 页完整最新不需要 DWB 修复直接 redo log 恢复