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

相关推荐
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
追风林1 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
Dann Hiroaki3 小时前
GPU架构概述
架构
Hsu_kk3 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境3 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n4 小时前
MYSQL库的操作
数据库·mysql
茶馆大橘4 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
coding侠客4 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
eternal__day5 小时前
MySQL_聚合函数&分组查询
数据库·mysql
lipviolet5 小时前
架构系列---高并发
架构