mysql redolog日志

在mysql的架构中,有几个比较重要的日志,分别是binlog、redolog和undoLog,这篇博客主要记录redo log

是什么

redo log我们称之为重做日志,mysql通过redo log日志来保证了持久性;
mysql事务要求要保证持久性,其实如果不考虑性能因素,要保证持久性,最简单的做法,就是:在事务提交的时候,将更新、或者删除的数据,同步去更新磁盘上的数据页即可
但是这样做,有一个很大的问题,就是性能问题,因为mysql在磁盘上存储的时候,是按照数据页来存储的,提交的一个sql有可能要更新好几个数据页的数据,这几个数据页有可能不是连续的,那这时候,就是随机读写,随机读写磁盘是非常耗时的,根本扛不住高并发

redo log怎么保证数据持久性

那既然在执行update语句的时候,实时去更新磁盘上的数据不行,那mysql设计的时候,有一个buffer pool的概念,可以理解为:我们在执行一个update、delete、insert的时候,都是先写到内存中的这个buffer pool中,然后返回给客户端成功,mysql内部会通过异步线程去写磁盘
这种方式虽然性能比较好,但是会有丢失数据的可能,所以,此时就有了redo log这个东西

redolog日志有两部分,一部分是在内存中的,我们称之为redo log buffer,一部分是在磁盘上的,我们称之为redo log file;也就是说,redo log buffer中的数据,也是要写到redo log file中,此时在往磁盘上写数据的时候,就可以直接append就可以了,可以理解为是顺序的去写磁盘,会比随机读写要好很多

在整理下思路:

  1. 在执行sql的时候,MySQL会先把数据更新到buffer pool中,此时,对于客户端,我们可以认为已经执行成功了
  2. 同时,会把相关信息写入到redo log buffer中,此时也是在内存中
  3. 在执行commit操作的时候,会将redo log buffer中的数据写入到redo log file中
  4. 同时,binlog在写入磁盘成功之后,会写一个标记到redo log file中,这是为了保证两者的数据是一致的
  5. 到这里,才认为事务提交成功;所以我们可以认为:在事务提交的时候,我们真正update的数据,在buffer pool中,redolog File文件中
  6. 在底层,会通过io线程,把buffer pool中的数据更新到磁盘上的数据页

所以,整体来看,我觉得,为了避免update的时候,去实时更新磁盘数据,引入了redo log这个东西,只是说,在事务提交之前,会通过顺序写磁盘的形式,将update的信息写入到redo log file中,这样,可以保证mysql更新的性能,同时,保证了数据的可靠性和持久性
也就是说:即使为在update了之后,数据还没真正的写入到磁盘上,这时候,主机宕机了,那我也可以通过binlog和redo log来恢复没有持久化的数据

redo log 刷盘时机

redo log 在从内存中持久化到redo log file的时候,也是有策略的,会有相应的配置,来设置持久化的时机

innodb_flush_log_at_trx_commit

这个参数,就是控制redo log 从内存中,写入到磁盘中的时机
如果为0:提交事务时,不会强制将数据从内存写入到磁盘中,而是每隔1S,将数据从内存中,写入到os cache中,并通过fsync()命令刷入到磁盘中
如果为1:表示实时同步,在提交事务的时候,会将redo log buffer中的数据写入到os cache,并调用fsync()写入到磁盘中
如果为2:表示实时写,延迟刷;每次提交事务,都会将数据从redo log buffer写入到os cache中,但是会每隔1S,调用fsync(),将数据持久化到磁盘上

<think>嗯,用户想了解如何在MySQL中查看redo log日志。首先,我得回忆一下MySQL中redo log的结构和存储方式。根据之前的引用资料,redo log包括内存中的缓冲区和磁盘上的文件,比如引用[4]提到redo log分为内存的redo log buffer和磁盘的redo log file。所以用户可能想查看这两个部分的信息,但需要知道MySQL通常不直接让用户查看redo log文件的内容,因为这些是内部的、二进制的日志,用于崩溃恢复和事务的持久性。 接下来,我需要考虑用户的实际需求。用户可能是想监控redo log的状态,比如当前的使用情况、文件大小、写入情况等,或者是想查看具体的日志内容。但直接查看文件内容可能不可行,因为redo log是二进制格式,MySQL没有提供直接的工具来解析。不过,可以通过一些系统变量或命令来获取相关信息。 根据引用[1],提到了innodb_redo_log_capacity变量,这可能是一个新的配置参数,用于设置redo log的容量。在较新的MySQL版本中,用户可能需要查看这些参数来了解redo log的配置。此外,还有像innodb_log_files_in_group和innodb_log_file_size这样的变量,但可能在8.0之后被替换了。 另外,引用[3]和[5]提到redo log的状态,比如prepare和commit阶段,这涉及到事务的恢复过程。用户可能想通过某些命令查看当前redo log的状态,或者事务的状态。 可能的步骤包括: 1. 使用SHOW ENGINE INNODB STATUS命令,查看InnoDB的状态信息,其中包含了redo log的相关信息,比如日志序列号、写入位置等。 2. 查看系统变量,如innodb_redo_log_capacity、innodb_log_files_in_group等,来了解redo log的配置。 3. 使用性能模式(performance_schema)中的表来监控redo log的活动,比如events_waits_current表。 4. 对于实际文件,虽然不能直接查看内容,但可以查看文件的位置和大小。MySQL 8.0之后,redo log文件默认在数据目录下的#innodb_redo目录中,文件名类似redo_log_fileN。 需要注意的是,直接解析redo log文件内容需要专门的工具,这可能比较复杂,且官方不推荐。因此,用户可能需要使用间接的方法来监控和查看redo log的状态,而不是具体的内容。 另外,用户可能需要了解如何调整redo log的大小或配置,这可能涉及到修改系统变量,如引用[1]提到的innodb_redo_log_capacity。在回答时,需要区分不同MySQL版本的方法,因为8.0.30前后可能有变化。 总结下来,查看redo log的方法包括检查系统变量、InnoDB状态、文件位置以及性能模式中的监控数据。对于具体内容,可能需要使用第三方工具或MySQL的调试功能,但通常不建议这样做。</think>### 如何在MySQL中查看redo log日志? #### 1. **查看redo log配置参数** MySQL通过系统变量控制redo log的容量和文件数量。对于MySQL 8.0.30及之后的版本,使用以下命令: ```sql SHOW VARIABLES LIKE 'innodb_redo_log_capacity'; ``` 这会显示当前分配的redo log总容量(默认约104857600字节,即100MB)[^1]。早期版本可使用`innodb_log_files_in_group`和`innodb_log_file_size`查看文件数量和单个文件大小。 #### 2. **查看redo log文件物理位置** 默认情况下,redo log文件存储在MySQL数据目录的`#innodb_redo`子目录中,文件名格式为`redo_log_fileN`(例如`redo_log_file0`)。通过以下命令定位文件路径: ```sql SHOW VARIABLES LIKE 'datadir'; ``` #### 3. **监控redo log状态** 通过`SHOW ENGINE INNODB STATUS`查看InnoDB引擎状态,重点关注`LOG`部分: ``` LOG Log sequence number 1234567890 # 当前LSN(日志序列号) Log buffer assigned up to 1234567890 # 缓冲区已分配量 Log buffer completed up to 1234567890 # 缓冲区已写入量 Log flushed up to 1234567890 # 已刷盘LSN Pages flushed up to 1234567890 # 数据页刷盘LSN ``` `Log sequence number`表示最新的日志位置,`Log flushed up to`表示已持久化的日志位置,两者的差异反映未刷盘的日志量。 #### 4. **通过性能模式监控** 启用Performance Schema后,可查询redo log相关事件: ```sql SELECT * FROM performance_schema.events_waits_current WHERE EVENT_NAME LIKE '%innodb%log%'; ``` 此方法用于分析redo log的写入等待事件,帮助诊断性能问题。 #### 5. **解析redo log内容(高级)** MySQL未提供直接解析redo log的工具,但可通过以下方法间接分析: - **启用调试模式**:编译时开启`WITH_DEBUG`选项,使用`innodb_redo_log_reader`工具(仅限开发环境)。 - **第三方工具**:如Percona的`redo_log_parser`,需谨慎使用。 #### § 注意事项 - redo log是二进制文件,直接查看需特殊工具。 - 生产环境不建议修改redo log文件,可能破坏事务一致性。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值