【MySQL精通之路】InnoDB(6)-磁盘结构(3)-表空间

发布于:2024-05-22 ⋅ 阅读:(139) ⋅ 点赞:(0)

主博客:

【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客

上一篇:

【MySQL精通之路】Innodb-索引-CSDN博客

下一篇:

【MySQL精通之路】InnoDB-双写缓冲区-CSDN博客

目录

1 系统表空间

1.1 调整系统表空间的大小

1.1.1 增加

1.1.2 减小

1.1.3 为系统表空间使用原始磁盘分区

1.1.4 在Linux和Unix系统上分配原始磁盘分区

1.1.5 在Windows上分配原始磁盘分区

2 FPT表空间

2.1 配置

2.2 FPT表空间数据文件

2.3 FPT表空间优势

2.4 FPT表空间缺点

3 一般表空间

4 Undo表空间

5 临时表空间

6 服务器脱机时移动表空间文件

7 禁用表空间路径验证

8 优化Linux上的表空间分配

9 表空间AUTOEXTEND_SIZE配置


1 系统表空间

系统表空间是更改缓冲区的存储区域。如果表是在系统表空间中创建的,而不是按文件表或通用表空间创建的,那么它也可能包含表和索引数据。在以前的MySQL版本中,系统表空间包含InnoDB数据字典。在MySQL 8.0中,InnoDB将元数据存储在MySQL数据字典中。请参阅第16章MySQL数据字典。在以前的MySQL版本中,系统表空间也包含双写缓冲区存储区域。从MySQL 8.0.20开始,此存储区域位于单独的双写文件中。参见第17.6.4节“双写缓冲区”。

系统表空间可以有一个或多个数据文件。默认情况下,在数据目录中创建一个名为ibdata1的系统表空间数据文件。系统表空间数据文件的大小和数量由innodb_data_file_path启动选项定义。有关配置信息,请参阅系统表空间数据文件配置。

有关系统表空间的其他信息在本节的以下主题下提供:

1.1 调整系统表空间的大小

1.1.1 增加

增加系统表空间大小的最简单方法是将其配置为自动扩展。为此,请在innodb_data_file_path设置中为最后一个数据文件指定autoextend属性,然后重新启动服务器。例如

innodb_data_file_path=ibdata1:10M:autoextend

当指定了autoextend属性时,数据文件的大小会根据需要自动增加8MB。innodb_autoextend_increment变量控制增量大小。

您还可以通过添加另一个数据文件来增加系统表空间的大小。为此:

1.停止MySQL服务器。

2.如果innodb_data_file_path设置中的最后一个数据文件是用autoextend属性定义的,请将其删除,然后修改size属性以反映当前数据文件的大小。要确定要指定的适当数据文件大小,请检查文件系统中的文件大小,然后将该值四舍五入到最接近的MB值,其中MB等于1024 x 1024字节。

3.将一个新的数据文件附加到innodb_data_file_path设置,可以选择指定自动扩展属性。只能为innodb_data_file_path设置中的最后一个数据文件指定autoextend属性。

4.启动MySQL服务器。

例如,这个表空间有一个自动扩展的数据文件:

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend

假设随着时间的推移,数据文件已增长到988MB。这是在修改大小属性以反映当前数据文件大小,并指定新的50MB自动扩展数据文件后的innodb_data_file_path设置:

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend

添加新的数据文件时,不要指定现有的文件名。当您启动服务器时,InnoDB会创建并初始化新的数据文件。

注意:
不能通过更改现有系统表空间数据文件的大小属性来增加其大小。

例如,在启动服务器时,将innodb_data_file_path设置从ibdata1:10M:autoextend更改为ibdata1:12M:autoextend会产生以下错误:

[ERROR] [MY-012263] [InnoDB] The Auto-extending innodb_system
data file './ibdata1' is of a different size 640 pages (rounded down to MB) than
specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!

该错误表示现有数据文件大小(以InnoDB页面表示)与配置文件中指定的数据文件大小不同。如果遇到此错误,请恢复以前的innodb_data_file_path设置,并参考系统表空间大小调整说明。

1.1.2 减小

不支持减小现有系统表空间的大小。

实现较小系统表空间的唯一选择是将数据从备份恢复到使用所需系统表空间大小配置创建的新MySQL实例。

有关创建备份的信息,请参阅“InnoDB备份”。

有关为新系统表空间配置数据文件的信息

请参阅系统表空间数据文件配置。

为了避免大的系统表空间,请考虑为数据使用逐表文件表空间或通用表空间。

每个表的文件表空间是默认的表空间类型,在创建InnoDB表时隐式使用。

与系统表空间不同,每表文件表空间在被截断或删除时会将磁盘空间返回给操作系统。

有关更多信息,请参阅“每个表的文件表空间”。

通用表空间是多表表空间,也可以用作系统表空间的替代方案。

参见“通用表空间”。

1.1.3 为系统表空间使用原始磁盘分区

原始磁盘分区可以用作系统表空间数据文件。这项技术在Windows以及一些Linux和Unix系统上实现了无缓冲I/O,而没有文件系统开销。使用和不使用原始分区执行测试,以验证它们是否能提高系统性能。

使用原始磁盘分区时,请确保运行MySQL服务器的用户ID具有该分区的读写权限。例如,如果以mysql用户的身份运行服务器,则分区必须是mysql可读写的。如果使用--memlock选项运行服务器,则服务器必须以root身份运行,因此分区必须是root可读写的。

下面描述的过程涉及选项文件修改。有关更多信息,请参见“使用配置文件”。

【MySQL精通之路】MySQL的使用(2)-配置-CSDN博客

1.1.4 在Linux和Unix系统上分配原始磁盘分区

要将原始设备用于新的服务器实例,首先通过使用raw关键字设置innodb_data_file_path来准备配置文件。例如

[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw

分区必须至少与您指定的大小一样大。请注意,InnoDB中的1MB是1024×1024字节,而磁盘规范中的1MB通常意味着1000000字节。

然后使用--initialize或--initialize-unsecurity首次初始化服务器。InnoDB注意到raw关键字并初始化新分区,然后停止服务器。

现在重新启动服务器。InnoDB现在允许进行更改。

1.1.5 在Windows上分配原始磁盘分区

在Windows系统上,除了innodb_data_file_path设置在Windows上略有不同之外,适用于Linux和Unix系统的相同步骤和附带指南。例如

[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Graw

这个对应于\\的Windows语法。\用于访问物理驱动器。在上面的例子中,D:是分区的驱动器号。

2 FPT表空间

每个表的文件表空间包含单个InnoDB表的数据和索引,并存储在文件系统中的单个数据文件中。

本节中的以下主题介绍了每个表的文件表空间特征:

2.1 配置

默认情况下,InnoDB在file-per-table表空间中创建表。

此行为由innodb_file_per_table变量控制。

禁用innodb_file_per_table会导致innodb在系统表空间中创建表。

innodb_file_per_table设置可以在配置文件中指定,也可以在运行时使用SET GLOBAL语句进行配置。

在运行时更改设置需要足够的权限来设置全局系统变量。请查阅“系统变量权限”。

【MySQL精通之路】系统变量-系统变量权限-CSDN博客

配置文件:

[mysqld]
innodb_file_per_table=ON

在运行时使用SET GLOBAL:

mysql> SET GLOBAL innodb_file_per_table=ON;

2.2 FPT表空间数据文件

在MySQL数据目录下的模式目录中的.ibd数据文件中创建每个表空间的文件。

.ibd文件是以表(table_name.ibd)命名的。

例如,test.t1表的数据文件是在MySQL数据目录下的测试目录中创建的:

mysql> USE test;

mysql> CREATE TABLE t1 (
   id INT PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(100)
 ) ENGINE = InnoDB;

$> cd /path/to/mysql/data/test
$> ls
t1.ibd

您可以使用CREATE TABLE语句DATA DIRECTORY子句在数据目录之外隐式地为每个表表空间的数据文件创建一个文件。

有关更多信息,请参阅“从外部创建表”。

2.3 FPT表空间优势

与共享表空间(如系统表空间或通用表空间)相比,每个表的文件表空间具有以下优势:

FPT表空间截断或删除文件中创建的表后,磁盘空间会返回到操作系统。截断或删除存储在共享表空间中的表会在共享表表空间数据文件中创建可用空间,该文件只能用于InnoDB数据。换句话说,在表被截断或删除后,共享表空间数据文件的大小不会缩小。

对驻留在共享表空间中的表执行表复制ALTER table操作会增加该表空间占用的磁盘空间量。这样的操作可能需要与表中的数据加上索引一样多的额外空间。此空间不会像FPT表空间那样释放回操作系统。

TRUNCATE TABLE在驻留在FPT表空间中的表上执行时性能更好。

FPT表空间数据文件可以在单独的存储设备上创建,用于I/O优化、空间管理或备份目的。参见“从外部创建表格”。

您可以从另一个MySQL实例导入一个表,该表位于FPT表空间中。

参见“导入InnoDB表”。

FPT表空间中创建的表支持与DYNAMICCOMPRESED行格式相关的功能,而系统表空间不支持这些功能。

参见“InnoDB行格式”。

当发生数据损坏、备份或二进制日志不可用或MySQL服务器实例无法重新启动时,存储在单个表空间数据文件中的表可以节省时间并提高成功恢复的机会。

FPT表空间中创建的表可以使用MySQL Enterprise Backup快速备份或恢复,而不会中断其他InnoDB表的使用。这对于备份计划不同或需要备份频率较低的表是有益的。

有关详细信息,请参阅进行部分备份。

FPT表空间允许通过监视表空间数据文件的大小来监视文件系统上的表大小。

当innodb_flush_method设置为O_DIRECT时,常见的Linux文件系统不允许对单个文件(如共享表空间数据文件)进行并发写入。因此,当将FPT表空间与此设置结合使用时,可能会提高性能。

共享表空间中的表的大小受64TB表空间大小限制。相比之下,FPT表空间的每个文件都有64TB的大小限制,这为单个表的大小增长提供了充足的空间

2.4 FPT表空间缺点

与共享表空间(如系统表空间或通用表空间)相比,FPT表空间有以下缺点。

对于FPT表空间FPT表空间有未使用的空间,这些空间只能由同一表的行使用,如果管理不当,可能会导致空间浪费。

fsync操作是在多个逐表文件的数据文件上执行的,而不是在一个共享的表空间数据文件上。由于fsync操作是按文件进行的,因此无法组合多个表的写入操作,这可能会导致fsync操作的总数增加。

mysqld必须为FPT表空间每个文件保留一个打开的文件句柄,如果在FPT表空间有许多表,这可能会影响性能。

FPT表空间有自己的数据文件时,需要更多的文件描述符。

存在更多碎片的可能性,这可能会阻碍DROP TABLE和表扫描性能。但是,如果碎片得到管理,则FPT表空间可以提高这些操作的性能。

FPT表空间中删除文件中的表时,会扫描缓冲池,对于大型缓冲池,这可能需要几秒钟的时间。扫描是用宽的内部锁定执行的,这可能会延迟其他操作。

innodb_autoextend_increment变量定义了增量大小,用于在自动扩展共享表空间文件变满时扩展该文件的大小。

该变量不适用于FPT表空间文件,这些文件是自动扩展的,无论innodb_utoextend_incament设置如何。FPT表空间扩展是少量的,之后扩展以4MB的增量出现。

3 一般表空间

4 Undo表空间

5 临时表空间

6 服务器脱机时移动表空间文件

7 禁用表空间路径验证

8 优化Linux上的表空间分配

9 表空间AUTOEXTEND_SIZE配置


本节介绍与InnoDB表空间相关的主题。


网站公告

今日签到

点亮在社区的每一天
去签到