文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  系统表空间

17.6.3.1 系统表空间

系统表空间是变更缓冲区的存储区域。如果在系统表空间中创建表而不是每个表一个文件或通用表空间,它也可能包含表和索引数据。

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

有关系统表空间的更多信息,请参阅本节中的以下主题

调整系统表空间的大小

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

增大系统表空间的大小

增大系统表空间大小最简单的方法是将其配置为自动扩展。为此,请在 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 属性定义的,请将其删除,并将大小属性修改为反映当前数据文件大小。要确定要指定的数据文件大小,请检查您的文件系统以获取文件大小,并将该值向下舍入到最接近的 MB 值,其中一个 MB 等于 1024 x 1024 字节。

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

  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 设置,并参考系统表空间调整大小说明。

减小 InnoDB 系统表空间的大小

不支持缩减现有系统表空间的大小。要获得较小的系统表空间,唯一的选择是从备份中恢复数据到使用所需系统表空间大小配置创建的新 MySQL 实例。

有关创建备份的信息,请参见 第 17.18.1 节,“InnoDB 备份”

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

为了避免大型系统表空间,请考虑对数据使用每个表表空间或通用表空间。每个表表空间是默认的表空间类型,在创建 InnoDB 表时隐式使用。与系统表空间不同,每个表表空间在截断或删除时会将磁盘空间返回给操作系统。有关详细信息,请参见 第 17.6.3.2 节,“每个表表空间”。通用表空间是多表表空间,也可以用作系统表空间的替代方案。请参见 第 17.6.3.3 节,“通用表空间”

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

原始磁盘分区可用作系统表空间数据文件。此技术允许在 Windows 以及某些 Linux 和 Unix 系统上进行非缓冲 I/O,而无需文件系统开销。在使用和不使用原始分区的情况下进行测试,以验证它们是否会提高您系统上的性能。

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

以下描述的步骤涉及选项文件修改。有关其他信息,请参见 第 6.2.2.2 节,“使用选项文件”

在 Linux 和 Unix 系统上分配原始磁盘分区
  1. 要为新服务器实例使用原始设备,请首先通过使用 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 通常表示 1,000,000 字节。

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

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

在 Windows 上分配原始磁盘分区

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

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

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