MySQL 的undo log、redo log 和 binlog

在 MySQL 中,尤其是 InnoDB 存储引擎中,undo logredo logbinlog 是三个重要的日志系统,它们各自承担着不同的职责,用于保证数据的完整性、事务的一致性和恢复能力。下面详细解释这三种日志的区别及其作用:

1. Undo Log(撤销日志)

  • 功能:主要用于事务回滚和实现多版本并发控制(MVCC)。当一个事务对数据库进行修改时,InnoDB会先记录一条undo日志,然后才执行真正的数据变更。如果事务需要回滚,可以通过undo日志来恢复到事务开始前的状态。
  • 应用场景
    • 支持事务的原子性(Atomicity),即确保事务中的所有操作要么全部完成,要么完全不执行。
    • 提供了MVCC的基础,允许读操作在没有锁的情况下读取数据的一个快照版本,提高了并发度。
  • 存储位置:位于系统表空间或独立的undo表空间中。

2. Redo Log(重做日志)

  • 功能:是一种基于磁盘的数据结构,用来恢复尚未写入数据文件的已成功提交事务更新的数据。Redo log主要用于崩溃恢复(Crash Recovery),以确保即使MySQL服务器突然停止运行,也能通过redo log恢复未持久化到硬盘的数据,从而保证事务的持久性(Durability)。
  • 应用场景
    • 在事务提交时,首先确保redo log被持久化到磁盘上,然后再异步地将缓冲池中的脏页刷新到磁盘,以此提高性能。
    • 当数据库发生崩溃重启后,可以根据redo log重新应用那些已经提交但还没来得及写入数据文件的修改。
  • 存储位置:固定大小,循环使用,通常位于数据目录下的ib_logfile0、ib_logfile1等文件中。

3. Binlog(二进制日志)

  • 功能:记录了对数据库执行更改的所有操作(除了查询SELECT和SHOW等不改变数据的操作),主要用于数据恢复、主从复制以及审计等方面。Binlog是由MySQL Server层生成的日志,不仅适用于InnoDB,也适用于其他存储引擎。
  • 应用场景
    • 数据库备份与恢复:通过binlog可以实现时间点恢复。
    • 主从复制:Master上的binlog会被发送给Slave,Slave执行这些日志来保持与Master的数据同步。
    • 审计:可用于分析哪些SQL语句被执行过。
  • 存储位置:配置文件中指定的位置,默认为datadir下的文件,扩展名为.000001, .000002等。

总结

  • Undo Log 关注的是事务回滚和MVCC,主要服务于事务的原子性和隔离性。
  • Redo Log 确保事务一旦提交就不会丢失,专注于事务的持久性。
  • Binlog 则是从整体数据库层面提供了一个完整的变更历史记录,支持复制、恢复等功能,并且它的存在是跨存储引擎的。

三者共同工作,保障了MySQL的ACID特性,特别是在高并发和故障恢复场景下发挥着重要作用。


各日志的内容和记录流程

1. Undo Log(撤销日志)
  • 内容:Undo log 主要包含两个部分,一是用于回滚事务的旧数据版本,二是支持MVCC(多版本并发控制)所需的快照信息。每个修改操作(如INSERT、UPDATE或DELETE)都会生成相应的undo记录。

  • 记录流程

    • 当一个事务开始对某行进行修改时,InnoDB会首先将该行的原始值写入undo log中。
    • 这些undo记录按照相反的操作顺序被存储在undo页中,并且这些页会被组织成undo段。
    • 在事务提交或回滚时,如果需要撤销更改,则可以通过undo log中的信息恢复到事务开始前的状态。
    • 对于长时间运行的事务,undo log也会参与崩溃恢复过程,确保即使数据库意外停止,也能正确地回滚未完成的事务。
2. Redo Log(重做日志)
  • 内容:Redo log包含了物理层面的日志记录,主要是关于数据页变化的信息。每条redo log记录描述了如何重新应用一个具体的修改,以便在崩溃后能够恢复丢失的数据更新。

  • 记录流程

    • 当事务执行任何修改操作时,MySQL会先将相关的redo log记录添加到redo log buffer中。
    • 根据一定的策略(如事务提交、log buffer满或者达到一定的时间间隔),这些缓冲区中的redo log记录会被刷新到磁盘上的redo log文件中。
    • 在数据库启动期间,如果检测到之前有未完成的事务(即crash recovery场景),MySQL会根据redo log文件中的信息重新应用那些已经成功但尚未持久化到数据文件中的修改,以保证事务的持久性。
3. Binlog(二进制日志)
  • 内容:Binlog记录的是逻辑层面的操作,包括SQL语句或行级别的变更。它不仅限于InnoDB存储引擎,而是适用于所有支持binlog的存储引擎。Binlog有两种格式:STATEMENT和ROW,以及MIXED模式。

  • 记录流程

    • MySQL Server接收到客户端发送的SQL命令后,如果是可改变数据库状态的命令(例如INSERT, UPDATE, DELETE等),则会生成对应的binlog事件并写入binlog缓存。
    • 根据配置的不同(sync_binlog参数),这些缓存中的binlog事件可能会立即同步到磁盘上,也可能是在事务提交时或达到一定大小后再批量写入。
    • 在主从复制架构中,Master节点会将产生的binlog发送给Slave节点,Slave通过执行这些日志来保持与Master的数据一致性。

这三种日志各自扮演着不同的角色,共同维护了MySQL数据库的可靠性、一致性和高性能。Undo log确保了事务的原子性和隔离性;Redo log保障了事务的持久性;而Binlog则为数据恢复、审计和主从复制提供了基础。理解它们的作用机制有助于更好地优化数据库性能和故障恢复策略。

你可能感兴趣的:(mysql,数据库)