#### 15.6.3.1 系统表空间

系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是 file-per-table 或通用表空间中创建的，它还可能包含表和索引数据。在以前的 MySQL 版本中，系统表空间包含`InnoDB`数据字典。在 MySQL 8.0 中，`InnoDB`将元数据存储在 MySQL 数据字典中。看[第 14 章，*MySQL 数据字典*](data-dictionary.html).在以前的 MySQL 版本中，系统表空间还包含双写缓冲区存储区域。自 MySQL 8.0.20 起，此存储区域位于单独的双写文件中。看[第 15.6.4 节，“双写缓冲区”](innodb-doublewrite-buffer.html).

系统表空间可以有一个或多个数据文件。默认情况下，单个系统表空间数据文件，名为`ibdata1`, 在数据目录中创建。系统表空间数据文件的大小和数量由[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)启动选项。有关配置信息，请参阅[系统表空间数据文件配置](innodb-init-startup-configuration.html#innodb-startup-data-file-configuration).

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

-   [调整系统表空间的大小](innodb-system-tablespace.html#innodb-resize-system-tablespace)

-   [为系统表空间使用原始磁盘分区](innodb-system-tablespace.html#innodb-raw-devices)

##### 调整系统表空间的大小

[](<>)

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

###### 增加系统表空间的大小

增加系统表空间大小的最简单方法是将其配置为自动扩展。为此，请指定`自动扩展`最后一个数据文件的属性[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)设置，然后重新启动服务器。例如：

```
innodb_data_file_path=ibdata1:10M:autoextend
```

当。。。的时候`自动扩展`如果指定了属性，则数据文件会在需要空间时自动增加 8MB 的大小。这[`innodb_autoextend_increment`](innodb-parameters.html#sysvar_innodb_autoextend_increment)变量控制增量大小。

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

1.  停止 MySQL 服务器。

2.  如果最后一个数据文件[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)设置是用定义的`自动扩展`属性，删除它，并修改 size 属性以反映当前数据文件的大小。要确定要指定的适当数据文件大小，请检查文件系统的文件大小，然后将该值向下舍入到最接近的 MB 值，其中 MB 等于 1024 x 1024 字节。

3.  将新的数据文件附加到[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)设置，可选择指定`自动扩展`属性。这`自动扩展`只能为最后一个数据文件指定属性[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)环境。

4.  启动 MySQL 服务器。

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


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

假设数据文件随时间增长到 988MB。这是[`innodb_data_file_path`](innodb-parameters.html#sysvar_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`](innodb-parameters.html#sysvar_innodb_data_file_path)从设置`ibdata1:10M:自动扩展`到`ibdata1:12M:自动扩展`启动服务器时产生以下错误：

```
[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`pages) 与配置文件中指定的数据文件大小不同。如果遇到此错误，请恢复以前的[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)设置，并参考系统表空间大小调整说明。

###### 减小 InnoDB 系统表空间的大小

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

有关创建备份的信息，请参阅[第 15.18.1 节，“InnoDB 备份”](innodb-backup.html).

有关为新系统表空间配置数据文件的信息。看[系统表空间数据文件配置](innodb-init-startup-configuration.html#innodb-startup-data-file-configuration).

为避免使用大型系统表空间，请考虑为您的数据使用 file-per-table 表空间或通用表空间。File-per-table 表空间是默认表空间类型，在创建`InnoDB`桌子。与系统表空间不同，file-per-table 表空间在截断或删除时将磁盘空间返回给操作系统。有关详细信息，请参阅[第 15.6.3.2 节，“File-Per-Table 表空间”](innodb-file-per-table-tablespaces.html).通用表空间是多表表空间，也可以用作系统表空间的替代品。看[第 15.6.3.3 节，“通用表空间”](general-tablespaces.html).

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

[](<>)[](<>)

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

使用原始磁盘分区时，请确保运行 MySQL 服务器的用户 ID 具有该分区的读写权限。例如，如果将服务器作为`mysql`用户，分区必须是可读可写的`mysql`.如果运行服务器[`--内存锁`](server-options.html#option_mysqld_memlock)选项，服务器必须运行为`根`, 所以分区必须是可读可写的`根`.

下面描述的过程涉及选项文件修改。有关其他信息，请参阅[第 4.2.2.2 节，“使用选项文件”](option-files.html).

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

1.  创建新数据文件时，指定关键字`纽拉`紧接在数据文件大小之后[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)选项。分区必须至少与您指定的大小一样大。请注意，1MB 在`InnoDB`是 1024 × 1024 字节，而磁盘规格中的 1MB 通常意味着 1,000,000 字节。

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

2.  重新启动服务器。`InnoDB`注意到`纽拉`关键字并初始化新分区。但是，不要创建或更改任何`InnoDB`表呢。否则，下次重新启动服务器时，`InnoDB`重新初始化分区并且您的更改将丢失。（作为安全措施`InnoDB`防止用户在任何分区时修改数据`纽拉`已指定。）

3.  后`InnoDB`已初始化新分区，停止服务器，更改`纽拉`在数据文件规范中`生的`：

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

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

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

在 Windows 系统上，适用于 Linux 和 Unix 系统的相同步骤和随附指南适用，不同之处在于[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)Windows 上的设置略有不同。

1.  创建新数据文件时，指定关键字`纽拉`紧接在数据文件大小之后[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)选项：

    ```
    [mysqld]
    innodb_data_home_dir=
    innodb_data_file_path=//./D::10Gnewraw
    ```

    这`//./`对应于 Windows 语法`\\.\`用于访问物理驱动器。在上面的例子中，`丁：`是分区的驱动器号。

2.  重新启动服务器。`InnoDB`注意到`纽拉`关键字并初始化新分区。

3.  后`InnoDB`已初始化新分区，停止服务器，更改`纽拉`在数据文件规范中`生的`：

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

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