系统表空间是
InnoDB
数据字典、doublewrite buffer、change buffer和undo logs的存储区。如果表是在系统表空间而不是 file-per-table 或通用表空间中创建的,它还可能包含表和索引数据。
系统表空间可以有一个或多个数据文件。默认情况下,
ibdata1
在数据目录中创建名为 的单个系统表空间数据文件。系统表空间数据文件的大小和数量由innodb_data_file_path
启动选项定义。有关配置信息,请参阅
系统表空间数据文件配置。
有关系统表空间的其他信息在本节的以下主题下提供:
本节介绍如何增加或减少系统表空间的大小。
增加系统表空间的大小
增加系统表空间大小的最简单方法是将其配置为自动扩展。为此,请
autoextend
在设置中指定最后一个数据文件的属性innodb_data_file_path
,然后重新启动服务器。例如:
innodb_data_file_path=ibdata1:10M:autoextend
指定该autoextend
属性后,数据文件的大小会根据需要的空间自动增加 8MB。该
innodb_autoextend_increment
变量控制增量大小。
您还可以通过添加另一个数据文件来增加系统表空间的大小。为此:
停止 MySQL 服务器。
如果设置中的最后一个数据文件
innodb_data_file_path
是用该autoextend
属性定义的,则将其删除,并修改大小属性以反映当前数据文件的大小。要确定要指定的适当数据文件大小,请检查文件系统的文件大小,并将该值向下舍入到最接近的 MB 值,其中 MB 等于 1024 x 1024 字节。将新数据文件附加到
innodb_data_file_path
设置中,可选择指定autoextend
属性。autoextend
只能为设置中的最后一个数据文件指定 属性innodb_data_file_path
。启动 MySQL 服务器。
例如,这个表空间有一个自动扩展的数据文件:
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend
假设数据文件随时间增长到 988MB。这是innodb_data_file_path
修改 size 属性以反映当前数据文件大小并指定新的 50MB 自动扩展数据文件后的设置:
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
设置,并参考系统表空间调整说明。
减小 InnoDB 系统表空间的大小
您不能从系统表空间中删除数据文件。要减小系统表空间大小,请使用以下过程:
使用mysqldump转储所有
InnoDB
表,包括InnoDB
位于mysql
模式中的表。使用以下查询 识别 架构中的InnoDB
表 :mysql
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 | +---------------------------+
停止服务器。
删除所有现有的表空间文件 (
*.ibd
),包括ibdata
和ib_log
文件。不要忘记删除*.ibd
位于mysql
模式中的表的文件。删除表的所有
.frm
文件InnoDB
。为新的系统表空间配置数据文件。请参阅 系统表空间数据文件配置。
重新启动服务器。
导入转储文件。
如果您的数据库只使用该引擎,转储所有数据库、停止服务器、删除所有数据库和日志文件、重新启动服务器并导入转储文件
InnoDB
可能会更简单
。InnoDB
为避免大型系统表空间,请考虑为您的数据使用 file-per-table 表空间或通用表空间。File-per-table 表空间是默认的表空间类型,在创建InnoDB
表时隐式使用。与系统表空间不同,file-per-table 表空间在被截断或删除时将磁盘空间返回给操作系统。有关详细信息,请参阅
第 14.6.3.2 节,“File-Per-Table 表空间”。通用表空间是多表表空间,也可以用作系统表空间的替代。请参阅
第 14.6.3.3 节,“通用表空间”。
原始磁盘分区可以用作系统表空间数据文件。此技术可在 Windows 和某些 Linux 和 Unix 系统上启用非缓冲 I/O,而无需文件系统开销。使用和不使用原始分区执行测试以验证它们是否提高了系统性能。
使用原始磁盘分区时,请确保运行 MySQL 服务器的用户标识对该分区具有读写权限。例如,如果以
mysql
用户身份运行服务器,则分区必须可读写mysql
。如果使用该--memlock
选项运行服务器,则服务器必须运行为root
,因此分区必须可以由 读取和写入root
。
下面描述的过程涉及选项文件修改。有关其他信息,请参阅第 4.2.2.2 节,“使用选项文件”。
在 Linux 和 Unix 系统上分配原始磁盘分区
创建新数据文件时,
newraw
在选项的数据文件大小后立即 指定关键字innodb_data_file_path
。该分区必须至少与您指定的大小一样大。请注意,1MB inInnoDB
是 1024 × 1024 字节,而磁盘规格中的 1MB 通常表示 1,000,000 字节。[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
重新启动服务器。
InnoDB
注意newraw
关键字并初始化新分区。但是,暂时不要创建或更改任何InnoDB
表。否则,当您下次重新启动服务器时,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 系统的相同步骤和随附指南,只是
innodb_data_file_path
设置在 Windows 上略有不同。
创建新数据文件时,
newraw
在选项的数据文件大小之后 指定关键字innodb_data_file_path
:[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
现在允许进行更改。