15.6.3.1-系统表空间

系统表空间是change buffer所在的存储区域。它也包含那些在系统表空间而不是独立表空间创建的表的表数据和索引数据。在之前的MySQL版本中,系统表空间包含了InnoDB数据字典。在MySQL8.0里,InnoDB将元数据存储在MySQL数据字典里。可以查阅章节14,MySQL Data Dictionary。在旧版本的MySQL里,系统表空间也包括doublewrite buffer存储区域。从MySQL8.0.20开始,这块存储区域使用了独立的doublewrite文件。请查阅章节15.6.4,“Doublewrite Buffer"。

系统表空间可以有一个或多个数据文件。默认情况下,会在data目录下创建一个名为ibdata1De系统表空间数据文件。系统表空间数据文件大小由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*1024字节。
  3. 在innodb_data_file_path后添加一个新的数据文件,自动扩展属性可选。可以只给最后一个文件设置自动扩展属性。
  4. 启动MySQL服务。 例如,现在表空间有一个自动扩展的数据文件:
innodb_data_home_dir=
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend

假设数据文件已经增长到988MB。下面是修改数据文件大小和指定新的自动增长的数据文件后的配置:

innodb_data_home_dir=
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/iddata2: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_data_file_path配置项恢复原值,然后参考系统表空间大小调整建议。

调小InnoDB系统表空间大小 #

不支持调小一个已存在的系统表空间文件。

要想让系统表空间变小,唯一选项是通过数据备份,在新的数据库实例中还原。在创建新的数据库实例时,设置你期望的系统表空间文件大小。

想了解关于创建备份的信息,请查阅章节15.18.1,“InnoDB Backup”。 想了解为一个新系统表空间设置数据文件的信息,请查阅 系统表空间文件设置

要避免一个巨大的系统表空间,可以考虑使用独立表空间或通用表空间。独立表空间是默认类型,创建InnoDB创建新表时,默认就是这种类型。和系统表空间不同,在重建或删除表时,独立表空间会将磁盘空间返还给操作系统。想了解更多信息,请查阅章节15.6.3.2,“File-Per-Table Tablespaces”。通用表空间是多表共用表空间,也可以被当成系统表空间的替代品。请查阅章节15.6.3.3,”General Tablespaces"。

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

原生磁盘分区可以被当成系统表空间文件使用。这种技术可以在Windows系统和一些Linux级Unix系统上实现无缓冲I/O,不会带来文件系统开销。如果要这么做的话,要进行测试,看在你的系统上,使用和不使用原生磁盘分区是否提高了性能。

使用原生磁盘分区时,确保运行MySQL服务的用户有读写那个磁盘分区的权限。例如,如果是用mysql用户运行的数据库服务,那个分区必须对mysql用户可读可写。如果运行服务时添加了 – memlock 选项,必须使用root用户运行服务,那个分区就必须对root用户可读可写。

下面介绍相关文件的修改,想了解更多信息,请查阅章节4.2.2,“Using Option Files”。

在linux和Unix系统上分配一个原生磁盘分区。 #

  1. 在创建新的数据文件时,在文件大小后指明关键词newraw。这个分区不能小于你指定的文件大小。记得1MB是1024*1024,而磁盘说明中的1MB通常是1,000,000字节。
[mysqld]
innodb_data_dir=
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
  1. 重启服务。InnoDB发现newraw关键词,就会初始化这个新分区。然而不要在创建或者修改任何InnoDB表了。否则,当你再次重启服务时,InnoDB会重新初始化分区,你的变更就会丢失。(这是innodb防止在指定newraw分区时,用户修改数据)。

  2. InnoDB初始化完分区后,停止服务器,将newraw修改为raw:

innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
  1. 重启服务。现在,InnoDB允许进行变更了。

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

在Windows系统上,操作步骤和指导原则和linux及unix操作系统上基本相同,只是在innodb_data_file_path这个配置项有一点点小的差异。

  1. 在创建新的数据文件时,指定关键词keyraw:
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Gnewraw

//./对应windows上访问物理驱动器的语法\.\。在上面的例子中,D: 是分区驱动器标识符。 2. 重启服务。InnoDB发现newraw关键词,初始化新分区。 3. InnoDB初始化完分区后,停止服务,将newraw修改为raw:

[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Graw
  1. 从其服务。现在可以修改了。