日志系统 - redo log - binlog

本文深入探讨MySQL的redolog和binlog日志系统,解析其工作原理、区别及两阶段提交机制,阐述如何通过参数优化确保数据一致性。

查询流程的执行过程一般是经过连接器、分析器、优化器、执行器、存储引擎。

更新流程也是类似,不同的是更新流程会涉及到两个重要的日志模块 redo log(物理日志) 和 binlog(逻辑日志)。

 

reco log

对于更新,mysql用的是WAL技术(Write-Ahead Logging),关键点就是先写日志,然后再写磁盘。

具体来说,当有一条记录需要更新的时候,InnoDB引擎会先记录到redo log中,并更新内存。同时InnoDB引擎会在适当的时候把记录更新到磁盘中。redo log在InnoDB中是有固定大小的,当写日志的时候会从头开始写,写到末尾又要回到开头循环写,当遇到日志写满 ,InnDB会未及时更新到磁盘时,这时候不会再执行新的更新操作,会推进更新到磁盘的操作。有了redo log,InnoDB就可以保证即使数据库发生异常启动,之前提交的记录都不会丢失,这个能力称之为crash-safe。

 

binlog

mysql整体主要分为两层:1.server层,只要是mysql功能层面  2.引擎层,负责存储相关

redo log 是InnoDB引擎特有的日志,binlog 是server层的日志。最开始mysql里面是没有InnoDB引擎,MyISAM是没有crash-safe的能力,InnoDB是另一个公司以插件形式引入mysql的,所以它使用了另一套日志系统redo log来实现。

 

两个日志文件的区别:

1. redo log是InnoDB引擎独有的;binlog是mysql server层实现的,所有引擎都拥有。

2. redo log是物理日志,主要记录“在某个数据页面做了什么修改”;binlog是逻辑日志,记录语句的原始逻辑,比如”把c字段的某个值a改成了b"

3. redo log 是循环写的,空间固定会用完;binlog是可以追加写入的,到一定大小后会重新写一个文件,不会覆盖前文件

 

两阶段提交:

两阶段的目的是为了让两份日志之间的逻辑一致。update更新的时候 InnoDB会先把新数据更新到内存,写入redolog(当前为prepare阶段,还未提交),然后再写入 binlog,最后提交事务(redo log为commit阶段,此刻才算提交)。

如果不采用两阶段提交,采用直接写完redo log 再写binlog 会怎么样?

情况一:先写redo log再写binlog。redo log写完 binlog 还没写完,mysql进程异常启动,因为redo log存在仍旧能够把数据恢复,但是binlog里面没有记录这个语句,因此备份日志里面binlog就没有这条语句,用binlog来恢复数据就会不同。

情况二 :先写binlog 后写redo log。如果在binlog写完后crash,redo log并没有记录,数据无法恢复但是binlog里面会多出一个事物,与原库值不同。

 

优化点:

1.innodb_flush_log_at_trx_commit 参数设置成1 表示每次事物的redo log 都可以直接持久化到磁盘,这样可以保证mysql异常重启数据不会丢失。

2.sync_binlog 参数设置成1 表示每次事物的binlog都可以直接持久化到磁盘,这样可以保证mysql异常重启后binlog不会丢失。

 

<think>我们正在讨论MySQL中的binlogredo log。根据提供的引用内容,我们需要介绍这两种日志以及它们的区别。 关键点: 1. redo log是InnoDB存储引擎特有的日志,而binlogMySQL Server层实现的,所有存储引擎都可以使用。 2. redo log是物理日志(或物理逻辑日志),记录的是在数据页上的物理修改;binlog是逻辑日志,记录的是SQL语句的原始逻辑。 3. redo log是循环写的,空间固定;binlog是追加写的,文件达到一定大小后会切换到下一个,不会覆盖以前的日志。 4. redo log用于保证事务的持久性和崩溃恢复(WAL技术);binlog主要用于主从复制和数据恢复(归档)。 5. 在事务提交时,redo log有两个阶段:prepare和commit,这是为了保证事务在崩溃恢复时的数据一致性(两阶段提交)。 根据这些要点,组织回答: </think> ### BinlogRedo Log 日志详解及区别 #### 1. **Binlog (二进制日志)** - **定位与作用** MySQL Server 层实现的逻辑日志,**所有存储引擎通用**。核心用途包括: - **主从复制**:将 SQL 语句逻辑传输到从库重放[^2][^3] - **数据恢复**:通过 `mysqlbinlog` 工具按时间点恢复数据[^2][^5] - **审计**:记录所有数据变更操作(增删改) - **记录内容** 以逻辑形式记录 SQL 语句的原始操作: ```sql -- 示例:binlog 记录的更新逻辑 UPDATE users SET balance=balance-100 WHERE id=1; ``` 支持三种格式:`STATEMENT`(SQL语句)、`ROW`(行变更)、`MIXED`(混合)[^4][^5] - **存储特性** - **追加写入**:文件满后创建新文件(如 `binlog.000001` → `binlog.000002`),**永不覆盖**历史日志[^5] - **持久化时机**:事务提交时写入磁盘[^5] #### 2. **Redo Log (重做日志)** - **定位与作用** InnoDB 存储引擎**特有**的物理日志,核心能力: - **崩溃恢复**:保证事务持久性(ACID 中的 D)[^1] - **写优化**:通过 **WAL (Write-Ahead Logging)** 机制,先写日志再写磁盘,减少随机 I/O - **数据一致性**:确保异常重启后未提交事务可回滚、已提交事务不丢失 - **记录内容** 物理记录数据页的修改: ```markdown -- 示例:redo log 记录的物理操作 [Page 0x5A3] Offset 32: Change "balance=500" → "balance=400" ``` 采用**物理+逻辑混合**格式(如变更的数据页地址+具体修改) - **存储特性** - **循环写入**:固定大小文件(如 `ib_logfile0`, `ib_logfile1`),写满后覆盖最旧日志[^4] - **持久化时机**:事务执行中即写入(**prepare 状态**) #### 3. **核心区别对比** | **特性** | **Binlog** | **Redo Log** | |-------------------|--------------------------------|----------------------------------| | 实现层级 | MySQL Server 层 | InnoDB 存储引擎层 | | 日志类型 | 逻辑日志(SQL 语句逻辑) | 物理日志(数据页修改)[^3] | | 主要用途 | 主从复制、数据恢复、审计 | 崩溃恢复、事务持久性 | | 存储方式 | 追加写入(文件无限增长) | 循环写入(空间复用)[^5] | | 写入时机 | 事务提交时 | 事务执行中(WAL 机制) | | 引擎支持 | 所有引擎(InnoDB/MyISAM等) | 仅 InnoDB 引擎支持 | #### 4. **协同工作流程示例** 以 `UPDATE` 语句为例说明两日志协作: 1. 执行器读取数据行(ID=2)到内存 2. 修改数据:`balance=500` → `balance=400` 3. **Redo Log 记录**:写入物理修改(**prepare 状态**)[^5] 4. **Binlog 记录**:写入逻辑语句 `UPDATE ...` 5. **Redo Log 提交**:状态改为 **commit**(两阶段提交保证一致性)[^5] 6. 后台线程异步刷脏页到磁盘 > ⚠️ **关键点**:两阶段提交(2PC)防止日志不一致。若步骤4后崩溃,重启后通过 redo log 的 prepare 状态和 binlog 完整性决定提交或回滚。 #### 5. **实践建议** - **性能优化** - 增大 `innodb_log_file_size` 提升 redo log 吞吐(减少刷盘次数) - 使用 `binlog_format=ROW` 保证主从数据强一致[^3] - **容灾配置** - 开启 `sync_binlog=1` 确保 binlog 不丢失(每次提交刷盘) - 设置 `innodb_flush_log_at_trx_commit=1` 保证 redo log 实时持久化 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值