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

文章目录

【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|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 Variable innodb_log_buffer_size
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type Integer
Default Value 16777216
Minimum Value 1048576
Maximum Value 4294967295

例:

clike 复制代码
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=#
Introduced 8.0.30
System Variable innodb_redo_log_capacity
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type Integer
Default Value 104857600
Minimum Value 8388608
Maximum Value 137438953472
Unit bytes

例:

clike 复制代码
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目录中。

例:

clike 复制代码
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>

磁盘上的数据文件

clike 复制代码
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

相关推荐
C137的本贾尼4 分钟前
MySQL 整体架构与存储引擎对比
数据库·mysql·架构
caimouse9 分钟前
Reactos 第 4 章 对象管理 — 4.6 对象的访问控制 / 4.7 句柄的遗传和继承
开发语言·windows·架构
j_xxx404_21 分钟前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai
caimouse1 小时前
Reactos 第 4 章 对象管理 — 4.8 系统调用 NtDuplicateObject / 4.9 系统调用 NtClose
开发语言·windows·架构
贺国亚8 小时前
Multi-Agent与Multi-Task编排架构
架构
Qiuner11 小时前
Pico 重塑Agent时代人与数据交互方式
windows·docker·ai·架构
心之伊始14 小时前
MySQL EXPLAIN 执行计划实战:从 type、Extra 到慢 SQL 定位与优化
java·架构·源码分析·csdn
国科安芯14 小时前
国科安芯推出商业航天级抗辐照全双工 RS485/422 收发器 ASC491S2Y
网络·分布式·单片机·架构·安全性测试
一切皆是因缘际会14 小时前
AI智能新时代
数据结构·人工智能·ai·架构
Database_Cool_16 小时前
AnalyticDB MySQL vs StarRocks/ByteHouse:云数仓选型指南——全托管 vs 自建方案
数据库·数据仓库·mysql·阿里云