数据库服务存储引擎结构的介绍,可以依据官方图示参考说明:
https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html

结合官方存储引擎结构图,可以看出存储引擎结构分为两个部分:
- On-Disk Structures(磁盘结构部分)
- In-Memory Structures(内存结构部分)
在磁盘存储结构中,会使用表空间模式进行数据信息的管理,经常提到的段 区 页概念也是属于表空间的逻辑结构;
表空间的概念源于oracle数据库,最初的目的是为了能够更好的做存储的扩容;因此数据库的表空间技术类似磁盘管理的LVM技术;

在数据库服务中所使用的表空间也被划分出几种种类:
一、类型一:共享(系统)表空间¶
属于数据库服务5.5版本时默认的表空间应用,具体数据存储数据方式为:ibdata1~ibdataN
ibdata共享表空间在各个版本之间的作用区别:
| 数据库版本 | 存储数据 | 解释说明 |
|---|---|---|
| MySQL 5.5版本 | 系统相关数据 | 全局数据字典信息(表基本结构信息、状态系统参数、属性)、undo回滚日志(记录撤销操作); Double write buffer信息、临时表信息、changer buffer |
| 用户相关数据 | 业务表数据行、表的索引数据均统一存储在ibdata1中,实现集中管理 数据表中数据清理后,ibdata1也不会释放磁盘空间 |
|
| MySQL 5.6版本 | 系统相关数据 | 全局数据字典信息(表基本结构信息、状态系统参数、属性)、undo回滚日志(记录撤销操作); Double write buffer信息、临时表信息、changer buffer |
| 用户相关数据 | 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理) |
|
| MySQL 5.7版本 | 系统相关数据 | 全局数据字典信息 undo回滚日志 Double write buffer信息、changer buffer临时表信息被独立出来了,undo也可以设定为独立 |
| 用户相关数据 | 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理) | |
| MySQL 8.0.11 | 系统相关数据 | Double write buffer信息、changer bufferundo回滚日志信息被独立出来了,数据字典信息也不再集中存储管理了 |
| 用户相关数据 | 共享表空间只存储系统数据,用户相关数据被独立管理了(独立表空间管理) | |
| MySQL 8.0.20 | 系统相关数据 | changer bufferDouble write buffer信息被独立出来了 |
共享表空间管理:
- 扩容共享表空间操作:
扩容前共享表空间信息查看:
-- 查看ibdata表空间文件配置,可以在初始安装好数据库服务后,进行修改配置为两个ibdate文件,每个共享表空间文件占用2G,总共占用4个G空间
mysql> select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend |
+-------------------------+
1 row in set (0.00 sec)
-- 查看参数信息说明:ibdata1文件,默认初始大小12M,不够用会自动扩展,默认每次扩展64M
mysql> select @@innodb_autoextend_increment;
+-------------------------------+
| @@innodb_autoextend_increment |
+-------------------------------+
| 64 |
+-------------------------------+
1 row in set (0.00 sec)
共享表空间的扩容操作方法:
# 编写数据库配置文件信息,重点添加innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend这一行的内容
vim /data/3306/data/my.cnf
[mysqld]
...
...
innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend
# 修改后的完整内容如下:
[root@db01-51 ~]# vim /data/3306/data/my.cnf
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8mb4
[mysqld]
innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend
default_storage_engine=InnoDB
init-file=/opt/init.sql
port=3306
server_id=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
innodb_fast_shutdown=0
character-set-server=utf8mb4
sql_safe_updates=1
# 必须重新初始化数据后配置才能生效(下面演示)
# 查看配置信息是否生效
mysql> select @@innodb_data_file_path;
+---------------------------------------------------------------------+
| @@innodb_data_file_path |
+---------------------------------------------------------------------+
| ibdata1:12M;/data02/ibdata2:100M;/data03/ibdata3:100M:autoextend |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
注意事项:需要注意的是ibdata1文件大小必须和实际数据库要存储的数据相匹配,否则会出现如下报错信息
-- 表示ibdate1指定大小超过了原有ibdata1实际的大小尺寸
[ERROR] [MY-012264] [InnoDB] The innodb_system data file './ibdata1' is of a different size 768 pages (rounded down to MB) than the 4864 pages specified in the .cnf file!
数据库初始化时设置共享表空间容量建议:
| 序号 | 版本信息 | 建议说明 |
|---|---|---|
| 01 | MySQL 5.7 | 设置共享表空间2~3个,大小建议512M或1G,最后一个定制为自动扩展 |
| 02 | MySQL 8.0 | 设置共享表空间1个即可,大小建议512M或1G |
共享表空间的初始设置方法:
# 模拟初始化清理数据
[root@master ~]# /etc/init.d/mysqld stop
[root@master ~]# rm -rf /data/3306/data/*
# 模拟初始化配置文件
[root@master ~]# vim /etc/my.cnf
...
...
[mysqld]
innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend
# 模拟初始化操作命令
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
# 模拟初始化重启服务
[root@master ~]# /etc/init.d/mysqld start
二、类型二:独立表空间¶
在数据库服务5.6版本中,针对用户数据,可以进行单独的存储管理,存储表的数据行和索引等相关信息;
独立表空间在各个版本之间的作用区别:
- 在数据库服务8.0版本前
用户表包含三个部分组成(表.ibd 表.frm ibdata1-全局数据字典信息存储);
所以在8.0之前,如果想修改表数据结构信息(元数据修改),都会修改frm和ibdata文件信息,每次更新都会锁表(元数据锁);
因为要保证数据一致性,并且两个表均更新完,才能释放解锁,因此在8.0前修改元数据信息,要避开业务繁忙时间段;
- 在数据库服务8.0版本后
用户表数据进行统一存储(表.ibd); 如果想修改表数据结构信息(元数据修改),只会修改ibd文件信息;
此时不需要对两个表文件均更新,只要更新一个文件即可,因此对文件锁的代价降低了,降低了对业务的影响;
独立表空间管理:
- 表空间配置参数信息查看
-- 表示每个表就是一个独立文件,进行数据信息的独立存储,不建议进行修改,如果改为0就是所有数据统一存储在共享表空间
mysql> select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
[root@xiaoQ-01 ~]# ibd2sdi city.ibd
-- 可以看到文件中存储的元数据信息(数据字典信息),并且数据库8.0之后不再有表对应的frm文件信息了
-- 在数据库5.7环境中,每个表数据信息会存储生成两个表 frm ibd
-- frm文件中存储数据表的数据字典信息(元数据信息)
-- ibd文件中存储数据行信息和索引信息
- 表空间配置参数信息修改
-- 设置为0表示利用共享表空间存储用户数据 1表示利用独立表空间存储用户数据
mysql > set global innodb_file_per_table=0
表空间企业应用案例:
案例01:利用独立表空间进行快速数据迁移(源端 3306/test/t100w --> 目标端 3307/test/t100w)
说明:可以在需要某个表中的数据信息时,可以将数据表的独立表空间数据信息做迁移,在另一个数据库中进行恢复即可
操作步骤一:锁定源端t100w表
mysql > lock tables oldboy.t100w write;
-- 给t100w表加写数据锁
mysql > show create table oldboy.t100w;
CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY `idx` (`k1`,`k2`,`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
-- 获取创建表结构数据信息
操作步骤二:目标端创建oldboy库和t100w空表
-- 创建新的数据库
mysql> create database oldboy;
-- 创建新的数据表
mysql > CREATE TABLE `t100w` (
`id` int DEFAULT NULL,
`num` int DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY `idx` (`k1`,`k2`,`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
操作步骤三:单独删除空的表空间文件
-- 删除t100w表的ibd数据文件信息,但是保留t100w的frm,ibdata1中关于t100w的系统数据
mysql> alter table oldboy.t100w discard tablespace;
操作步骤四:拷贝源端ibd文件到目标端目录,并设置权限
[root@xiaoQ-01 ~]# cp /data/3306/data/oldboy/t100w.ibd /data/3307/data/oldboy/
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
操作步骤五:导入表空间
-- 在目标端加载识别迁移过来的数据文件信息
mysql> alter table oldboy.t100w import tablespace;
-- 查看数据表中是否有迁移古来的数据信息
mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.04 sec)
操作步骤六:解锁源端数据表
mysql> unlock tables;
案例02:利用表空间迁移功能实现数据损坏恢复
说明:操作系统突然断电了,启动完成后 / 变为只读了,fsck修复文件系统,系统再次重新启动后,mysql启动不了了
结果:造成confulence库在、jira库不见了(备份没有 日志也没开)
服务:jira(bug追踪)、confluence(内部知识库) 、mysql 5.6.33(innodb引擎 使用独立表空间) -- LNMT架构
硬件:联想服务器(8核 16G内存 500G存储空间 没有raid),centos 6.8系统
========================================================================================
对话描述:
学生:这种情况怎么恢复?
老师:有备份吗?
学生:连二进制日志都没有,没有备份,没有主从
老师:jira数据库数据没什么办法了,只能进行硬盘数据恢复了
学生:jira数据库数据先不用关注,数据磁盘已经拉到中关村处理了
主要是confulence库还想使用,但将生成中的库目录,导入到其他主机上(var/lib/mysql),无法直接访问数据库中数据? /data/3306/data/confulence
老师有没有工具能直接读取数据库目录中的ibd文件内容
老师:我查查,最后发现没有
我们可以尝试下独立表空间迁移
create table xx
alter table coufulence.t1 discard tablespace;
alter table coufulence.t1 import tablespace;
虚拟环境测试可行
问题:confulence库中总共有107张表
困惑:如何创建107张和原来一模一样的表
解决:学生环境中有2016年的历史库,让学生利用mysqldump命令备份confulence历史库
mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql 只获取所有表结构信息
如果是自研数据库,没有备份怎么办
mysql工具包中,拥有mysqlfrm工具也可以读取frm文件获取表结构
========================================================================================
操作步骤一:备份历史数据库的所有表结构信息,并进行恢复
[root@xiaoQ-01 ~]# mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql
mysql > create database confulence
mysql > source test.sql
操作步骤二:删除空表的独立表空间
select concat("alter table ",table_schema,".",table_name," discard tablespace;") from information_schema.tables where table_schema='confulence'; into outfile '/tmp/discard.sql';
source /tmp/discard.sql
实际执行过程发现,有20-30张表无法成功,主外键关系问题,如果一个表一个表分析表结构,处理外键关系很痛苦
set foreign_key_checks=0
-- 跳过外键检查,从而把有问题的20-30张表的独立表空间也删除了
操作步骤三:拷贝生成中confulence库下的所有表的ibd文件到准备好的环境中并加载识别
select concat("alter table ",table_schema,".",table_name," import tablespace;") from information_schema.tables where table_schema='confulence' into outfile '/tmp/import.sql';
source /tmp/import.sql
操作步骤四:进行数据信息验证
表都可以访问了,数据挽回了出现问题时刻的状态
案例03:mysql 5.7中误删除了ibdata1数据文件,导致数据库服务无法启动;(作业)
说明:如何恢复t100w表中数据,并且假设库中有100张表,而且表结构无法通过show create table获得;
提示:有可能是自研数据库,并且没有数据备份
思路:先获取表结构信息,然后重新建表,删除空表的独立表空间,导入表的数据文件,加载识别表数据信息
操作步骤一:mysql工具包中含有mysqlfrm工具,可以读取frm文件获得表结构;
[root@xiaoQ-01 ~]# ./mysqlfrm /data/3306/data/test/t100w.frm --diagnostic
操作步骤二:将新库中所有独立表空间进行删除
select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from informatin_schema.tables where table_schema='confluence' into outfile '/tmp/discard.sql';
source /tmp/discard.sql
三、类型三:undo表空间¶
利用undo表空间主要用来完成撤销工作(回滚操作);
在数据库5.7版本中,默认存储在共享表空间中(ibdata);在数据库8.0版本后,默认就是独立存储了(undo_001-undo_002);
在实际生产环境中,建议在5.7版本之后,都将undo表空间进行独立文件存储;
undo表空间管理:
- 表空间配置参数信息查看
mysql> select @@innodb_undo_tablespaces;
+-------------------------------------------+
| @@innodb_undo_tablespaces |
+-------------------------------------------+
| 2 |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 确认是否打开独立undo模式,并设置undo表空间文件个数(3-5个)
mysql> select @@innodb_max_undo_log_size;
+-------------------------------------------+
| @@innodb_max_undo_log_size |
+-------------------------------------------+
| 1073741824 |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 表示undo日志信息的大小,默认1G
mysql> select @@innodb_undo_log_truncate;
+-------------------------------------------+
| @@innodb_undo_log_truncate |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
1 row in set (0.00 sec)
-- 表示开启undo自动回收的机制(undo purge)
mysql> select @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------------------------+
| 128 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
-- 触发自动回收的条件,单位是检测次数
官方参数使用说明(important):
The number of undo tablespaces can only be configured when initializing a MySQL instence and is fixed for the
life of the instance;
undo表空间的数量只能在初始化MySQL实例时配置,并且在实例生命周期内是固定的
- 表空间配置参数修改调整
修改数据库5.7版本服务的undo表空间,实现undo表空间的独立存储;
查看获取数据库5.7版本的默认undo配置情况:
mysql> select @@innodb_undo_tablespaces;
+--------------------------------------+
| @@innodb_undo_tablespaces |
+--------------------------------------+
| 0 |
+--------------------------------------+
1 row in set (0.00 sec)
-- 在数据库5.7版本中,undo表空间默认并未实现独立存储;
关闭数据库服务程序,对undo表空间进行独立存储配置:
# 关闭数据库服务程序,清理数据库服务数据目录
[root@xiaoQ-01 ~]# systemctl stop mysqld3357
[root@xiaoQ-01 ~]# systemctl is-active mysqld3357
unknown
-- 关闭数据库服务程序
[root@xiaoQ-01 ~]# rm -rf /data/3357/data/*
-- 删除清空数据库数据目录
# 编写修改数据库服务配置文件
[root@xiaoQ-01 ~]# vim /data/3357/my.cnf
[mysqld]
innodb_undo_tablespaces=3
innodb_max_undo_log_size=128M
innodb_undo_log_truncate=ON
innodb_purge_rseg_truncate_frequency=32
-- 在数据库服务端添加以上参数信息
重新初始化数据库服务程序:
[root@xiaoQ-01 ~]# /usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf --initialize-insecure --basedir=/usr/local/mysql57 --datadir=/data/3357/data --user=mysql
[root@xiaoQ-01 ~]# ll /data/3357/data/undo*
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo001
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo002
-rw-r----- 1 mysql mysql 10485760 11月 15 10:19 /data/3357/data/undo003
重新启动数据库服务程序:
[root@xiaoQ-01 ~]# systemctl start mysqld3357
[root@xiaoQ-01 ~]# systemctl is-active mysqld3357
active
实现undo表空间文件指定目录存储
# 将数据库服务进行关闭
[root@xiaoQ-01 ~]# systemctl stop mysqld3357
# 编写数据库服务配置文件
[root@xiaoQ-01 ~]# vim /data/3357/my.cnf
[mysqld]
innodb_undo_directory=/data/3357/undologs
# 创建存储undo表空间文件目录
[root@xiaoQ-01 ~]# mkdir -p /data/3357/undologs
[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/*
[root@xiaoQ-01 ~]# cp -a /data/3357/data/undo* /data/3357/undologs/
# 将数据库服务进行启动
[root@xiaoQ-01 ~]# mysql -S /tmp/mysql3357.sock
mysql > select @@innodb_undo_directory;
+-------------------------------------+
| @@innodb_undo_directory |
+-------------------------------------+
| /data/3357/undologs |
+-------------------------------------+
1 row in set (0.00 sec)
说明:对于数据库8.0版本,在进行undo表空间配置信息调整的时候,可以进行在线调整;
数据库8.0 undo表空间与数据库5.7undo表空间区别资料:
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html
===============================================================================================
数据库8.0独立表空间设置扩展:Adding Undo Tablespaces
Because undo logs can become large during long-running transactions, creating additional undo tablespaces
can help prevent individual undo tablespaces from becoming too large.
As of MySQL 8.0.14, additional undo tablespaces can be created at runtime using CREATE UNDO TABLESPACE syntax.
# 创建新的独立的undo表空间文件
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
# 查看已经创建的独立的undo表空间文件
mysql> select tablespace_name,file_name from information_schema.files where file_type like 'undo log';
+---------------------------+----------------+
| TABLESPACE_NAME | FILE_NAME |
+---------------------------+----------------+
| innodb_undo_001 | ./undo_001 |
| innodb_undo_002 | ./undo_002 |
| tablespace_name | ./xiaoQ1.ibu |
+---------------------------+----------------+
3 rows in set (0.00 sec)
# 删除已有的独立的undo表空间文件
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
-- 将指定的undo表空间信息设置为失效
DROP UNDO TABLESPACE tablespace_name;
-- 删除指定的undo表空间信息
# 查看已有的独立的undo表空间状态
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE 'tablespace_name';
===============================================================================================
四、类型四:temp表空间¶
临时表空间主要用于存储临时表信息,主要是在使用group by,order by,having,unique all,子查询等情况都会使用临时表;
临时表可以存储在内存和磁盘上;
临时表空间管理:
- 扩容临时表空间操作:
扩容前临时表空间信息查看:
mysql> select @@innodb_temp_data_file_path;
+--------------------------------------------+
| @@innodb_temp_data_file_path |
+--------------------------------------------+
| ibtmp1:12M:autoextend |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@innodb_autoextend_increment;
+---------------------------------------------+
| @@innodb_autoextend_increment |
+---------------------------------------------+
| 64 |
+---------------------------------------------+
1 row in set (0.00 sec)
-- 查看参数信息说明:ibtmp1文件,默认初始大小12M,不够用会自动扩展,默认每次扩展64M
临时表空间的扩容操作方法:
# 编写数据库配置文件信息
vim /etc/my.cnf
[mysqld]
innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:120M:autoextend:max:500M
-- 需要注意的是ibdata1文件大小必须和实际数据库要存储的数据相匹配,否则会出现如下报错信息
# 查看配置信息是否生效
mysql> select @@innodb_temp_data_file_path;
+---------------------------------------------------------------------+
| @@innodb_temp_data_file_path |
+---------------------------------------------------------------------+
| ibtmp1:12M;ibtmp2:120M:autoextend:max:500M |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
说明:建议数据初始化之前设定好临时表空间,建议2~3个,大小512M~1G;
数据库初始化时设置临时表空间容量建议:
| 序号 | 版本信息 | 建议说明 |
|---|---|---|
| 01 | MySQL 5.7 | 设置共享表空间2~3个,大小建议512M或1G,最后一个定制为自动扩展 |
| 02 | MySQL 8.0 | 设置共享表空间1个即可,大小建议512M或1G |
临时表空间的初始设置方法:
# 模拟初始化清理数据
[root@xiaoQ-01 ~]# /etc/init.d/mysqld stop
[root@xiaoQ-01 ~]# rm -rf /data/3306/data/*
# 模拟初始化配置文件
[root@xiaoQ-01 ~]# vim /etc/my.cnf
[mysqld]
innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:120M:autoextend:max:500M
# 模拟初始化操作命令
[root@xiaoQ-01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
# 模拟初始化重启服务
[root@xiaoQ-01 ~]# /etc/init.d/mysqld start
五、类型五:redo事务日志¶
redo log属于事务重做日志文件,主要用于记录内存数据页的变化(记录在内存中对数据页的操作信息),都会以日志文件方式记录;
可以实现"前进"(WAL-write ahead log)的功能,数据库会保证redo操作日志优先于数据写入磁盘,加快了事务提交效率(提高并发);
在进行日志信息记录时,采用的是顺序IO,而数据存储时采用的异步IO(随机IO);
redo事务日志的存储路径为:默认存储在数据库服务的数据目录下,默认大小为48M
[root@xiaoQ-01 data]# pwd
/data/3306/data
[root@xiaoQ-01 data]# ll ib_log*
-rw-r----- 1 mysql mysql 50331648 11月 15 11:34 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 11月 15 11:27 ib_logfile1
redo事务日志管理:
- 进行redo事务日志操作:
redo事务日志配置信息查看:
mysql> show variables like '%innodb_log_file%';
+-----------------------------------+---------------+
| Variable_name | Value |
+-----------------------------------+---------------+
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 |
+-----------------------------------+---------------+
2 rows in set (0.00 sec)
-- 在实际生产环境中,建议大小为512M~4G,应用组数为2~4组(写入数据过程轮询写入)
redo事务日志配置操作方法:
# 编写数据库配置文件信息
vim /etc/my.cnf
[mysqld]
innodb_log_file_size=100M
innodb_log_files_in_group=3
# 确认配置信息是否已经生效
[root@xiaoQ-01 data]# /etc/init.d/mysqld restart
[root@xiaoQ-01 data]# ll /data/3306/data/ib_log*
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile0
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile1
-rw-r----- 1 mysql mysql 104857600 11月 15 15:12 /data/3306/data/ib_logfile2
六、类型六:ib_buffer_pool预热文件¶
ib_buffer_pool预热文件可以用于缓冲和缓存,可以存储"热"数据页(经常查询或修改的数据页),从而减少物理IO消耗;
从数据库5.7版本开始,数据库正常关闭后,内存中存储的数据页缓冲或缓存信息均会失效,重新启动后还会消耗IO获取相应数据页信息;
为了可以尽量减少磁盘IO的消耗,可以将内存中的热数据页信息存储在ib_buffer_pool文件中;
数据库服务再次启动后,会直接读取ib_buffer_pool文件中信息,并将读取的信息加载到内存中,最终减少随机IO数量;
说明:存在ib_buffer_pool预热文件后,有可能在数据库服务关闭时比较耗费一些时间,但实际环境数据库服务关闭情况较少;
七、类型七:Doublewrite Buffer(DWB)文件¶
官方文档链接:https://dev.mysql.com/doc/refman/8.4/en/innodb-doublewrite-buffer.html
DWB文件主要作用是:mysql process crash in the middle of a page write(在数据库服务存储时,数据页写了一半);
数据库Innodb可以找到一个好的数据页副本从Doublewrite Buffer文件中,主要是避免数据信息出现损坏;
MySQL数据库最小IO存储单元是page(16kB),OS系统中最小的IO存储单元是block(4kB),OS也可以称为存储子系统;
会出现一个问题:数据库系统与操作系统的存储关系问题,在数据库中写入一个数据页时,在文件系统层面可能只是写入了2个block;

问题解决思路:

在数据库8.0.19之前,默认在ibdataN文件中进行存储,在数据库8.0.20以后,可以进行独立文件存储;
[root@xiaoQ-01 data]# ll *ib_16384*
-rw-r----- 1 mysql mysql 196608 11月 15 15:14 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql 8585216 11月 15 11:27 #ib_16384_1.dblwr