InnoDB表空间之系统表空间

213 阅读6分钟

InnoDB表空间之系统表空间

系统表空间是InnoDB数据字典,双写缓冲区,更改缓冲区和撤消日志的存储区域 。如果在系统表空间中创建表,而不是在每个表文件或常规表空间中创建表,则它也可能包含表和索引数据。

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

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

调整系统表空间的大小

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

增加系统表空间的大小

增加系统表空间大小的最简单方法是将其配置为自动扩展。为此,请autoextend为设置中的最后一个数据文件指定 属性innodb_data_file_path ,然后重新启动服务器。例如:

innodb_data_file_path=ibdata1:10M:autoextend

autoextend指定的属性,则数据文件自动大小由8MB增量因为需要空间增加。所述 innodb_autoextend_increment 可变控制增量大小。

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

  1. 停止MySQL服务器。
  2. 如果innodb_data_file_path 使用autoextend 属性定义了设置中的最后一个数据文件,则将 其删除,然后修改size属性以反映当前数据文件的大小。要确定要指定的适当数据文件大小,请检查文件系统中的文件大小,并将该值四舍五入为最接近的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。这是innodb_data_file_path 修改大小属性以反映当前数据文件大小之后,并指定新的50MB自动扩展数据文件之后的设置:

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend

添加新数据文件时,请勿指定现有文件名。InnoDB启动服务器时,将创建并初始化新的数据文件。

注意

您不能通过更改大小属性来增加现有系统表空间数据文件的大小。例如,在启动服务器时,将innodb_data_file_path设置从更改 ibdata1:10M:autoextendibdata1: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页面大小由innodb_page_size变量定义 。默认值为16384字节。

减少InnoDB系统表空间的大小

您不能从系统表空间中删除数据文件。要减小系统表空间大小,请使用以下过程:

  1. 使用mysqldump转储所有 InnoDB表,包括 模式中的InnoDBmysql。使用以下查询标识 模式中的InnoDBmysql

    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 |
    +---------------------------+
    
  2. 停止服务器。

  3. 删除所有现有的表空间文件(*.ibd),包括 ibdataib_log 文件。不要忘记删除 架构*.ibd 中表的文件mysql

  4. 删除表的所有.frm文件 InnoDB

  5. 为新系统表空间配置数据文件。请参阅 系统表空间数据文件配置

  6. 重新启动服务器。

  7. 导入转储文件。

注意

如果您的数据库仅使用InnoDB 引擎,则转储所有数据库,停止服务器,删除所有数据库和InnoDB日志文件,重新启动服务器以及导入转储文件可能更简单 。

为避免使用较大的系统表空间,请考虑为数据使用每表文件表空间。每表文件表空间是默认表空间类型,在创建InnoDB表时隐式使用 。与系统表空间不同,磁盘空间在截断或删除在每个表文件表空间中创建的表后会返回到操作系统。有关更多信息,请参见 “每表文件表空间”

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

您可以将原始磁盘分区用作InnoDB 系统表空间中的数据文件 。此技术可在Windows以及某些Linux和Unix系统上启用无缓冲的I / O,而不会增加文件系统的开销。在有和没有原始分区的情况下执行测试,以验证此更改是否确实提高了系统性能。

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

下述步骤涉及选项文件的修改。有关更多信息,请参见“使用选项文件”

在Linux和Unix系统上分配原始磁盘分区
  1. 创建新的数据文件时,请在newrawinnodb_data_file_path 选项的数据文件大小后立即 指定关键字 。分区必须至少与您指定的大小一样大。请注意,1MB in InnoDB 是1024×1024字节,而磁盘规格中的1MB通常意味着1,000,000字节。

    [mysqld]
    innodb_data_home_dir=
    innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
    
  2. 重新启动服务器。InnoDB注意 newraw关键字并初始化新分区。但是,请不要创建或更改任何 InnoDB表。否则,当您下次重新启动服务器时,将InnoDB 重新初始化分区,并且所做的更改将丢失。(为安全起见,InnoDBnewraw指定任何分区时,防止用户修改数据 。)

  3. InnoDB已初始化新的分区,停止服务器,更改newraw 数据文件规范raw

    [mysqld]
    innodb_data_home_dir=
    innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
    
  4. 重新启动服务器。InnoDB现在允许进行更改。

在Windows上分配原始磁盘分区

在Windows系统上,适用于Linux和Unix系统的相同步骤和随附的准则,只是innodb_data_file_pathWindows上的 设置略有不同。

  1. 创建新的数据文件时,请在newrawinnodb_data_file_path 选项的数据文件大小之后立即 指定关键字 :

    [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
    
  4. 重新启动服务器。InnoDB现在允许进行更改。

更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。

qrcode_for_gh_3214f9e3470a_258.jpg