MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log)

文章目录

  • MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log)
    • REDO相关主要参数
      • innodb_log_buffer_size
    • innodb_redo_log_capacity
    • innodb_log_group_home_dir
    • 参考

【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)

MySQL 8.0 OCP (1Z0-908) 考点概要

MySQL 8.0 OCP (1Z0-908) 考点精析-安装与配置考点1:设置系统变量
【MySQL】控制MySQL优化器行为方法之optimizer_switch系统变量
【MySQL】MySQL系统变量(system variables)列表(mysqld --verbose --help的结果例)
【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)
MySQL 8.0 OCP (1Z0-908) 考点精析-备份与恢复考点1:MySQL Enterprise Backup概要
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点1:sys.statement_analysis视图
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点2:系统变量的确认
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点3:EXPLAIN ANALYZE
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点4:慢速查询日志(slow query log)
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点5:表连接算法(join algorithm)
MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6:MySQL Enterprise Monitor之Query Analyzer
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点5:数据字典(Data Dictionary)
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace)
MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces(单独表空间)
MySQL 8.0 InnoDB Tablespaces之General Tablespaces(通用表空间/一般表空间)
【MySQL】在数据目录之外创建InnoDB 表(Creating Tables Externally)
MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)

MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log)

在这里插入图片描述

和Oracle的架构非常类似,MySQL InnoDB 引擎也有日志缓冲区(Log Buffer)和重做日志(Redo Log)。

  • 日志缓冲区(Log Buffer)是一个内存区域,用于保存要写入磁盘上的重做日志文件的数据。
  • 重做日志文件(Redo Log)是保存在磁盘上的文件,用于保证事务的持久性。例如在数据库崩溃时候,利用重做日志(Redo Log)进行重做和数据恢复。

MySQL InnoDB 进行delete/update/insert更改数据时,在写入数据文件之前,首先会写Redo,这样既可以优化写数据时的I/O,又可以保证例如突然断电或者数据库崩溃恢复时的事务一致性。

※注:
对于MySQL而言,二进制日志文件(Binary log)也可以用于数据恢复操作,关于二进制日志文件可以参考如下内容。
参考:
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)

REDO相关主要参数

REDO相关主要参数

innodb_log_buffer_size

innodb_log_buffer_size用于定义日志缓冲区的大小,默认大小为16MB。

例:

Command-Line Format–innodb-log-buffer-size=#
System Variableinnodb_log_buffer_size
ScopeGlobal
DynamicYes
SET_VAR Hint AppliesNo
TypeInteger
Default Value16777216
Minimum Value1048576
Maximum Value4294967295

例:

mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)

为了持久化Redo信息,MySQL日志缓冲区的内容会定期刷到磁盘上的重做日志中。
较大的日志缓冲区可以使大型事务在提交之前无需将重做日志数据写入磁盘。因此,如果有更新、插入或删除大量行的事务,增加日志缓冲区的大小可以有效地节省磁盘I/O。

innodb_redo_log_capacity

innodb_redo_log_capacity用于控制重做日志文件占用的磁盘空间量,默认大小为100MB,最大值为为128GB。
※从MySQL 8.0.30开始,innodb_redo_log_capacity取代了已弃用的innodb_log_files_in_group和innodb_log_file_size变量,并且会维持32个Redo文件。

Command-Line Format–innodb-redo-log-capacity=#
Introduced8.0.30
System Variableinnodb_redo_log_capacity
ScopeGlobal
DynamicYes
SET_VAR Hint AppliesNo
TypeInteger
Default Value104857600
Minimum Value8388608
Maximum Value137438953472
Unitbytes

例:

mysql>  show variables like 'innodb_redo_log_capacity';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_redo_log_capacity | 104857600 |
+--------------------------+-----------+
1 row in set (0.00 sec)

innodb_log_group_home_dir

innodb_log_group_home_dir 用于定义InnoDB日志文件文件的目录路径。
默认情况想,重做日志文件位于数据目录中的#innodb_redo目录中。
例:

mysql> show variables like 'innodb_log_group_home_dir';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)

mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
+----------------------------+-----------+-----------+
| FILE_NAME                  | START_LSN | END_LSN   |
+----------------------------+-----------+-----------+
| ./#innodb_redo/#ib_redo148 | 484671488 | 487946240 |
+----------------------------+-----------+-----------+
1 row in set (0.02 sec)

mysql>

磁盘上的数据文件

root@mysql-vm:/var/lib/mysql/#innodb_redo# ls -lrh
total 100M
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo179_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo178_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo177_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo176_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo175_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo174_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo173_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo172_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo171_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo170_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo169_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo168_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo167_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo166_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo165_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo164_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo163_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo162_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo161_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo160_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo159_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo158_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo157_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo156_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo155_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo154_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo153_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo152_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo151_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo150_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 28 11:28 '#ib_redo149_tmp'
-rw-r----- 1 mysql mysql 3.2M Dec 30 00:00 '#ib_redo148'
root@mysql-vm:/var/lib/mysql/#innodb_redo#

※为了避免潜在的I/O资源冲突,应将InnoDB重做日志文件放置在与InnoDB数据文件不同的物理存储位置。

参考

15.6.5 Redo Log
https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log-buffer.html

8.5.4 Optimizing InnoDB Redo Logging
https://dev.mysql.com/doc/refman/8.0/en/optimizing-innodb-logging.html

Memory Configuration
https://dev.mysql.com/doc/refman/8.0/en/innodb-init-startup-configuration.html#innodb-startup-memory-configuration

<think>嗯,用户想了解如何在MySQL中查看redo log日志。首先,我得回忆一下MySQLredo 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_groupinnodb_log_file_size这样的变量,但可能在8.0之后被替换了。 另外,引用[3][5]提到redo log的状态,比如preparecommit阶段,这涉及到事务的恢复过程。用户可能想通过某些命令查看当前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文件,可能破坏事务一致性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SQLplusDB

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

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

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

打赏作者

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

抵扣说明:

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

余额充值