文章目录
- [MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log)](#MySQL 8.0 InnoDB 架构之 日志缓冲区(Log Buffer)和重做日志(Redo Log))
【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)
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数据文件不同的物理存储位置。
参考
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