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转储所有
InnoDB
table,包括位于mysql
模式中的InnoDB
table。使用以下查询在mysql
模式中标识InnoDB
table:
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
),包括ibdata
和ib_log
文件。不要忘记删除mysql
模式中的 table 的*.ibd
文件。 -
删除
InnoDB
个 table 的所有.frm
个文件。 -
为新系统 table 空间配置数据文件。参见系统 table 空间数据文件配置。
-
重新启动服务器。
-
导入转储文件。
Note
如果您的数据库仅使用InnoDB
引擎,则转储所有数据库,停止服务器,删除所有数据库和InnoDB
日志文件,重新启动服务器以及导入转储文件可能更简单。
为避免使用较大的系统 table 空间,请考虑为数据使用每 table 文件 table 空间。每 table 文件 table 空间是默认 table 空间类型,在创建InnoDB
table 时隐式使用。与系统 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
关键字并初始化新分区。但是,请不要创建或更改任何InnoDB
table。否则,当您下次重新启动服务器时,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
现在允许进行更改。