【MySQL】RedoLog日志和Binlog日志哪个先写的问题?

RedoLog日志和Binlog日志哪个先写的问题?

前言

MySQL中六种日志文件,分别是重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log)、中继日志(relay log).其中重做日志和回滚日志与事务操作息息相关,二进制日志与事务操作有一定的关系,这三种日志,对理解MySQL的事务操作有着重要的意义。
首先我们知道在MySQL中,二进制日志(binlog)是server层的,主要用来做主从复制和即时点恢复时使用的。而事务日志(redolog)是InnoDB存储引擎层的,用来保证事务安全的。你可能会有这样的疑问。

  • 1.为什么MySQL有binlog,还有redo log?
  • 2.事务是如何提交的?事务提交先写binlog还是redo log? 如何保证这两部分的日志做到顺序一致性?
  • 3.为了保障主从复制安全,故障恢复是如何做的?
  • 4.为什么需要保证二进制日志的写入顺序和InnoDB层事务提交顺序一致性呢?

简单总结二者关系:

  • 1.redolog用来恢复当前及其上的存储引擎中的数据,例如innodb
  • 2.binlog用来做复制同步的,让别的机器上的实例进行数据库操作

1.为什么MySQL有binlog,还有redo log?

在这里插入图片描述

这个是因为MySQL体系结构的原因,MySQL是多存储引擎的,不管使用哪种存储引擎,都会有binlog,而不一定有redolog,简单地说,binlog是MySQL Server层的,redo log是InnoDB层的。

  • redolog
    在MySQL InnoDB中,redo log是用来实现事务的是就行,即当事务在提交时,必须先将该事务的所有操作日志写到磁盘上的redo log file进行持久化,这也就是我们常说的Write Ahead Log策略。有了redo log,在数据库发生宕机时,即时内存中的数据还没来得及持久化到磁盘上,我们也可以通过redo log完成数据的恢复,这样就避免了数据的丢失
  • binlog
    在MySQL中,binlog记录了数据库系统所有的更新操作,主要是用来实现数据恢复和主从复制的。一方面,主从配置的MySQL集群可以利用binlog将主库中的更新操作传
### Mysqlbinlog、undologredolog日志功能及区别 #### binlog(二进制日志binlogMySQL Server 层的日志,记录了数据库的逻辑操作,例如 `INSERT`、`UPDATE` `DELETE` 等语句。它以逻辑日志的形式存储,记录的是 SQL 语句的原始逻辑[^1]。 - **功能**: - 主要用于主从复制,从库通过读取主库的 binlog 来实现数据同步[^2]。 - 可用于数据恢复,当数据库发生故障时,可以通过重放 binlog恢复数据[^4]。 - **刷盘时机**: - `sync_binlog` 参数控制 binlog 的刷盘行为,建议设置为 1,即每次事务提交时都将 binlog 写入磁盘,以保证异常重启后日志不会丢失[^4]。 - **格式**: - 支持三种格式:`STATEMENT`、`ROW` `MIXED`。`ROW` 格式记录每一行的变化,而 `STATEMENT` 格式记录执行的 SQL 语句。 --- #### redo log(重做日志) redo log 是 InnoDB 存储引擎层的日志,记录了数据页的物理变化,属于物理日志[^3]。 - **功能**: - 主要用于崩溃恢复。当数据库因意外宕机或介质故障而需要恢复时,redo log 能够确保未写入磁盘的数据能够被重新应用,从而保证数据的一致性完整性。 - **记录形式**: - 记录的是数据页的物理变化,而非具体的 SQL 操作。例如,某一行数据从 A 值更新为 B 值,redo log 会记录这一变化的详细信息[^2]。 - **写入方式**: - redo log 是循环写入的,其日志空间大小是固定的。当一个日志文件写满后,会切换到下一个日志文件,形成循环使用。 --- #### undo log(回滚日志) undo log 同样是 InnoDB 存储引擎层的日志,主要用于事务的回滚以及多版本并发控制(MVCC)。 - **功能**: - 在事务执行过程中,如果需要回滚,undo log 提供了撤销操作的能力。例如,某条记录被更新后,undo log 会保存该记录的旧版本,以便在需要时恢复旧值[^2]。 - 支持 MVCC,允许多个事务同时读取不同版本的数据,而不会相互干扰[^1]。 - **记录形式**: - 记录的是事务执行前的数据状态,与 redo log 不同,undo log 是逻辑日志[^2]。 --- #### 区别总结 | 日志类型 | 层级 | 功能 | 记录形式 | 使用场景 | |------------|--------------|--------------------------|----------------|------------------------------------| | binlog | MySQL Server | 数据恢复、主从复制 | 逻辑日志 | 数据同步、故障恢复 | | redo log | InnoDB 引擎 | 崩溃恢复 | 物理日志 | 数据库异常宕机后的数据一致性恢复 | | undo log | InnoDB 引擎 | 事务回滚、MVCC | 逻辑日志 | 回滚操作、支持并发读 | --- ### 示例代码:查看 binlog 文件内容 ```bash # 查看当前 binlog 文件列表 SHOW MASTER LOGS; # 查看指定 binlog 文件的内容 mysqlbinlog /var/lib/mysql/binlog.000001; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值