当前位置: 首页 > news >正文

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

文章目录

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

file_name:file_size[:autoextend[:max:max_file_size]]

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

指定多个数据文件可以使用分号;分隔。

例如:

# 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

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

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

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

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

# 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的数据文件,如下所示:

# 选择数据库 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语句设置
# 选项文件中的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优化、空间管理或备份的目的;

# 指定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

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> 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语句可以创建撤销表空间

# 语法 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开始,此变量已弃用且不再可配置。

http://www.rkmt.cn/news/1456886.html

相关文章:

  • TestDisk与PhotoRec:开源数据恢复双雄的终极完整指南
  • 什么叫无状态
  • 三星手机怎么连接 Windows 电脑?5 种实用连接方法
  • 今日开源[第5期]Headroom - zhang
  • 3分钟掌握IDM激活脚本:开源工具实现永久免费下载加速
  • 2026年反渗透膜厂家推荐榜单:超高压/节能型/商业/工业/家用反渗透膜及反渗透膜片品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • 不止于同步:用chrony在CentOS 9上打造高精度内网时间服务器(含sourcestats详解)
  • 2026年山东虾红火烧板主流生产厂家综合盘点:10,30路沿石/五莲红火烧板/五莲花火烧板/大理石火烧板/大理石路缘石/选择指南 - 优质品牌商家
  • 性能与价格的双重平衡:主流UNS S17400厂商横向评测 - 品牌2026
  • 额度对半砍?腾讯、字节员工发现,大模型Token额度正在“降本增效”
  • ssm智能卤菜销售平台(10157)
  • AI热潮下一二级市场合并:VC像PE、天使在消失,投资风格巨变!
  • 2026年自动剪辑系统怎么用AI实现:从素材处理到成片输出的自动化落地指南 - 广州矩阵架构科技公司
  • 2026年基建配套海运集装箱实测评测:桐乡,平湖,湖州,桐乡打包集装箱/桐乡活动板房集装箱/桐乡海运集装箱/桐乡焊接集装箱/选择指南 - 优质品牌商家
  • 重庆家庭水管漏水维修可靠公司排行实测盘点:重庆家庭水管漏水检测维修上门/重庆检测漏水检测/重庆水管漏水检测维修/选择指南 - 优质品牌商家
  • GitHub 上 Stars 最多的 6 个开源 AI 工具:让 AI Agent 更强大
  • 外呼接通率暴跌?不是号码问题,是AI工具链断点在第3.2秒——基于17.8万通通话日志的根因定位
  • 2026 清远卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科
  • 利用废旧ATX电源DIY低成本高性能可调实验室电源
  • 西藏美尚美装饰收费标准是什么?靠谱吗? - myqiye
  • 云克隆科研干货|蛋白/抗体四大常用标记方法原理及应用详解
  • 如何快速激活Adobe CC:Adobe-GenP 3.0终极完整指南
  • 【AI音频系统整合黄金法则】:20年实战总结的7大避坑指南与实时降噪落地方案
  • 终极指南:用Mousecape轻松定制macOS光标主题
  • 2026 绍兴卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科
  • 云克隆WB实验避坑指南|电泳、转膜、曝光常见异常问题及全套解决方案
  • 数据丢失的终极救星:TestDisk与PhotoRec完整恢复指南
  • 2026年杭州做AI获客项目品牌哪家好? - mypinpai
  • 【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解
  • 2026 宁波卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科