【MySQL高阶】20.InnoDB 磁盘文件

文章目录

  • [6. InnoDB 磁盘文件](#6. InnoDB 磁盘文件)
    • [6.1 InnoDB存储引擎包含哪些磁盘文件?](#6.1 InnoDB存储引擎包含哪些磁盘文件?)
      • [6.1.1 什么是表空间?](#6.1.1 什么是表空间?)
    • [6.2 系统表空间 - System Tablespace](#6.2 系统表空间 - System Tablespace)
      • [6.2.1 系统表空间的作用?](#6.2.1 系统表空间的作用?)
      • [6.4.2 系统表空间文件保存在哪里?](#6.4.2 系统表空间文件保存在哪里?)
      • [6.4.3 系统表空间都有哪些可以配置的选项?](#6.4.3 系统表空间都有哪些可以配置的选项?)
      • [6.4.4 修改系统表空间配置后什么时候生效?](#6.4.4 修改系统表空间配置后什么时候生效?)
    • [6.5 独立表空间 - File-Per-Table Tablespace](#6.5 独立表空间 - File-Per-Table Tablespace)
      • [6.5.1 独立表空间的作用?](#6.5.1 独立表空间的作用?)
      • [6.5.2 独立表空间文件保存在哪里?](#6.5.2 独立表空间文件保存在哪里?)
      • [6.5.3 每个表都对应一个独立表空间吗?](#6.5.3 每个表都对应一个独立表空间吗?)
      • [6.5.4 独立表空间的优点和缺点?](#6.5.4 独立表空间的优点和缺点?)
    • [6.6 撤销表空间 - Undo Tablespaces](#6.6 撤销表空间 - Undo Tablespaces)
      • [6.6.1 撤销表空间的作用?](#6.6.1 撤销表空间的作用?)
        • [6.6.1.1 什么是撤销日志?](#6.6.1.1 什么是撤销日志?)
      • [6.6.2 在使用MySQL时并没有手动创建撤销表空间,它是什么时候被创建的?](#6.6.2 在使用MySQL时并没有手动创建撤销表空间,它是什么时候被创建的?)
        • [6.6.2.1 默认的撤销表空间名称和路径是什么?](#6.6.2.1 默认的撤销表空间名称和路径是什么?)
      • [6.6.3 可以手动创建撤销表空间吗?](#6.6.3 可以手动创建撤销表空间吗?)
        • [6.6.3.1 什么时候需要手动创建撤销表空间?](#6.6.3.1 什么时候需要手动创建撤销表空间?)
        • [6.6.3.2 使用自己创建的撤销表空间需要注意什么?](#6.6.3.2 使用自己创建的撤销表空间需要注意什么?)

6. InnoDB 磁盘文件

6.1 InnoDB存储引擎包含哪些磁盘文件?

InnoDB的磁盘文件主要是表空间文件和其他文件。

表空间包括:

  1. 系统表空间
  2. 独立表空间
  3. 通用表空间
  4. 临时表空间
  5. 撤销表空间

其他文件:

  1. 重做日志
  2. 双写缓冲区

6.1.1 什么是表空间?

  • 表空间可以理解为MYSQL为了管理数据而设计的一种数据结构,主要描述的对结构的定义,表空间文件是对定义的具体实现,以文件的形式存在于磁盘上,以后我们说的表空间指的就是表空间文件
  • InnoDB存储引擎的表空间包括:系统表空间、独立表空间、通用表空间、临时表空间和撤销表空间

6.2 系统表空间 - System Tablespace

6.2.1 系统表空间的作用?

  • 系统表空间存储了MySQL中所有系统表的数据,也包括数据字典;
  • 系统表空间也是变更缓冲区的存储区域,当数据库服务器关闭时,没有合并到缓冲池的二级索引修改操作被保存到系统表空间;
  • 在以前的版本中,系统表空间也包含双写缓冲区,从MySQL 8.0.20开始,双写缓冲区从系统表空间中移到单独的文件中。

6.4.2 系统表空间文件保存在哪里?

系统表空间可以对应一个或多个数据文件,默认情况下,MySQLdata 目录中创建一个系统表空间数据文件 ibdata1 。系统表空间数据文件的大小和数量由 innodb_data_file_path 启动选项定义。


6.4.3 系统表空间都有哪些可以配置的选项?

可以通过 innodb_data_file_path 选项定义,如果没有指定 innodb_data_file_path的值,则默认创建一个大小可以自动扩展的数据文件,文件名为 ibdata1 ,初始大小 12MB

mysql 复制代码
mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend | # 默认值
+-----------------------+------------------------+
1 row in set (0.00 sec)

mysql> 

数据文件命名规范的完整语法包括文件名、文件大小、自动扩展属性和max属性:

mysql 复制代码
file_name:file_size[:autoextend[:max:max_file_size]]

通过在 file_size 值后面指定单位 KMG 来设置文件大小,单位为 千字节 、 兆字节 或 千兆字节 。如果以 K 为单位指定文件大小,应设置为1024的倍数。否则,千字节值四舍五入到最接近的兆字节 (MB) ,且文件大小至少为 12MB
指定多个数据文件可以使用分号 ; 分隔。

例如:

mysql 复制代码
# mysqld节点
[mysqld]
# 文件1名称为:ibdata1 大小为50M
# 文件2名称为:ibdata2 大小为50M,自动扩容
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

autoextendmax 属性只能用于最后指定的数据文件,当指定 autoextend 属性时,数据文件的大小会根据需要自动扩容,默认每次增加 64MB

可以通过系统变量innodb_autoextend_increment 控制增量的大小;如果要指定数据文件的最大容量,在autoextend 后面指定 max 属性。

注意:只有在明确了解限制磁盘使用的情况下才使用 max 属性。

下面的配置允许 ibdata1 扩展到 500MB

mysql 复制代码
# mysqld节点
[mysqld]
# 初始大小12M,允许自动扩容,最大可以扩容到500M
innodb_data_file_path=ibdata1:12M:autoextend:max:500M

系统表空间文件默认创建在 data 目录下。如果指定其他的目录,使用innodb_data_home_dir 选项。

注意:修改或指定自定义目录时,一定要检查或设置目录的权限,让MySQL可以进行读写操作,否则就会启动失败。

例如,要在名为 myibdata 的目录下创建一个系统表空间数据文件,可以使用如下配置:

mysql 复制代码
# mysqld节点
[mysqld]
# 指定innodb数据目录
innodb_data_home_dir = /myibdata/
# 配置系统表空间
innodb_data_file_path=ibdata1:50M:autoextend

注意:

指定 innodb_data_home_dir 时,必须以斜杠 / 结尾,InnoDB不会自动创建目录,所以在启动服务器之前要确保指定的目录已经存在,最终通过 innodb_data_home_dir 指定的路径与数据文件名组合起来生成完整路径。例如:上面/myibdata/+ibdata1拼起来。

如果 innodb_data_home_dir 不指定,默认值为" ./ ",即MySQL的数据目录
如果 innodb_data_file_path 指定一个绝对路径,则不会读取 innodb_data_home_dir的值,系统表空间文件根据指定的绝对路径创建,启动服务器之前必须确保指定的目录存在。
在添加新的数据文件时,不要指定现有的文件名,InnoDB在启动服务器时会创建并初始化新的数据文件。
总结:

根据实际应用场景通过配置对应的系统变量来指定数据文件的大小、名称、数量和其他属性。


6.4.4 修改系统表空间配置后什么时候生效?

在修改系统表空间配置时,先停止MySQL服务,修改完成后,再重新启动MySQL服务之后生效。


6.5 独立表空间 - File-Per-Table Tablespace

6.5.1 独立表空间的作用?

File-Per-Table 表空间包含单个InnoDB表的数据和索引,默认情况下每张表都对应一个表空间数据文件,便于维护,所以称为 File-Per-Table Tablespace


6.5.2 独立表空间文件保存在哪里?

File-Per-Table 表空间在 data/database_name/ 目录下的 table_name.ibd 表空间数据文件中创建。 .ibd 文件与表同名。例如,表 test_db.t1 的数据文件,如下所示:

mysql 复制代码
# 选择数据库
USE test_db;
# 建表
CREATE TABLE t1 (
 id INT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(100)
 ) ENGINE = InnoDB;

6.5.3 每个表都对应一个独立表空间吗?

  • 不一定
  • 默认每张表都对应一个表空间数据文件,但也可以通过系统变量 innodb_file_per_table[={OFF|ON}] 控制开启或禁用是否为每张表生成一个独立表空间文件,如果禁用会在系统表空间中创建表;
  • 可以在选项文件中指定 innodb_file_per_table 设置,也可以在运行时使用 SET GLOBAL语句设置
mysql 复制代码
# 选项文件中的mysqld节点
[mysqld]
innodb_file_per_table=OFF # 禁用,强烈不建议

# 在运行时通过SET GLOBAL 设置
mysql> SET GLOBAL innodb_file_per_table=ON;

6.5.4 独立表空间的优点和缺点?

  1. 优点
  • 使用 TRUNCATEDROP 语句删除 File-Per-Table 表空间中的表后,磁盘空间会返回给操作系统,从而提高磁盘利用率,而共享表空间

    比如: System Tablespace 则不会回收磁盘空间,而且在共享表空间中这些空间只能被InnoDB表重新使用;

  • 执行时 TRUNCATE TABLE 时性能更好;(恢复出厂设置)

  • 可以在其他目录或单独的存储设备上创建 File-Per-Table 表空间文件的数据文件,从而达到I/O优化、空间管理或备份的目的;

mysql 复制代码
# 指定DATA directory子句,可以在外部目录中创建表
CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';
  • 支持与 DYNAMICCOMPRESSED 行格式,而系统表空间不支持;
  • 发生数据损坏、备份、二进制日志不可用或MySQL服务器实例无法重新启动时提高成功恢复的机会;
  • 单个表容量大小限制为 64TB ,所以可以存储更多的数据,而共享表空间中的表的总容量为64TB
  1. 缺点
  • 每个表都可能有未使用的空间,这些空间只能由对应的表使用,如果管理不当,可能会导致空间浪费;

  • 当每个表都有自己的数据文件,操作系统需要维护更多的文件描述符,如果表非常多,可能会影响性能;

  • 可能会出现更多的磁盘碎片,会影响 DROP TABLE 表扫描性能;

  • innodb_autoextend_increment 系统变量定义了自动扩展共享表空间文件的增量大小,但对于 File-Per-Table 表空间文件不起作用, File-Per-Table 表空间文件始终自动扩展,初始大小根据表定义分配最小的空间,之后以 4MB 为增量进行扩容。


6.6 撤销表空间 - Undo Tablespaces

6.6.1 撤销表空间的作用?

撤销表空间中包含撤销日志(Undo Log),撤销日志记录了如何撤销事务对聚集索引记录的最新更改(事务的回滚),通过对事务的回滚,从而保证事务ACID特性中的原子性。


6.6.1.1 什么是撤销日志?

介绍完撤销表空间之后将会详细详解撤销日志


6.6.2 在使用MySQL时并没有手动创建撤销表空间,它是什么时候被创建的?

MySQL初始化时会在数据目录下创建两个默认的撤销表空间,数据文件名分别为 undo_001undo_002 ,数据字典中对应undo表空间名称为 innodb_undo_001innodb_undo_002

mysql 复制代码
root@yudukai:/var/lib/mysql# ll
# ...省略
-rw-r-----  1 mysql mysql 16777216 May 29 08:52  undo_001
-rw-r-----  1 mysql mysql 16777216 May 29 08:50  undo_002

总结:

MySQL初始化时会在数据目录下创建两个默认的撤销表空间,数据文件名分别为 undo_001undo_002


6.6.2.1 默认的撤销表空间名称和路径是什么?

要查看撤销表空间名称和路径,请查询 INFORMATION_SCHEMA.FILES

mysql 复制代码
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_001,对应的数据文件为./undo_001
| innodb_undo_002 | ./undo_002 | # 数据字典中的名称为innodb_undo_002,对应的数据文件为./undo_002
+-----------------+------------+
2 rows in set (0.00 sec)

mysql> 

6.6.3 可以手动创建撤销表空间吗?

可以,通过使用 CREATE UNDO TABLESPACE 语句可以创建撤销表空间

mysql 复制代码
# 语法
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';

6.6.3.1 什么时候需要手动创建撤销表空间?

对于长时间运行的大事务,撤销日志可能会变得很大,通过创建额外的撤销表空间来防止单个撤销表空间变得太大,从 MySQL 8.0.14 开始,可以在运行时使用 CREATE UNDO TABLESPACE 语法创建额外的撤销表空间;


6.6.3.2 使用自己创建的撤销表空间需要注意什么?
  • 通过系统变量 innodb_undo_directory 指定撤销表空间的默认存放路径,如果不指定默认位置为数据目录;
  • 撤销表空间文件名必须以 .ibu 为扩展名,定义undo表空间文件名时如果需要指定路径,必须使用绝对路径;不允许指定相对路径,建议使用唯一的撤销表空间文件名,避免在以后移动和复制的过程中发生文件名冲突;
  • 如果指定其他路径,那么路径必须在 innodb_directories 中定义,以便MySQL扫描并识别;
  • 最多支持 127undo 表空间,包括实例初始化时创建的两个默认表空间;
  • MySQL 8.0.23 开始初始撤销表空间大小通常为 16MB,并根据服务器负载以 [16MB, 256MB] 的增量进行扩容;

MySQL 8.0.14 之前版本,额外的撤销表空间通过配置系统变量 innodb_undo_tablespaces 来创建,取值范围[2, 127],MySQL 8.0.14 开始,此变量已弃用且不再可配置。

相关推荐
●VON1 小时前
鸿蒙Flutter实战:Material 3种子色亮暗双主题系统
android·flutter·harmonyos
AOwhisky2 小时前
学习自测(MySQL系列第一期、第二期)
linux·运维·数据库·学习·mysql·云计算
灰鲸广告联盟2 小时前
新老用户广告价值不同?差异化策略如何实现收益最大化
android·开发语言·flutter·ios
念何架构之路2 小时前
存储层技术MySQL
数据库·mysql
yun呐2 小时前
mysql数据库误删恢复
数据库·mysql·adb
j7~2 小时前
【MYSQL】图形化界面使用说明-- MYSQL(workbench)
数据库·mysql·mysql图形化界面·mysqlworkbench
朱涛的自习室2 小时前
逃离“古法测试”:AI 测试的“三大定律”
android·前端·人工智能
QING6182 小时前
Android面试 —— 八股文(一)
android·面试·android jetpack
带娃的IT创业者3 小时前
围墙花园的隐形锁:当 reCAPTCHA 拒绝了“去谷歌化”的 Android 用户
android·隐私安全·人机验证·recaptcha·去谷歌化·grapheneos