MySQL中已经有了Binlog,为啥还要有Redo Log

参考文章

MySQL中的Binlog和Redo Log虽然都与事务的持久性和可恢复性有关,但它们服务于不同的目的和场景,并且在MySQL的架构中扮演着互补的角色。

  1. Redo Log
    • 目的:Redo Log 主要用于保证InnoDB存储引擎的事务持久性。它确保在系统崩溃的情况下,已经提交的事务不会丢失,这是通过预写日志(Write-Ahead Logging, WAL)机制实现的。
    • 工作方式:Redo Log 记录的是事务对数据页所做的物理修改。当事务提交时,这些修改可能还没有写入磁盘上的数据文件,但Redo Log会确保这些修改被写入日志文件中。
    • 恢复机制:在发生崩溃后,InnoDB可以利用Redo Log来重做(redo)事务的修改,以此恢复到崩溃前的状态。

如果数据库发生崩溃,InnoDB 在重启时会检查 Redo Log。通过 Redo Log,InnoDB 可以重做(redo)在崩溃前已经提交但可能未写入到数据文件中的事务,确保这些事务的修改得到持久化。

  1. Binlog
    • 目的:Binlog 主要用于记录所有修改了数据库数据的SQL语句,以便用于复制和数据恢复。它是MySQL服务器层的功能,与存储引擎无关。
    • 工作方式:Binlog 记录的是逻辑日志,即实际执行的SQL语句或者在RBR模式下记录的行事件。
    • 复制和恢复:Binlog 使得MySQL可以实现主从复制,主服务器上的操作可以通过复制Binlog到从服务器并重放来同步数据。同时,Binlog也可以用于点时间恢复(Point-in-Time Recovery),恢复到特定时间点的数据库状态。

在执行更新语句过程,会记录redo log与binlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的写入时机不一样。

为什么两者都需要

  • 不同的恢复和复制需求:Redo Log 主要用于崩溃恢复,而Binlog用于数据复制和点时间恢复。
  • 性能和优化:Redo Log 的物理日志对于崩溃恢复来说性能更优,因为它直接关联到数据页的状态。Binlog 的逻辑日志则更适合于复制和审计,因为它记录了实际执行的操作。
  • 隔离存储引擎与服务器层Redo Log 是InnoDB存储引擎特有的,而Binlog 是MySQL服务器层的功能,这种设计使得Binlog可以用于多种存储引擎。

总之,Redo Log 和 Binlog 在MySQL中共同工作,以确保数据的安全性、持久性和一致性,同时提供灵活的数据恢复和复制选项。

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。


### MySQL BinlogRedo Log的区别及各自的作用 #### 1. 层级差异 Binlog位于MySQL Server层,而redo log则属于InnoDB存储引擎层面[^1]。 #### 2. 记录粒度的不同 - **Binlog** - 主要记录的是SQL语句的逻辑变化,比如`INSERT INTO ... VALUES(...)`这样的DDL和DML操作。其内容接近于原始执行的SQL命令本身[^3]。 - **Redo Log** - 负责捕捉物理级别的页面修改情况,具体来说是对数据页的变化进行追踪,而不是具体的SQL语句描述[^4]。 #### 3. 日志格式对比 - **Binlog**支持三种不同的日志格式:statement、row以及mixed模式;其中row格式应用最为广泛,因为它能精确反映每一行数据的实际变动详情。 - **Redo Log**采用固定结构化的方式记录每次磁盘I/O请求所涉及的数据块变更信息,不区分特定类型的SQL指令。 #### 4. 应用场景各异 - **Binlog**常被应用于主从同步机制中,通过将master节点上的更新动作传递给slave节点实现集群间的数据一致性维护;同时也可用于灾难后的增量恢复过程[^5]。 - **Redo Log**主要用于保障事务持久性和崩溃恢复效率,在实例意外终止后能够快速定位并重放未完成的操作序列,确保数据库状态的一致性。 ```sql -- 示例展示如何启用binlog SET GLOBAL binlog_format = 'ROW'; SHOW VARIABLES LIKE 'binlog_format'; -- 查看当前redo log配置(需具备适当权限) SELECT * FROM information_schema.INNODB_BUFFER_POOL_STATS; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值