14.6.3.1 系统 table 空间

系统 table 空间是InnoDB数据字典,双写缓冲区,更改缓冲区和撤消日志的存储区域。如果在系统 table 空间中创建 table,而不是在每个 table 文件或常规 table 空间中创建 table,则它也可能包含 table 和索引数据。

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

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

调整系统 table 空间的大小

本节介绍如何增加或减少系统 table 空间的大小。

增加系统 table 空间的大小

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

innodb_data_file_path=ibdata1:10M:autoextend

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

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

  • 停止 MySQL 服务器。

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

  • 将新的数据文件追加到innodb_data_file_path设置,可以选择指定autoextend属性。只能为innodb_data_file_path设置中的最后一个数据文件指定autoextend属性。

  • 启动 MySQL 服务器。

例如,此 table 空间具有一个自动扩展数据文件:

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在启动服务器时创建并初始化新的数据文件。

Note

您不能通过更改其大小属性来增加现有系统 table 空间数据文件的大小。例如,将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!

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

InnoDB页面大小由innodb_page_size变量定义。默认值为 16384 字节。

减小 InnoDB 系统 table 空间的大小

您不能从系统 table 空间中删除数据文件。要减小系统 table 空间大小,请使用以下过程:

  • 使用mysqldump转储所有InnoDBtable,包括位于mysql模式中的InnoDBtable。使用以下查询在mysql模式中标识InnoDBtable:
mysql> SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB';
+---------------------------+
| TABLE_NAME                |
+---------------------------+
| engine_cost               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| plugin                    |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
+---------------------------+
  • 停止服务器。

  • 删除所有现有的 table 空间文件(*.ibd),包括ibdataib_log文件。不要忘记删除mysql模式中的 table 的*.ibd文件。

  • 删除InnoDB个 table 的所有.frm个文件。

  • 为新系统 table 空间配置数据文件。参见系统 table 空间数据文件配置

  • 重新启动服务器。

  • 导入转储文件。

Note

如果您的数据库仅使用InnoDB引擎,则转储所有数据库,停止服务器,删除所有数据库和InnoDB日志文件,重新启动服务器以及导入转储文件可能更简单。

为避免使用较大的系统 table 空间,请考虑为数据使用每 table 文件 table 空间。每 table 文件 table 空间是默认 table 空间类型,在创建InnoDBtable 时隐式使用。与系统 table 空间不同,截断或删除在每个 table 文件 table 空间中创建的 table 后,磁盘空间会返回到 os。有关更多信息,请参见第 14.6.3.2 节“每 table 文件 table 空间”

对系统 table 空间使用原始磁盘分区

您可以在InnoDB system tablespace中将原始磁盘分区用作数据文件。此技术可在 Windows 以及某些 Linux 和 Unix 系统上启用无缓冲的 I/O,而不会增加文件系统的开销。在有和没有原始分区的情况下执行测试,以验证此更改是否确实提高了系统性能。

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

下述步骤涉及选项文件的修改。有关更多信息,请参见第 4.2.2.2 节“使用选项文件”

在 Linux 和 Unix 系统上分配原始磁盘分区
  • 创建新数据文件时,请在innodb_data_file_path选项的数据文件大小后立即指定关键字newraw。分区必须至少与您指定的大小一样大。请注意,InnoDB中的 1MB 为 1024×1024 字节,而磁盘规格中的 1MB 通常意味着 1,000,000 字节。
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
  • 重新启动服务器。 InnoDB注意到newraw关键字并初始化新分区。但是,请不要创建或更改任何InnoDBtable。否则,当您下次重新启动服务器时,InnoDB重新初始化该分区,并且所做的更改将丢失。 (作为安全措施,InnoDB可以防止用户在指定带有newraw的任何分区时修改数据.)

  • InnoDB初始化新分区后,停止服务器,将数据文件规范中的newraw更改为raw

[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
  • 重新启动服务器。 InnoDB现在允许进行更改。
在 Windows 上分配原始磁盘分区

在 Windows 系统上,适用于 Linux 和 Unix 系统的相同步骤和随附的准则适用于 Windows,但innodb_data_file_path设置略有不同。

  • 创建新的数据文件时,请在innodb_data_file_path选项的数据文件大小后立即指定关键字newraw
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Gnewraw

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

  • 重新启动服务器。 InnoDB注意到newraw关键字并初始化新分区。

  • InnoDB初始化新分区后,停止服务器,将数据文件规范中的newraw更改为raw

[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Graw
  • 重新启动服务器。 InnoDB现在允许进行更改。