MySQL8 中文参考(七十二)
17.10 InnoDB 行格式
表的行格式决定了其行是如何物理存储的,进而影响查询和 DML 操作的性能。当更多行适合存储在单个磁盘页中时,查询和索引查找可以更快地工作,缓冲池中需要更少的缓存内存,并且写出更新值所需的 I/O 也更少。
每个表中的数据被分成页。构成每个表的页被排列在一种称为 B 树索引的树数据结构中。表数据和辅助索引都使用这种类型的结构。代表整个表的 B 树索引被称为聚簇索引,根据主键列组织。聚簇索引数据结构的节点包含行中所有列的值。辅助索引结构的节点包含索引列和主键列的值。
变长列是存储在 B 树索引节点中的列值的一个例外。太长以至于无法适应 B 树页的变长列存储在称为溢出页的单独分配的磁盘页上。这样的列被称为离页列。离页列的值存储在溢出页的单链列表中,每个这样的列都有自己的一个或多个溢出页列表。根据列长度,变长列值的全部或前缀存储在 B 树中,以避免浪费存储空间并且需要读取一个单独的页。
InnoDB 存储引擎支持四种行格式:冗余,紧凑,动态 和 压缩。
表 17.15 InnoDB 行格式概述
| 行格式 | 紧凑存储特性 | 增强的可变长度列存储 | 大索引键前缀支持 | 压缩支持 | 支持的表空间类型 |
|---|---|---|---|---|---|
冗余 | 否 | 否 | 否 | 否 | 系统,每表一个文件,通用 |
紧凑 | 是 | 否 | 否 | 否 | 系统,每表一个文件,通用 |
动态 | 是 | 是 | 是 | 否 | 系统,每表一个文件,通用 |
压缩 | 是 | 是 | 是 | 是 | 每表一个文件,通用 |
接下来的主题描述了行格式存储特性以及如何定义和确定表的行格式。
-
冗余行格式
-
紧凑行格式
-
动态行格式
-
压缩行格式
-
定义表的行格式
-
确定表的行格式
REDUNDANT 行格式
REDUNDANT格式与 MySQL 的旧版本兼容。
使用REDUNDANT行格式的表将变长列值(VARCHAR、VARBINARY和BLOB和TEXT类型)的前 768 字节存储在 B 树节点内的索引记录中,其余部分存储在溢出页上。大于或等于 768 字节的固定长度列被编码为变长列,可以存储在页外。例如,如果字符集的最大字节长度大于 3,CHAR(255)列可能超过 768 字节,就像utf8mb4一样。
如果列的值为 768 字节或更少,则不使用溢出页,可能会节省一些 I/O,因为该值完全存储在 B 树节点中。这对于相对较短的BLOB列值效果很好,但可能导致 B 树节点填满数据而不是键值,降低其效率。具有许多BLOB列的表可能导致 B 树节点变得过满,并包含太少行,使整个索引比行较短或列值存储在页外时效率低。
REDUNDANT 行格式存储特性
REDUNDANT行格式具有以下存储特性:
-
每个索引记录包含一个 6 字节的头部。头部用于链接连续的记录,并用于行级锁定。
-
聚簇索引中的记录包含所有用户定义的列字段。此外,还有一个 6 字节的事务 ID 字段和一个 7 字节的回滚指针字段。
-
如果表没有定义主键,则每个聚簇索引记录还包含一个 6 字节的行 ID 字段。
-
每个二级索引记录包含所有未在二级索引中的聚簇索引键定义的主键列。
-
记录包含对记录的每个字段的指针。如果记录中字段的总长度小于 128 字节,则指针为一个字节;否则为两个字节。指针数组称为记录目录。指针指向的区域是记录的数据部分。
-
在内部,像
CHAR(10)这样的固定长度字符列以固定长度格式存储。在VARCHAR列中不会截断尾随空格。 -
大于或等于 768 字节的固定长度列被编码为变长列,可以存储在页外。例如,如果字符集的最大字节长度大于 3,
CHAR(255)列可能超过 768 字节,就像utf8mb4一样。 -
SQL 中的
NULL值在记录目录中保留一到两个字节。如果存储在可变长度列中,则 SQL 中的NULL值在记录的数据部分中不保留任何字节。对于固定长度列,列的固定长度在记录的数据部分中保留。为NULL值保留固定空间允许列在位更新为非NULL值而不会导致索引页碎片化。
紧凑行格式
与REDUNDANT行格式相比,COMPACT行格式将行存储空间减少约 20%,但会增加某些操作的 CPU 使用率。如果您的工作负载是受缓存命中率和磁盘速度限制的典型工作负载,COMPACT格式可能更快。如果工作负载受 CPU 速度限制,则紧凑格式可能较慢。
使用COMPACT行格式的表将变长列值(VARCHAR、VARBINARY和BLOB和TEXT类型)的前 768 字节存储在 B 树节点内的索引记录中,其余部分存储在溢出页上。大于或等于 768 字节的固定长度列被编码为可变长度列,可以存储在页外。例如,如果字符集的最大字节长度大于 3,那么CHAR(255)列可能超过 768 字节,就像utf8mb4一样。
如果列的值为 768 字节或更少,则不使用溢出页,可能会节省一些 I/O,因为该值完全存储在 B 树节点中。这对于相对较短的BLOB列值效果很好,但可能导致 B 树节点填满数据而不是键值,降低其效率。具有许多BLOB列的表可能导致 B 树节点变得过满,并包含太少行,使整个索引比行较短或列值存储在页外时效率低。
紧凑行格式存储特性
COMPACT行格式具有以下存储特性:
-
每个索引记录包含一个 5 字节的头部,可能在可变长度头部之前。头部用于链接连续记录,并用于行级锁定。
-
记录头部的可变长度部分包含一个位向量,用于指示
NULL列。如果索引中可以为NULL的列数为*N*,则位向量占用CEILING(*N*/8)字节。(例如,如果可以为NULL的列数为 9 到 16 列,位向量将使用两个字节。)NULL列不占用除此向量中的位之外的空间。头部的可变长度部分还包含可变长度列的长度。每个长度占用一到两个字节,取决于列的最大长度。如果索引中的所有列都是NOT NULL且具有固定长度,则记录头部没有可变长度部分。 -
对于每个非
NULL可变长度字段,记录头部包含列的长度,使用一到两个字节。只有当列的一部分存储在溢出页中或最大长度超过 255 字节且实际长度超过 127 字节时,才需要两个字节。对于外部存储的列,2 字节长度表示内部存储部分的长度加上指向外部存储部分的 20 字节指针。内部部分为 768 字节,因此长度为 768+20。20 字节指针存储列的真实长度。 -
记录头部后跟非
NULL列的数据内容。 -
聚集索引中的记录包含所有用户定义的列。此外,还有一个 6 字节的事务 ID 字段和一个 7 字节的回滚指针字段。
-
如果表没有定义主键,则每个聚集索引记录还包含一个 6 字节的行 ID 字段。
-
每个二级索引记录包含所有聚集索引键中定义的主键列,这些列不在二级索引中。如果任何主键列是可变长度的,则每个二级索引的记录头部都有一个可变长度部分来记录它们的长度,即使二级索引是在固定长度列上定义的。
-
在内部,对于非可变长度字符集,如
CHAR(10)这样的固定长度字符列以固定长度格式存储。VARCHAR列不会截断尾随空格。 -
在内部,对于可变长度字符集,如
utf8mb3和utf8mb4,InnoDB尝试将CHAR(*N*)存储为*N字节,通过修剪尾随空格。如果CHAR(*N*)列值的字节长度超过N字节,则尾随空格将被修剪至列值字节长度的最大值。CHAR(*N*)列的最大长度为最大字符字节长度×N*。为
CHAR(*N*)保留了最小的*N字节。在许多情况下,保留最小空间N可以使列更新就地完成,而不会导致索引页碎片化。相比之下,使用REDUNDANT行格式时,CHAR(*N*)列占用最大字符字节长度×N*。长度大于或等于 768 字节的固定长度列被编码为变长字段,可以存储在页外。例如,如果字符集的最大字节长度大于 3,那么
CHAR(255)列可以超过 768 字节,就像utf8mb4一样。
动态行格式
DYNAMIC行格式提供了与COMPACT行格式相同的存储特性,但增加了对长变长列的增强存储能力,并支持大型索引键前缀。
当使用ROW_FORMAT=DYNAMIC创建表时,InnoDB可以将长变长列值(如VARCHAR、VARBINARY和BLOB以及TEXT类型)完全存储在页外,聚簇索引记录仅包含指向溢出页的 20 字节指针。长度大于或等于 768 字节的固定长度字段被编码为变长字段。例如,如果字符集的最大字节长度大于 3,那么CHAR(255)列可以超过 768 字节,就像utf8mb4一样。
列是否存储在页外取决于页大小和行的总大小。当行过长时,会选择最长的列进行页外存储,直到聚簇索引记录适合于 B 树页。长度小于或等于 40 字节的TEXT和BLOB列存储在行内。
DYNAMIC行格式保持了在索引节点中存储整个行的效率(与COMPACT和REDUNDANT格式一样),但DYNAMIC行格式避免了将 B 树节点填充大量长列数据字节的问题。DYNAMIC行格式基于这样一个思想,即如果长数据值的一部分存储在页外,通常最有效的方式是将整个值存储在页外。使用DYNAMIC格式,较短的列可能会保留在 B 树节点中,最大程度地减少给定行所需的溢出页数量。
DYNAMIC行格式支持索引键前缀长达 3072 字节。
使用 DYNAMIC 行格式的表可以存储在系统表空间、每表一个表空间和通用表空间中。要将 DYNAMIC 表存储在系统表空间中,要么禁用innodb_file_per_table并使用常规的 CREATE TABLE 或 ALTER TABLE 语句,要么在 CREATE TABLE 或 ALTER TABLE 中使用 TABLESPACE [=] innodb_system 表选项。innodb_file_per_table 变量不适用于通用表空间,也不适用于使用 TABLESPACE [=] innodb_system 表选项将 DYNAMIC 表存储在系统表空间中。
DYNAMIC 行格式存储特性
DYNAMIC 行格式是 COMPACT 行格式的一种变体。有关存储特性,请参阅 COMPACT 行格式存储特性。
压缩行格式
COMPRESSED 行格式提供了与 DYNAMIC 行格式相同的存储特性和功能,但增加了对表和索引数据压缩的支持。
COMPRESSED 行格式使用与 DYNAMIC 行格式相似的内部细节进行页外存储,同时由于表和索引数据被压缩并使用较小的页大小,还有额外的存储和性能考虑。对于 COMPRESSED 行格式,KEY_BLOCK_SIZE 选项控制存储在聚簇索引中的列数据量,以及放置在溢出页上的数据量。有关 COMPRESSED 行格式的更多信息,请参阅第 17.9 节,“InnoDB 表和页压缩”。
COMPRESSED 行格式支持索引键前缀长达 3072 字节。
使用 COMPRESSED 行格式的表可以在每表一个表空间或通用表空间中创建。系统表空间不支持 COMPRESSED 行格式。要将 COMPRESSED 表存储在每表一个表空间中,必须启用innodb_file_per_table变量。innodb_file_per_table变量不适用于通用表空间。通用表空间支持所有行格式,但由于不同的物理页大小,压缩和非压缩表不能共存于同一通用表空间中。有关更多信息,请参阅第 17.6.3.3 节,“通用表空间”。
压缩行格式存储特性
COMPRESSED 行格式是 COMPACT 行格式的一种变体。有关存储特性,请参阅 COMPACT 行格式存储特性。
定义表的行格式
InnoDB表的默认行格式由innodb_default_row_format变量定义,默认值为DYNAMIC。当未明确定义ROW_FORMAT表选项或指定ROW_FORMAT=DEFAULT时,将使用默认行格式。
表格的行格式可以在CREATE TABLE或ALTER TABLE语句中通过ROW_FORMAT表选项明确定义。例如:
CREATE TABLE t1 (c1 INT) ROW_FORMAT=DYNAMIC;
明确定义的ROW_FORMAT设置会覆盖默认行格式。指定ROW_FORMAT=DEFAULT等同于使用隐式默认值。
innodb_default_row_format变量可以动态设置:
mysql> SET GLOBAL innodb_default_row_format=DYNAMIC;
有效的innodb_default_row_format选项包括DYNAMIC、COMPACT和REDUNDANT。不支持在系统表空间中使用的COMPRESSED行格式不能定义为默认值。只能在CREATE TABLE或ALTER TABLE语句中明确定义。尝试将innodb_default_row_format变量设置为COMPRESSED会返回错误:
mysql> SET GLOBAL innodb_default_row_format=COMPRESSED;
ERROR 1231 (42000): Variable 'innodb_default_row_format'
can't be set to the value of 'COMPRESSED'
新创建的表在未明确指定ROW_FORMAT选项或使用ROW_FORMAT=DEFAULT时,将使用由innodb_default_row_format变量定义的行格式。例如,以下CREATE TABLE语句使用由innodb_default_row_format变量定义的行格式。
CREATE TABLE t1 (c1 INT);
CREATE TABLE t2 (c1 INT) ROW_FORMAT=DEFAULT;
当未明确指定ROW_FORMAT选项,或使用ROW_FORMAT=DEFAULT时,重建表的操作会静默更改表的行格式为由innodb_default_row_format变量定义的格式。
表重建操作包括使用ALGORITHM=COPY或ALGORITHM=INPLACE的ALTER TABLE操作,其中需要重建表。有关更多信息,请参见第 17.12.1 节,“在线 DDL 操作”。OPTIMIZE TABLE也是一种表重建操作。
以下示例演示了一种表重建操作,静默更改了未明确定义行格式的表的行格式。
mysql> SELECT @@innodb_default_row_format;
+-----------------------------+
| @@innodb_default_row_format |
+-----------------------------+
| dynamic |
+-----------------------------+
mysql> CREATE TABLE t1 (c1 INT);
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1' \G
*************************** 1\. row ***************************
TABLE_ID: 54
NAME: test/t1
FLAG: 33
N_COLS: 4
SPACE: 35
ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
mysql> SET GLOBAL innodb_default_row_format=COMPACT;
mysql> ALTER TABLE t1 ADD COLUMN (c2 INT);
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1' \G
*************************** 1\. row ***************************
TABLE_ID: 55
NAME: test/t1
FLAG: 1
N_COLS: 5
SPACE: 36
ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
在将现有表格的行格式从REDUNDANT或COMPACT更改为DYNAMIC之前,请考虑以下潜在问题。
-
REDUNDANT和COMPACT行格式支持最大索引键前缀长度为 767 字节,而DYNAMIC和COMPRESSED行格式支持索引键前缀长度为 3072 字节。在复制环境中,如果源上的innodb_default_row_format变量设置为DYNAMIC,并在副本上设置为COMPACT,则以下 DDL 语句,在源上成功但在副本上失败,因为未明确定义行格式:CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(5000), KEY i1(c2(3070)));有关相关信息,请参见第 17.22 节,“InnoDB 限制”。
-
导入未明确定义行格式的表,如果源服务器上的
innodb_default_row_format设置与目标服务器上的设置不同,则会导致模式不匹配错误。有关更多信息,请参见第 17.6.1.3 节,“导入 InnoDB 表”。
确定表的行格式
要确定表的行格式,请使用SHOW TABLE STATUS:
mysql> SHOW TABLE STATUS IN test1\G
*************************** 1\. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 16384
Data_free: 0
Auto_increment: 1
Create_time: 2016-09-14 16:29:38
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
或者,查询信息模式INNODB_TABLES表:
mysql> SELECT NAME, ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test1/t1';
+----------+------------+
| NAME | ROW_FORMAT |
+----------+------------+
| test1/t1 | Dynamic |
+----------+------------+
17.11 InnoDB 磁盘 I/O 和文件空间管理
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-disk-management.html
17.11.1 InnoDB 磁盘 I/O
17.11.2 文件空间管理
17.11.3 InnoDB 检查点
17.11.4 表碎片整理
17.11.5 使用 TRUNCATE TABLE 回收磁盘空间
作为数据库管理员,您必须管理磁盘 I/O,以防止 I/O 子系统过载,并管理磁盘空间,以避免存储设备填满。 ACID 设计模型需要一定量的 I/O,这可能看起来是多余的,但有助于确保数据的可靠性。 在这些约束条件下,InnoDB 尝试优化数据库工作和磁盘文件的组织,以最小化磁盘 I/O 的数量。 有时,I/O 被推迟,直到数据库不忙,或者直到需要将所有内容带到一致状态,例如在 快速关闭 后进行数据库重启时。
本节讨论了使用默认类型的 MySQL 表(也称为 InnoDB 表)时的主要考虑因素:
-
控制用于改善查询性能的后台 I/O 的数量。
-
启用或禁用提供额外耐久性的功能,但会增加额外的 I/O。
-
将表组织成许多小文件、少量大文件或两者的组合。
-
在重做日志文件大小与日志文件变满时发生的 I/O 活动之间取得平衡。
-
如何重新组织表以获得最佳的查询性能。
17.11.1 InnoDB 磁盘 I/O
InnoDB在可能的情况下使用异步磁盘 I/O,通过创建多个线程来处理 I/O 操作,同时允许其他数据库操作在 I/O 仍在进行时继续进行。在 Linux 和 Windows 平台上,InnoDB使用可用的操作系统和库函数执行“本机”异步 I/O。在其他平台上,InnoDB仍然使用 I/O 线程,但线程可能实际上会等待 I/O 请求完成;这种技术称为“模拟”异步 I/O。
预读
如果InnoDB可以确定数据很可能很快就会被需要,它会执行预读操作将数据带入缓冲池,以便在内存中可用。对连续数据进行少量大的读取请求可能比进行几个小的分散请求更有效。InnoDB有两种预读启发式:
-
在顺序读取预读中,如果
InnoDB注意到表空间中某个段的访问模式是顺序的,它会提前向 I/O 系统发布一批数据库页面的读取。 -
在随机读取预读中,如果
InnoDB注意到表空间中某个区域似乎正在被完全读入缓冲池,它会将剩余的读取发布到 I/O 系统。
有关配置预读启发式的信息,请参见第 17.8.3.4 节,“配置 InnoDB 缓冲池预取(预读)”")。
双写缓冲区
InnoDB使用一种涉及名为双写缓冲区的新颖文件刷新技术,默认情况下在大多数情况下启用(innodb_doublewrite=ON)。它增加了在意外退出或停电后恢复的安全性,并通过减少fsync()操作的需求来提高大多数 Unix 系统的性能。
在将页面写入数据文件之前,InnoDB首先将它们写入称为双写缓冲区的存储区域。只有在写入和刷新到双写缓冲区完成后,InnoDB才将页面写入数据文件的适当位置。如果在页面写入过程中有操作系统、存储子系统或意外的mysqld进程退出(导致破碎页条件),InnoDB可以在恢复过程中从双写缓冲区找到页面的良好副本。
有关双写缓冲区的更多信息,请参见第 17.6.4 节,“双写缓冲区”。
17.11.2 文件空间管理
您在配置文件中使用innodb_data_file_path配置选项定义的数据文件形成InnoDB系统表空间。这些文件在逻辑上连接在一起形成系统表空间。没有使用条带化。您无法定义表在系统表空间内的分配位置。在新创建的系统表空间中,InnoDB从第一个数据文件开始分配空间。
为了避免将所有表和索引存储在系统表空间内带来的问题,您可以启用innodb_file_per_table配置选项(默认情况下),该选项将每个新创建的表存储在单独的表空间文件中(扩展名为.ibd)。以这种方式存储的表在磁盘文件内部的碎片较少,当表被截断时,空间将被返回给操作系统,而不是仍然被 InnoDB 在系统表空间内保留。更多信息,请参阅第 17.6.3.2 节,“每表一个表空间”。
您还可以将表存储在通用表空间中。通用表空间是使用CREATE TABLESPACE语法创建的共享表空间。它们可以在 MySQL 数据目录之外创建,能够容纳多个表,并支持所有行格式的表。更多信息,请参阅第 17.6.3.3 节,“通用表空间”。
页、区、段和表空间
每个表空间由数据库页组成。MySQL 实例中的每个表空间具有相同的页大小。默认情况下,所有表空间的页大小为 16KB;您可以通过在创建 MySQL 实例时指定innodb_page_size选项来将页大小减小到 8KB 或 4KB。您还可以将页大小增加到 32KB 或 64KB。更多信息,请参考innodb_page_size文档。
页面被分组为大小为 1MB 的 extent,用于大小不超过 16KB 的页面(64 个连续的 16KB 页面,或 128 个 8KB 页面,或 256 个 4KB 页面)。对于 32KB 的页面大小,extent 大小为 2MB。对于 64KB 的页面大小,extent 大小为 4MB。表空间中的“文件”被称为InnoDB中的 segments。(这些段与实际包含许多表空间段的 rollback segment 不同。)
当段在表空间内增长时,InnoDB逐个为其分配前 32 页。之后,InnoDB开始为段分配整个 extent。InnoDB可以一次向大段添加多达 4 个 extent,以确保数据的良好顺序性。
在InnoDB中,每个索引分配两个段。一个用于 B-tree 的非叶节点,另一个用于叶节点。在磁盘上保持叶节点连续使得更好的顺序 I/O 操作成为可能,因为这些叶节点包含实际的表数据。
表空间中的一些页面包含其他页面的位图,因此InnoDB表空间中的一些 extent 无法作为整体分配给段,而只能作为单个页面分配。
通过发出SHOW TABLE STATUS语句来查询表空间中的可用空闲空间时,InnoDB报告表空间中明确空闲的 extent。InnoDB始终保留一些 extent 用于清理和其他内部目的;这些保留的 extent 不包括在空闲空间中。
当您从表中删除数据时,InnoDB会收缩相应的 B-tree 索引。释放的空间是否可供其他用户使用取决于删除模式是否将单个页面或 extent 释放到表空间。删除表或从表中删除所有行将确保将空间释放给其他用户,但请记住,删除的行只有在不再需要进行事务回滚或一致性读取后一段时间自动执行的 purge 操作才会被物理删除。(参见 Section 17.3,“InnoDB 多版本”.)
配置保留文件段页面的百分比
innodb_segment_reserve_factor变量,引入于 MySQL 8.0.26,是一个高级功能,允许定义作为空页面保留的表空间文件段页面的百分比。保留一定比例的页面用于未来增长,以便 B-tree 中的页面可以连续分配。修改保留页面百分比的能力允许对InnoDB进行微调,以解决数据碎片化或存储空间的低效使用问题。
该设置适用于每表文件和通用表空间。innodb_segment_reserve_factor 的默认设置为 12.5%,与之前的 MySQL 版本中保留的页面百分比相同。
innodb_segment_reserve_factor 变量是动态的,可以使用 SET 语句进行配置。例如:
mysql> SET GLOBAL innodb_segment_reserve_factor=10;
页面与表行的关系
对于 4KB、8KB、16KB 和 32KB 的 innodb_page_size 设置,最大行长度略小于半个数据库页面大小。例如,默认的 16KB InnoDB 页面大小的最大行长度略小于 8KB。对于 64KB 的 innodb_page_size 设置,最大行长度略小于 16KB。
如果行未超过最大行长度,则所有内容都存储在页面内。如果行超过最大行长度,变长列 被选择进行外部页存储,直到行符合最大行长度限制。变长列的外部页存储根据行格式而异:
-
紧凑和冗余行格式
当选择变长列进行外部页存储时,
InnoDB将前 768 字节存储在行内,其余部分存储在溢出页中。每个这样的列都有自己的溢出页列表。768 字节前缀伴随着一个 20 字节的值,存储列的真实长度,并指向溢出列表,其中存储了值的其余部分。参见 第 17.10 节,“InnoDB 行格式”。 -
动态和压缩行格式
当选择变长列进行外部页存储时,
InnoDB在行内存储一个 20 字节的指针,其余部分存储在溢出页中。参见 第 17.10 节,“InnoDB 行格式”。
LONGBLOB 和 LONGTEXT 列必须小于 4GB,包括 BLOB 和 TEXT 列在内的总行长度必须小于 4GB。
17.11.3 InnoDB 检查点
使你的日志文件变得非常大可能会在检查点期间减少磁盘 I/O。通常情况下,将日志文件的总大小设置为缓冲池的大小甚至更大是有意义的。
检查点处理的工作原理
InnoDB实现了一种被称为模糊检查点的检查点机制。InnoDB会将修改过的数据库页面以小批量方式从缓冲池刷新出去。在检查点过程中,没有必要一次性刷新缓冲池,这样会干扰用户 SQL 语句的处理过程。
在崩溃恢复期间,InnoDB会寻找写入日志文件的检查点标签。它知道标签之前对数据库的所有修改都存在于数据库的磁盘镜像中。然后,InnoDB从检查点开始向前扫描日志文件,将记录的修改应用到数据库中。
17.11.4 表碎片整理
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-file-defragmenting.html
随机插入或从二级索引中删除可能导致索引碎片化。碎片化意味着磁盘上索引页面的物理排序与页面上记录的索引排序不接近,或者在为索引分配的 64 页块中有许多未使用的页面。
碎片化的一个症状是表占用的空间比“应该”占用的空间多。确切的数量很难确定。所有 InnoDB 数据和索引都存储在 B 树中,它们的填充因子可能从 50% 变化到 100%。碎片化的另一个症状是像这样的表扫描所需的时间比“应该”花费的时间更长:
SELECT COUNT(*) FROM t WHERE *non_indexed_column* <> 12345;
前面的查询需要 MySQL 执行完整表扫描,这是针对大表最慢的查询类型。
为加快索引扫描速度,您可以定期执行“null”ALTER TABLE操作,这会导致 MySQL 重建表:
ALTER TABLE *tbl_name* ENGINE=INNODB
您还可以使用ALTER TABLE *tbl_name* FORCE执行“null” alter 操作,重建表。
ALTER TABLE *tbl_name* ENGINE=INNODB 和 ALTER TABLE *tbl_name* FORCE 都使用在线 DDL。有关更多信息,请参见 Section 17.12, “InnoDB and Online DDL”。
另一种执行碎片整理操作的方法是使用mysqldump将表转储到文本文件中,删除表,并从转储文件重新加载。
如果对索引的插入始终是升序的,并且仅从末尾删除记录,则 InnoDB 文件空间管理算法保证索引不会发生碎片化。
17.11.5 使用 TRUNCATE TABLE 回收磁盘空间
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-truncate-table-reclaim-space.html
要在截断InnoDB表时回收操作系统磁盘空间,表必须存储在自己的.ibd 文件中。为了让表存储在自己的.ibd 文件中,在创建表时必须启用innodb_file_per_table。此外,被截断的表与其他表之间不能有外键约束,否则TRUNCATE TABLE操作会失败。然而,同一表中两列之间的外键约束是允许的。
当表被截断时,它会被删除并在一个新的.ibd文件中重新创建,释放的空间会返回给操作系统。这与截断存储在InnoDB系统表空间(当innodb_file_per_table=OFF时创建的表)和存储在共享通用表空间中的InnoDB表形成对比,在这种情况下,只有InnoDB在表被截断后才能使用释放的空间。
截断表并将磁盘空间返回给操作系统的能力也意味着物理备份可以更小。截断存储在系统表空间(当innodb_file_per_table=OFF时创建的表)或通用表空间中的表会在表空间中留下未使用的空间块。
17.12 InnoDB 和在线 DDL
17.12.1 在线 DDL 操作
17.12.2 在线 DDL 性能和并发性
17.12.3 在线 DDL 空间要求
17.12.4 在线 DDL 内存管理
17.12.5 配置在线 DDL 操作的并行线程
17.12.6 简化 DDL 语句的在线 DDL
17.12.7 在线 DDL 失败条件
17.12.8 在线 DDL 限制
在线 DDL 功能支持即时和原地表更改以及并发 DML。此功能的好处包括:
-
在繁忙的生产环境中提高响应性和可用性,使表在几分钟或几小时内不可用是不切实际的。
-
对于原地操作,在 DDL 操作期间使用
LOCK子句调整性能和并发性之间的平衡。参见 LOCK 子句。 -
比表复制方法使用更少的磁盘空间和 I/O 开销。
注意
ALGORITHM=INSTANT 支持在 MySQL 8.0.12 中的 ADD COLUMN 和其他操作中使用。
通常,您不需要采取任何特殊措施来启用在线 DDL。默认情况下,MySQL 尽可能以立即或原地的方式执行操作,并尽量减少锁定。
您可以使用ALTER TABLE语句的 ALGORITHM 和 LOCK 子句来控制 DDL 操作的各个方面。这些子句位于语句末尾,与表和列规范用逗号分隔。例如:
ALTER TABLE *tbl_name* ADD PRIMARY KEY (*column*), ALGORITHM=INPLACE;
LOCK 子句可用于原地执行的操作,并且在操作期间对表的并发访问程度进行微调非常有用。仅支持 LOCK=DEFAULT 用于立即执行的操作。ALGORITHM 子句主要用于性能比较,并作为旧表复制行为的后备,以防遇到任何问题。例如:
-
为了避免在原地
ALTER TABLE操作期间意外使表对读取、写入或两者都不可用,请在ALTER TABLE语句上指定一个子句,如LOCK=NONE(允许读取和写入)或LOCK=SHARED(允许读取)。如果所请求的并发级别不可用,则操作立即停止。 -
为了比较算法之间的性能,请运行带有
ALGORITHM=INSTANT、ALGORITHM=INPLACE和ALGORITHM=COPY的语句。您还可以运行带有启用old_alter_table配置选项的语句,以强制使用ALGORITHM=COPY。 -
为了避免使用
ALTER TABLE操作拷贝表格而占用服务器资源,请包含ALGORITHM=INSTANT或ALGORITHM=INPLACE。如果无法使用指定的算法,该语句将立即停止。
17.12.1 在线 DDL 操作
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html
本节中提供了 DDL 操作的在线支持详细信息、语法示例和用法说明。
-
索引操作
-
主键操作
-
列操作
-
生成列操作
-
外键操作
-
表操作
-
表空间操作
-
分区操作
索引操作
以下表格概述了索引操作的在线 DDL 支持。星号表示额外信息、异常或依赖关系。详情请参阅语法和用法说明。
表 17.16 索引操作的在线 DDL 支持
| 操作 | 立即 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
| 创建或添加二级索引 | 否 | 是 | 否 | 是 | 否 |
| 删除索引 | 否 | 是 | 否 | 是 | 是 |
| 重命名索引 | 否 | 是 | 否 | 是 | 是 |
添加FULLTEXT索引 | 否 | 是* | 否* | 否 | 否 |
添加SPATIAL索引 | 否 | 是 | 否 | 否 | 否 |
| 更改索引类型 | 是 | 是 | 否 | 是 | 是 |
语法和用法说明
-
创建或添加二级索引
CREATE INDEX *name* ON *table* (*col_list*);ALTER TABLE *tbl_name* ADD INDEX *name* (*col_list*);在创建索引时,表仍可用于读写操作。
CREATE INDEX语句仅在访问表的所有事务完成后才完成,以便索引的初始状态反映表的最新内容。添加二级索引的在线 DDL 支持意味着您通常可以通过在加载数据后创建不带二级索引的表,然后在数据加载后添加二级索引,从而加快创建和加载表及相关索引的整个过程。
新创建的二级索引仅包含在
CREATE INDEX或ALTER TABLE语句执行完成时表中的已提交数据。它不包含任何未提交的值、旧版本的值或标记为删除但尚未从旧索引中删除的值。一些因素会影响此操作的性能、空间使用和语义。详情请参阅 Section 17.12.8, “在线 DDL 限制”。
-
删除索引
DROP INDEX *name* ON *table*;ALTER TABLE *tbl_name* DROP INDEX *name*;当索引被删除时,表仍然可用于读写操作。
DROP INDEX语句只有在访问表的所有事务完成后才会完成,以便索引的初始状态反映表的最新内容。 -
重命名索引
ALTER TABLE *tbl_name* RENAME INDEX *old_index_name* TO *new_index_name*, ALGORITHM=INPLACE, LOCK=NONE; -
添加
FULLTEXT索引CREATE FULLTEXT INDEX *name* ON table(*column*);添加第一个
FULLTEXT索引会在没有用户定义的FTS_DOC_ID列的情况下重建表。可以在不重建表的情况下添加额外的FULLTEXT索引。 -
添加
SPATIAL索引CREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED; -
更改索引类型(
USING {BTREE | HASH})ALTER TABLE *tbl_name* DROP INDEX i1, ADD INDEX i1(*key_part,...*) USING BTREE, ALGORITHM=INSTANT;
主键操作
下表概述了主键操作的在线 DDL 支持。星号表示额外信息、异常或依赖项。请参阅语法和用法说明。
表 17.17 主键操作的在线 DDL 支持
| 操作 | 立即 | 原地 | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
| 添加主键 | 否 | 是* | 是* | 是 | 否 |
| 删除主键 | 否 | 否 | 是 | 否 | 否 |
| 删除主键并添加另一个 | 否 | 是 | 是 | 是 | 否 |
语法和用法说明
-
添加主键
ALTER TABLE *tbl_name* ADD PRIMARY KEY (*column*), ALGORITHM=INPLACE, LOCK=NONE;在原地重建表。数据被大幅重新组织,使其成为一项昂贵的操作。如果必须将列转换为
NOT NULL,则在某些条件下不允许使用ALGORITHM=INPLACE。重构聚簇索引总是需要复制表数据。因此,最好在创建表时定义主键,而不是稍后发出
ALTER TABLE ... ADD PRIMARY KEY。当创建
UNIQUE或PRIMARY KEY索引时,MySQL 必须做一些额外的工作。对于UNIQUE索引,MySQL 检查表中是否没有重复键值。对于PRIMARY KEY索引,MySQL 还检查是否没有PRIMARY KEY列包含NULL。当使用
ALGORITHM=COPY子句添加主键时,MySQL 会将相关列中的NULL值转换为默认值:数字为 0,基于字符的列和 BLOB 为空字符串,DATETIME为 0000-00-00 00:00:00。这是一种非标准行为,Oracle 建议您不要依赖于此。只有在SQL_MODE设置包括strict_trans_tables或strict_all_tables标志时,才允许使用ALGORITHM=INPLACE添加主键;当SQL_MODE设置为 strict 时,允许使用ALGORITHM=INPLACE,但如果请求的主键列包含NULL值,则语句仍可能失败。ALGORITHM=INPLACE行为更符合标准。如果创建一个没有主键的表,
InnoDB会为您选择一个主键,可以是第一个在NOT NULL列上定义的UNIQUE键,或者是系统生成的键。为了避免不确定性和额外隐藏列的潜在空间需求,请在CREATE TABLE语句中指定PRIMARY KEY子句。MySQL 通过将现有数据从原始表复制到具有所需索引结构的临时表来创建新的聚集索引。一旦数据完全复制到临时表,原始表将以不同的临时表名称重命名。包含新聚集索引的临时表将以原始表的名称重命名,并且原始表将从数据库中删除。
适用于次要索引操作的在线性能增强不适用于主键索引。InnoDB 表的行存储在基于主键组织的聚集索引中,形成一些数据库系统称为“索引组织表”的结构。由于表结构与主键紧密相关,重新定义主键仍然需要复制数据。
当对主键使用
ALGORITHM=INPLACE时,即使数据仍在复制,也比使用ALGORITHM=COPY更有效,因为:-
对于
ALGORITHM=INPLACE不需要撤消日志或相关的重做日志。这些操作会给使用ALGORITHM=COPY的 DDL 语句增加开销。 -
次要索引条目已经预先排序,因此可以按顺序加载。
-
由于没有随机访问插入到次要索引中,因此不使用更改缓冲区。
-
-
删除主键
ALTER TABLE *tbl_name* DROP PRIMARY KEY, ALGORITHM=COPY;只有
ALGORITHM=COPY支持在同一ALTER TABLE语句中删除主键而不添加新主键。 -
删除一个主键并添加另一个
ALTER TABLE *tbl_name* DROP PRIMARY KEY, ADD PRIMARY KEY (*column*), ALGORITHM=INPLACE, LOCK=NONE;数据进行了大幅重组,这是一项昂贵的操作。
列操作
下表提供了关于列操作的在线 DDL 支持的概述。星号表示额外信息、异常或依赖关系。详情请参见语法和用法说明。
表 17.18 列操作的在线 DDL 支持
| 操作 | Instant | In Place | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
| 添加列 | 是* | 是 | 否* | 是* | 是 |
| 删除列 | 是* | 是 | 是 | 是 | 是 |
| 重命名列 | 是* | 是 | 否 | 是* | 是 |
| 重新排序列 | 否 | 是 | 是 | 是 | 否 |
| 设置列默认值 | 是 | 是 | 否 | 是 | 是 |
| 更改列数据类型 | 否 | 否 | 是 | 否 | 否 |
扩展VARCHAR列大小 | 否 | 是 | 否 | 是 | 是 |
| 删除列默认值 | 是 | 是 | 否 | 是 | 是 |
| 更改自增值 | 否 | 是 | 否 | 是 | 否* |
使列为NULL | 否 | 是 | 是* | 是 | 否 |
使列为NOT NULL | 否 | 是* | 是* | 是 | 否 |
修改ENUM或SET列的定义 | 是 | 是 | 否 | 是 | 是 |
| 操作 | Instant | In Place | 重建表 | 允许并发 DML | 仅修改元数据 |
语法和用法说明
-
添加列
ALTER TABLE *tbl_name* ADD COLUMN *column_name* *column_definition*, ALGORITHM=INSTANT;INSTANT是 MySQL 8.0.12 之后的默认算法,之前是INPLACE。当
INSTANT算法添加列时,以下限制适用:-
一条语句不能将添加列与不支持
INSTANT算法的其他ALTER TABLE操作结合在一起。 -
INSTANT算法可以在表中的任何位置添加列。在 MySQL 8.0.29 之前,INSTANT算法只能将列添加为表的最后一列。 -
不能向使用
ROW_FORMAT=COMPRESSED、具有FULLTEXT索引、位于数据字典表空间中的表或临时表添加列。临时表仅支持ALGORITHM=COPY。 -
当
INSTANT算法添加列时,MySQL 会检查行大小,如果添加超过限制,则会抛出以下错误。错误 4092(HY000):无法使用 ALGORITHM=INSTANT 添加列,因为此后最大可能行大小超过了最大允许行大小。请尝试 ALGORITHM=INPLACE/COPY。
在 MySQL 8.0.29 之前,MySQL 在
INSTANT算法添加列时不会检查行大小。但是,在插入和更新表中的行的 DML 操作期间,MySQL 会检查行大小。 -
在使用
INSTANT算法添加列后,表的内部表示中列的最大数量不能超过 1022。错误消息为:错误 4158(HY000):无法使用 ALGORITHM=INSTANT 将列添加到*
tbl_name*。请尝试 ALGORITHM=INPLACE/COPY -
INSTANT算法无法向系统模式表(如内部mysql表)添加或删除列。此限制是在 MySQL 8.0.29 中添加的。
可以在同一
ALTER TABLE语句中添加多个列。例如:ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;每次执行
ALTER TABLE ... ALGORITHM=INSTANT操作添加一个或多个列、删除一个或多个列,或者在同一操作中添加和删除一个或多个列后,都会创建一个新的行版本。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS列跟踪表的行版本数量。每次立即添加或删除列时,该值都会递增。初始值为 0。mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+当具有立即添加或删除列的表通过表重建的
ALTER TABLE或OPTIMIZE TABLE操作重建时,TOTAL_ROW_VERSIONS值将重置为 0。允许的最大行版本数为 64,因为每个行版本都需要额外的表元数据空间。当达到行版本限制时,使用ALGORITHM=INSTANT的ADD COLUMN和DROP COLUMN操作将被拒绝,并显示错误消息建议使用COPY或INPLACE算法重建表。错误 4080 (HY000): 表 test/t1 的最大行版本已达到。无法立即添加或删除更多列。请使用 COPY/INPLACE。
以下
INFORMATION_SCHEMA列提供了立即添加列的附加元数据。有关这些列的描述,请参考这些列的描述以获取更多信息。参见 Section 28.4.9, “The INFORMATION_SCHEMA INNODB_COLUMNS Table” 和 Section 28.4.23, “The INFORMATION_SCHEMA INNODB_TABLES Table”。-
INNODB_COLUMNS.DEFAULT_VALUE -
INNODB_COLUMNS.HAS_DEFAULT -
INNODB_TABLES.INSTANT_COLS
在添加自增列时不允许并发 DML。数据会被大幅重组,使其成为一项昂贵的操作。至少需要
ALGORITHM=INPLACE, LOCK=SHARED。如果使用
ALGORITHM=INPLACE添加列,则表将被重建。 -
-
删除列
ALTER TABLE *tbl_name* DROP COLUMN *column_name*, ALGORITHM=INSTANT;截至 MySQL 8.0.29,
INSTANT是默认算法,之前是INPLACE。使用
INSTANT算法删除列时会出现以下限制:-
不能将删除列与不支持
ALGORITHM=INSTANT的其他ALTER TABLE操作结合在同一语句中。 -
不能从使用
ROW_FORMAT=COMPRESSED、具有FULLTEXT索引、位于数据字典表空间中的表或临时表中删除列。临时表仅支持ALGORITHM=COPY。
可以在同一
ALTER TABLE语句中删除多个列;例如:ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;每次使用
ALGORITHM=INSTANT添加或删除列时,都会创建一个新的行版本。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS列跟踪表的行版本数。每次立即添加或删除列时,该值都会递增。初始值为 0。mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+当具有立即添加或删除列的表通过表重建
ALTER TABLE或OPTIMIZE TABLE操作重建时,TOTAL_ROW_VERSIONS值将重置为 0。允许的最大行版本数为 64,因为每个行版本都需要额外的空间用于表元数据。当达到行版本限制时,使用ALGORITHM=INSTANT的ADD COLUMN和DROP COLUMN操作将被拒绝,并显示错误消息建议使用COPY或INPLACE算法重建表。错误 4080 (HY000):表 test/t1 的最大行版本已达到。无法立即添加或删除更多列。请使用 COPY/INPLACE。
如果使用
ALGORITHM=INSTANT之外的算法,数据会被大幅重组,使其成为一项昂贵的操作。 -
-
重命名列
ALTER TABLE *tbl* CHANGE *old_col_name* *new_col_name* *data_type*, ALGORITHM=INSTANT;MySQL 8.0.28 中添加了对重命名列的
ALGORITHM=INSTANT支持。在较早的 MySQL Server 版本中,重命名列仅支持ALGORITHM=INPLACE和ALGORITHM=COPY。为了允许并发 DML,请保持相同的数据类型,只更改列名。
当保持相同的数据类型和
[NOT] NULL属性,仅更改列名时,该操作始终可以在线执行。仅允许使用
ALGORITHM=INPLACE重命名另一个表引用的列。如果使用ALGORITHM=INSTANT、ALGORITHM=COPY或导致操作使用这些算法的其他条件,则ALTER TABLE语句将失败。ALGORITHM=INSTANT支持重命名虚拟列;ALGORITHM=INPLACE不支持。在相同语句中添加或删除虚拟列时,
ALGORITHM=INSTANT和ALGORITHM=INPLACE不支持重命名列。在这种情况下,只支持ALGORITHM=COPY。 -
重新排序列
要重新排序列,请在
CHANGE或MODIFY操作中使用FIRST或AFTER。ALTER TABLE *tbl_name* MODIFY COLUMN *col_name* *column_definition* FIRST, ALGORITHM=INPLACE, LOCK=NONE;数据会被大幅重组,使其成为一项昂贵的操作。
-
更改列数据类型
ALTER TABLE *tbl_name* CHANGE c1 c1 BIGINT, ALGORITHM=COPY;只有使用
ALGORITHM=COPY才支持更改列数据类型。 -
扩展
VARCHAR列大小ALTER TABLE *tbl_name* CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;VARCHAR列所需的长度字节数必须保持不变。对于大小为 0 到 255 字节的VARCHAR列,需要一个长度字节来编码值。对于大小为 256 字节或更大的VARCHAR列,需要两个长度字节。因此,原地ALTER TABLE仅支持将VARCHAR列大小从 0 到 255 字节增加,或从 256 字节增加到更大的大小。原地ALTER TABLE不支持将VARCHAR列大小从小于 256 字节增加到等于或大于 256 字节。在这种情况下,所需的长度字节数从 1 变为 2,只能通过表复制(ALGORITHM=COPY)支持。例如,尝试使用原地ALTER TABLE将单字节字符集的VARCHAR列大小从 VARCHAR(255)更改为 VARCHAR(256)会返回此错误:ALTER TABLE *tbl_name* ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.注意
VARCHAR列的字节长度取决于字符集的字节长度。使用原地
ALTER TABLE不支持减小VARCHAR大小。减小VARCHAR大小需要表复制(ALGORITHM=COPY)。 -
设置列默认值
ALTER TABLE *tbl_name* ALTER COLUMN *col* SET DEFAULT *literal*, ALGORITHM=INSTANT;仅修改表元数据。默认列值存储在数据字典中。
-
删除列默认值
ALTER TABLE *tbl* ALTER COLUMN *col* DROP DEFAULT, ALGORITHM=INSTANT; -
更改自增值
ALTER TABLE *table* AUTO_INCREMENT=*next_value*, ALGORITHM=INPLACE, LOCK=NONE;修改存储在内存中的值,而不是数据文件中的值。
在使用复制或分片的分布式系统中,有时会将表的自增计数器重置为特定值。表中插入的下一行将使用其自增列的指定值。您也可以在数据仓库环境中使用此技术,定期清空所有表并重新加载它们,并从 1 重新启动自增序列。
-
使列
NULLALTER TABLE tbl_name MODIFY COLUMN *column_name* *data_type* NULL, ALGORITHM=INPLACE, LOCK=NONE;在原地重建表。数据被大幅重新组织,使其成为昂贵的操作。
-
使列
NOT NULLALTER TABLE *tbl_name* MODIFY COLUMN *column_name* *data_type* NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;在原地重建表格。操作需要
STRICT_ALL_TABLES或STRICT_TRANS_TABLESSQL_MODE的支持才能成功。如果列包含 NULL 值,则操作将失败。服务器禁止对可能导致引用完整性丢失的外键列进行更改。请参阅第 15.1.9 节,“ALTER TABLE Statement”。数据将被大幅重新组织,这是一个昂贵的操作。 -
修改
ENUM或SET列的定义CREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;通过在有效成员值列表的末尾添加新的枚举或集合成员来修改
ENUM或SET列的定义可以立即执行或原地执行,只要数据类型的存储大小不变。例如,向具有 8 个成员的SET列添加一个成员会将每个值所需的存储从 1 字节更改为 2 字节;这需要复制表格。在列表中间添加成员会导致现有成员的重新编号,这需要复制表格。
生成列操作
下表提供了生成列操作的在线 DDL 支持概述。详情请参阅语法和用法注意事项。
表 17.19 生成列操作的在线 DDL 支持
| 操作 | 立即执行 | 原地执行 | 重建表格 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
添加STORED列 | 否 | 否 | 是 | 否 | 否 |
修改STORED列顺序 | 否 | 否 | 是 | 否 | 否 |
删除STORED列 | 否 | 是 | 是 | 是 | 否 |
添加VIRTUAL列 | 是 | 是 | 否 | 是 | 是 |
修改VIRTUAL列顺序 | 否 | 否 | 是 | 否 | 否 |
删除VIRTUAL列 | 是 | 是 | 否 | 是 | 是 |
语法和用法注意事项
-
添加
STORED列ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;ADD COLUMN对于存储列(不使用临时表)不是一个原地操作,因为表达式必须由服务器评估。 -
修改
STORED列顺序ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;在原地重建表格。
-
删除
STORED列ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;在原地重建表格。
-
添加
VIRTUAL列ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;对于非分区表,添加虚拟列可以立即执行或原地执行。
对分区表来说,添加
VIRTUAL列不是一个原地操作。 -
修改
VIRTUAL列顺序ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY; -
删除
VIRTUAL列ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;对于非分区表,删除
VIRTUAL列可以立即执行或原地执行。
外键操作
下表提供了外键操作的在线 DDL 支持概述。星号表示额外信息、异常或依赖关系。详情请参阅语法和用法注意事项。
表 17.20 外键操作的在线 DDL 支持
| 操作 | 立即 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
| 添加外键约束 | 否 | 是* | 否 | 是 | 是 |
| 删除外键约束 | 否 | 是 | 否 | 是 | 是 |
语法和用法说明
-
添加外键约束
当
foreign_key_checks被禁用时,支持INPLACE算法。否则,只支持COPY算法。ALTER TABLE *tbl1* ADD CONSTRAINT *fk_name* FOREIGN KEY *index* (*col1*) REFERENCES *tbl2*(*col2*) *referential_actions*; -
删除外键约束
ALTER TABLE *tbl* DROP FOREIGN KEY *fk_name*;可以在启用或禁用
foreign_key_checks选项的情况下在线执行删除外键操作。如果不知道特定表上外键约束的名称,请发出以下语句,并在每个外键的
CONSTRAINT子句中找到约束名称:SHOW CREATE TABLE *table*\G或者,查询信息模式
TABLE_CONSTRAINTS表,并使用CONSTRAINT_NAME和CONSTRAINT_TYPE列来识别外键名称。您还可以在单个语句中删除外键及其关联的索引:
ALTER TABLE *table* DROP FOREIGN KEY *constraint*, DROP INDEX *index*;
注意
如果表中已经存在外键(即,它是包含FOREIGN KEY ... REFERENCE子句的子表),则对在线 DDL 操作会有额外限制,即使这些操作并不直接涉及外键列:
-
如果对父表的更改通过
ON UPDATE或ON DELETE子句使用CASCADE或SET NULL参数导致子表中的关联更改,那么对子表进行的ALTER TABLE可能需要等待另一个事务提交。 -
同样,如果一张表是外键关系中的父表,即使它不包含任何
FOREIGN KEY子句,如果INSERT、UPDATE或DELETE语句导致子表中的ON UPDATE或ON DELETE操作,它也可能需要等待ALTER TABLE完成。
表操作
以下表格提供了表操作的在线 DDL 支持概述。星号表示额外信息、异常或依赖关系。有关详细信息,请参阅语法和用法说明。
表 17.21 表操作的在线 DDL 支持
| 操作 | 立即 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
更改 ROW_FORMAT | 否 | 是 | 是 | 是 | 否 |
更改 KEY_BLOCK_SIZE | 否 | 是 | 是 | 是 | 否 |
| 设置持久表统计信息 | 否 | 是 | 否 | 是 | 是 |
| 指定字符集 | 否 | 是 | 是* | 是 | 否 |
| 转换字符集 | 否 | 否 | 是* | 否 | 否 |
| 优化表 | 否 | 是* | 是 | 是 | 否 |
使用 FORCE 选项重建 | 否 | 是* | 是 | 是 | 否 |
| 执行空重建 | 否 | 是* | 是 | 是 | 否 |
| 重命名表 | 是 | 是 | 否 | 是 | 是 |
语法和用法说明
-
更改
ROW_FORMATALTER TABLE *tbl_name* ROW_FORMAT = *row_format*, ALGORITHM=INPLACE, LOCK=NONE;数据进行了大幅重组,这是一个昂贵的操作。
有关
ROW_FORMAT选项的更多信息,请参见表选项。 -
更改
KEY_BLOCK_SIZEALTER TABLE *tbl_name* KEY_BLOCK_SIZE = *value*, ALGORITHM=INPLACE, LOCK=NONE;数据进行了大幅重组,这是一个昂贵的操作。
有关
KEY_BLOCK_SIZE选项的更多信息,请参见表选项。 -
设置持久表统计信息选项
ALTER TABLE *tbl_name* STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;仅修改表元数据。
持久统计信息包括
STATS_PERSISTENT、STATS_AUTO_RECALC和STATS_SAMPLE_PAGES。有关更多信息,请参见 Section 17.8.10.1, “Configuring Persistent Optimizer Statistics Parameters”。 -
指定字符集
ALTER TABLE *tbl_name* CHARACTER SET = *charset_name*, ALGORITHM=INPLACE, LOCK=NONE;如果新的字符编码不同,则重新构建表。
-
转换字符集
ALTER TABLE *tbl_name* CONVERT TO CHARACTER SET *charset_name*, ALGORITHM=COPY;如果新的字符编码不同,则重新构建表。
-
优化表
OPTIMIZE TABLE *tbl_name*;不支持具有
FULLTEXT索引的表的就地操作。该操作使用INPLACE算法,但不允��使用ALGORITHM和LOCK语法。 -
使用
FORCE选项重建表ALTER TABLE *tbl_name* FORCE, ALGORITHM=INPLACE, LOCK=NONE;在 MySQL 5.6.17 中使用
ALGORITHM=INPLACE。对于具有FULLTEXT索引的表,不支持ALGORITHM=INPLACE。 -
执行“null”重建`ALTER TABLE *tbl_name* ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;`在 MySQL 5.6.17 中使用
ALGORITHM=INPLACE。对于具有FULLTEXT索引的表,不支持ALGORITHM=INPLACE。 -
重命名表`ALTER TABLE *old_tbl_name* RENAME TO *new_tbl_name*, ALGORITHM=INSTANT;`重命名表可以立即执行或就地执行。MySQL 重命名与表 *tbl_name* 对应的文件,而不进行复制。(您也可以使用RENAME TABLE语句来重命名表。请参见 Section 15.1.36, “RENAME TABLE Statement”。)专门授予重命名表的权限不会迁移到新名称。必须手动更改。
`#### 表空间操作
以下表格概述了表空间操作的在线 DDL 支持。有关详细信息,请参见语法和用法说明。
表 17.22 表空间操作的在线 DDL 支持
| 操作 | 立即 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
|---|---|---|---|---|---|
| 重命名通用表空间 | 否 | 是 | 否 | 是 | 是 |
| 启用或禁用通用表空间加密 | 否 | 是 | 否 | 是 | 否 |
| 启用或禁用按表加密的表空间 | 否 | 否 | 是 | 否 | 否 |
语法和使用说明
-
重命名通用表空间
ALTER TABLESPACE *tablespace_name* RENAME TO *new_tablespace_name*;ALTER TABLESPACE ... RENAME TO使用INPLACE算法,但不支持ALGORITHM子句。 -
启用或禁用通用表空间加密
ALTER TABLESPACE *tablespace_name* ENCRYPTION='Y';ALTER TABLESPACE ... ENCRYPTION使用INPLACE算法,但不支持ALGORITHM子句。有关相关信息,请参阅第 17.13 节,“InnoDB 数据静态加密”。
-
启用或禁用按表加密的表空间
ALTER TABLE *tbl_name* ENCRYPTION='Y', ALGORITHM=COPY;有关相关信息,请参阅第 17.13 节,“InnoDB 数据静态加密”。
分区操作
除了一些ALTER TABLE分区子句外,针对分区InnoDB表的在线 DDL 操作遵循适用于常规InnoDB表的相同规则。
一些ALTER TABLE分区子句不会像常规非分区InnoDB表一样通过相同的内部在线 DDL API。因此,对于ALTER TABLE分区子句的在线支持有所不同。
以下表格显示了每个ALTER TABLE分区语句的在线状态。无论使用哪种在线 DDL API,MySQL 都会尽可能减少数据复制和锁定。
使用ALGORITHM=COPY的ALTER TABLE分区选项或仅允许“ALGORITHM=DEFAULT, LOCK=DEFAULT”的选项,使用COPY算法重新分区表。换句话说,使用新的分区方案创建了一个新的分区表。新创建的表包括ALTER TABLE语句应用的任何更改,并且表数据被复制到新表结构中。
表 17.23 分区操作的在线 DDL 支持
| 分区子句 | 立即 | 就地 | 允许 DML | 备注 |
|---|---|---|---|---|
PARTITION BY | 否 | 否 | 否 | 允许ALGORITHM=COPY,LOCK={DEFAULT|SHARED|EXCLUSIVE} |
ADD PARTITION | 否 | 是* | 是* | 对于 RANGE 和 LIST 分区,支持 ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE},对于 HASH 和 KEY 分区,支持 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE},对于所有分区类型,支持 ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE}。对于使用 RANGE 或 LIST 进行分区的表,不会复制现有数据。对于使用 HASH 或 LIST 进行分区的表,允许使用 ALGORITHM=COPY 进行并发查询,因为 MySQL 在持有共享锁的同时复制数据。 |
DROP PARTITION | 否 | 是* | 是* | 支持 ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE}。对于使用 RANGE 或 LIST 进行分区的表,不会复制数据。使用 ALGORITHM=INPLACE 的 DROP PARTITION 删除存储在分区中的数据并删除该分区。然而,使用 ALGORITHM=COPY 或 old_alter_table=ON 的 DROP PARTITION 会重建分区表,并尝试将数据从已删除的分区移动到具有兼容的 PARTITION ... VALUES 定义的另一个分区。无法移动到另一个分区的数据将被删除。 |
DISCARD PARTITION | 否 | 否 | 否 | 仅允许 ALGORITHM=DEFAULT, LOCK=DEFAULT |
IMPORT PARTITION | 否 | 否 | 否 | 仅允许 ALGORITHM=DEFAULT, LOCK=DEFAULT |
TRUNCATE PARTITION | 否 | 是 | 是 | 不复制现有数据。它仅删除行;不会改变表本身或任何分区的定义。 |
COALESCE PARTITION | 否 | 是* | 否 | 支持 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}。 |
REORGANIZE PARTITION | 否 | 是* | 否 | 支持 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}。 |
EXCHANGE PARTITION | 否 | 是 | 是 | |
ANALYZE PARTITION | 否 | 是 | 是 | |
CHECK PARTITION | 否 | 是 | 是 | |
OPTIMIZE PARTITION | 否 | 否 | 否 | ALGORITHM 和 LOCK 子句被忽略。重建整个表。参见 Section 26.3.4, “Maintenance of Partitions”。 |
REBUILD PARTITION | 否 | 是* | 否 | 支持 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}。 |
REPAIR PARTITION | 否 | 是 | 是 | |
REMOVE PARTITIONING | 否 | 否 | 否 | 允许 ALGORITHM=COPY,LOCK={DEFAULT|SHARED|EXCLUSIVE} |
| 分区子句 | 瞬时 | 就地 | 允许 DML | 备注 |
针对分区表的非分区在线ALTER TABLE操作遵循适用于常规表的相同规则。然而,ALTER TABLE对每个表分区执行在线操作,这会导致系统资源需求增加,因为操作在多个分区上执行。
有关ALTER TABLE分区子句的更多信息,请参阅分区选项,以及第 15.1.9.1 节,“ALTER TABLE 分区操作”。有关分区的一般信息,请参阅第二十六章,“分区”。
17.12.2 在线 DDL 性能和并发性
译文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-performance.html
在线 DDL 改进了 MySQL 操作的几个方面:
-
访问表的应用程序更具响应性,因为在 DDL 操作进行时,表上的查询和 DML 操作可以继续进行。减少对 MySQL 服务器资源的锁定和等待会导致更大的可伸缩性,即使对于不涉及 DDL 操作的操作也是如此。
-
即时操作仅修改数据字典中的元数据。在操作执行阶段可能会短暂地获取表的独占元数据锁。表数据不受影响,使操作瞬间完成。允许并发 DML。
-
在线操作避免了与表复制方法相关的磁盘 I/O 和 CPU 周期,从而最小化了数据库的整体负载。减少负载有助于在 DDL 操作期间保持良好的性能和高吞吐量。
-
在线操作读取的数据比表复制操作少,这减少了频繁访问数据从内存中清除的次数。频繁访问数据的清除可能导致 DDL 操作后的临时性能下降。
LOCK 子句
默认情况下,MySQL 在 DDL 操作期间尽可能少地使用锁定。如果需要,可以为原地操作和一些复制操作指定LOCK子句以强制执行更严格的锁定。如果LOCK子句指定的锁定级别比特定 DDL 操作允许的锁定级别更不严格,则语句将失败并显示错误。下面按照从最不严格到最严格的顺序描述了LOCK子句:
-
LOCK=NONE:允许并发查询和 DML。
例如,对涉及客户注册或购买的表使用此子句,以避免在长时间的 DDL 操作期间使表不可用。
-
LOCK=SHARED:允许并发查询但阻止 DML。
例如,在数据仓库表上使用此子句,可以延迟数据加载操作直到 DDL 操作完成,但查询不能被延迟太长时间。
-
LOCK=DEFAULT:允许尽可能多的并发性(并发查询、DML 或两者兼有)。省略
LOCK子句与指定LOCK=DEFAULT相同。当您不希望 DDL 语句的默认锁定级别对表造成任何可用性问题时,请使用此子句。
-
LOCK=EXCLUSIVE:阻止并发查询和 DML。
如果主要关注尽快完成 DDL 操作,并且不需要并发查询和 DML 访问,则使用此子句。如果服务器应该处于空闲状态,以避免意外的表访问,也可以使用此子句。
在线 DDL 和元数据锁
在线 DDL 操作可以看作有三个阶段:
-
阶段 1:初始化
在初始化阶段,服务器确定操作期间允许多少并发性,考虑到存储引擎的能力、语句中指定的操作以及用户指定的
ALGORITHM和LOCK选项。在此阶段,会获取一个共享可升级的元数据锁以保护当前表定义。 -
阶段 2: 执行
在此阶段,语句被准备和执行。元数据锁是否升级为独占取决于初始化阶段评估的因素。如果需要独占元数据锁,则仅在语句准备期间短暂获取。
-
阶段 3: 提交表定义
在提交表定义阶段,元数据锁被升级为独占,以清除旧表定义并提交新表定义。一旦授予,独占元数据锁的持续时间很短。
由于上述独占元数据锁要求,在线 DDL 操作可能需要等待对表上持有元数据锁的并发事务进行提交或回滚。在 DDL 操作之前或期间启动的事务可以在正在更改的表上持有元数据锁。在长时间运行或不活动事务的情况下,在线 DDL 操作可能会因等待独占元数据锁而超时。此外,在线 DDL 操作请求的待处理独占元数据锁会阻止表上的后续事务。
以下示例演示了一个在线 DDL 操作等待独占元数据锁的情况,以及待处理元数据锁如何阻止表上的后续事务。
会话 1:
mysql> CREATE TABLE t1 (c1 INT) ENGINE=InnoDB;
mysql> START TRANSACTION;
mysql> SELECT * FROM t1;
会话 1 的SELECT语句在表 t1 上获取了一个共享元数据锁。
会话 2:
mysql> ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE;
会话 2 中的在线 DDL 操作需要在表 t1 上获取独占元数据锁以提交表定义更改,必须等待会话 1 的事务提交或回滚。
会话 3:
mysql> SELECT * FROM t1;
会话 3 中发出的SELECT语句正在等待会话 2 中的ALTER TABLE操作请求的独占元数据锁被授予。
您可以使用SHOW FULL PROCESSLIST来确定事务是否在等待元数据锁。
mysql> SHOW FULL PROCESSLIST\G
...
*************************** 2\. row ***************************
Id: 5
User: root
Host: localhost
db: test
Command: Query
Time: 44
State: Waiting for table metadata lock
Info: ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE
...
*************************** 4\. row ***************************
Id: 7
User: root
Host: localhost
db: test
Command: Query
Time: 5
State: Waiting for table metadata lock
Info: SELECT * FROM t1 4 rows in set (0.00 sec)
元数据锁信息也通过性能模式metadata_locks表暴露出来,该表提供了关于会话之间的元数据锁依赖关系、会话正在等待的元数据锁以及当前持有元数据锁的会话的信息。更多信息,请参见 Section 29.12.13.3, “The metadata_locks Table”。
在线 DDL 性能
DDL 操作的性能在很大程度上取决于操作是立即执行、原地执行还是重建表。
要评估 DDL 操作的相对性能,可以比较使用ALGORITHM=INSTANT、ALGORITHM=INPLACE和ALGORITHM=COPY的结果。还可以启用old_alter_table运行语句以强制使用ALGORITHM=COPY。
对于修改表数据的 DDL 操作,您可以通过查看命令完成后显示的“受影响行数”值来确定 DDL 操作是在原地执行还是执行表复制。例如:
-
更改列的默认值(快速,不影响表数据):
Query OK, 0 rows affected (0.07 sec) -
添加索引(需要时间,但
0 rows affected表明表没有被复制):Query OK, 0 rows affected (21.42 sec) -
更改列的数据类型(需要大量时间,并需要重建表的所有行):
Query OK, 1671168 rows affected (1 min 35.54 sec)
在大表上运行 DDL 操作之前,请按以下方式检查操作是快还是慢:
-
克隆表结构。
-
使用少量数据填充克隆表。
-
在克隆表上运行 DDL 操作。
-
检查“受影响行数”值是否为零。非零值表示操作复制表数据,这可能需要特殊规划。例如,您可以在计划的停机期间执行 DDL 操作,或者逐个在每个副本服务器上执行。
注意
要更好地了解与 DDL 操作相关的 MySQL 处理,可以在 DDL 操作之前和之后检查与InnoDB相关的性能模式和INFORMATION_SCHEMA表,以查看物理读取、写入、内存分配等的数量。
可以使用性能模式阶段事件来监视ALTER TABLE的进度。请参阅第 17.16.1 节,“使用性能模式监视 InnoDB 表的 ALTER TABLE 进度”。
由于记录并发 DML 操作所做的更改涉及一些处理工作,然后在最后应用这些更改,因此在线 DDL 操作的总体时间可能比阻止其他会话访问表的表复制机制更长。原始性能的降低与对使用表的应用程序更好的响应性之间取得平衡。在评估更改表结构的技术时,考虑基于诸如网页加载时间等因素的终端用户对性能的感知。
17.12.3 在线 DDL 空间需求
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-space-requirements.html
在线 DDL 操作的磁盘空间需求如下所述。这些需求不适用于立即执行的操作。
-
临时日志文件:
临时日志文件记录了在线 DDL 操作创建索引或修改表时的并发 DML。临时日志文件根据
innodb_sort_buffer_size的值进行扩展,最大扩展到innodb_online_alter_log_max_size指定的最大值。如果操作花费很长时间,且并发 DML 修改表的量超过临时日志文件的大小超过innodb_online_alter_log_max_size的值,那么在线 DDL 操作将因为DB_ONLINE_LOG_TOO_BIG错误而失败,并且未提交的并发 DML 操作将被回滚。设置较大的innodb_online_alter_log_max_size允许在线 DDL 操作期间进行更多的 DML,但也会延长 DDL 操作结束时表被锁定以应用已记录 DML 的时间。innodb_sort_buffer_size变量还定义了临时日志文件读取缓冲区和写入缓冲区的大小。 -
临时排序文件:
重建表的在线 DDL 操作在索引创建过程中将临时排序文件写入 MySQL 临时目录(Unix 上的
$TMPDIR,Windows 上的%TEMP%,或由--tmpdir指定的目录)。临时排序文件不会在包含原始表的目录中创建。每个临时排序文件足够大以容纳一列数据,并且在其数据合并到最终表或索引时将删除每个排序文件。涉及临时排序文件的操作可能需要临时空间,等于表中数据加索引的量。如果在线 DDL 操作使用了数据目录所在文件系统上所有可用的磁盘空间,则会报告错误。如果 MySQL 临时目录不足以容纳排序文件,请将
tmpdir设置为另一个目录。或者,使用innodb_tmpdir为在线 DDL 操作定义一个单独的临时目录。此选项旨在帮助避免由于大型临时排序文件导致的临时目录溢出。 -
中间表文件:
一些在线 DDL 操作重新构建表时会在与原始表相同的目录中创建一个临时中间表文件。中间表文件可能需要与原始表大小相等的空间。中间表文件的名称以
#sql-ib前缀开头,在在线 DDL 操作期间只会短暂出现。innodb_tmpdir选项不适用于中间表文件。
17.12.4 在线 DDL 内存管理
原文:
dev.mysql.com/doc/refman/8.0/en/online-ddl-memory-management.html
在线 DDL 操作在创建或重建二级索引的不同阶段分配临时缓冲区。innodb_ddl_buffer_size 变量,于 MySQL 8.0.27 中引入,定义了在线 DDL 操作的最大缓冲区大小。默认设置为 1048576 字节(1 MB)。该设置适用于执行在线 DDL 操作的线程创建的缓冲区。定义适当的缓冲区大小限制可避免在线 DDL 操作创建或重建二级索引时出现潜在的内存不足错误。每个 DDL 线程的最大缓冲区大小是最大缓冲区大小除以 DDL 线程数(innodb_ddl_buffer_size/innodb_ddl_threads)。
在 MySQL 8.0.27 之前,innodb_sort_buffer_size 变量定义了在线 DDL 操作创建或重建二级索引的缓冲区大小。
17.12.5 配置在线 DDL 操作的并行线程
原文:
dev.mysql.com/doc/refman/8.0/en/online-ddl-parallel-thread-configuration.html
在创建或重建二级索引的在线 DDL 操作的工作流程中涉及:
-
扫描聚簇索引并将数据写入临时排序文件
-
对数据进行排序
-
从临时排序文件加载排序后的数据到二级索引中
可用于扫描聚簇索引的并行线程数由innodb_parallel_read_threads变量定义。默认设置为 4。最大设置为 256,这是所有会话的最大数。扫描聚簇索引的实际线程数是由innodb_parallel_read_threads设置或要扫描的索引子树数中较小的那个数定义的。如果达到线程限制,会话将回退到使用单个线程。
控制排序和加载数据的并行线程数由innodb_ddl_threads变量控制,该变量在 MySQL 8.0.27 中引入。默认设置为 4。在 MySQL 8.0.27 之前,排序和加载操作是单线程的。
以下限制适用:
-
不支持用于构建包含虚拟列的索引的并行线程。
-
完全文本索引创建不支持并行线程。
-
不支持并行线程用于空间索引创建。
-
在定义具有虚拟列的表上不支持并行扫描。
-
在定义具有全文本索引的表上不支持并行扫描。
-
在定义具有空间索引的表上不支持并行扫描。
17.12.6 通过在线 DDL 简化 DDL 语句
译文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-single-multi.html
在引入在线 DDL 之前,将许多 DDL 操作合并为单个ALTER TABLE语句是常见做法。因为每个ALTER TABLE语句都涉及复制和重建表,所以一次对同一表进行多个更改更有效,因为这些更改可以在一次表的重建操作中完成。不利之处在于,涉及 DDL 操作的 SQL 代码更难维护和在不同脚本中重复使用。如果每次具体更改都不同,你可能需要为每个略有不同的情况构建一个新的复杂ALTER TABLE。
对于可以在线执行的 DDL 操作,你可以将它们分开为单独的ALTER TABLE语句,以便更轻松地编写脚本和维护,而不会牺牲效率。例如,你可以将一个复杂的语句简化为:
ALTER TABLE t1 ADD INDEX i1(c1), ADD UNIQUE INDEX i2(c2),
CHANGE c4_old_name c4_new_name INTEGER UNSIGNED;
并将其分解为可以独立测试和执行的更简单的部分,例如:
ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;
你可能仍然使用多部分ALTER TABLE语句来:
-
必须按特定顺序执行的操作,例如创建索引,然后创建使用该索引的外键约束。
-
所有使用相同特定
LOCK子句的操作,你希望它们作为一个组要么成功要么失败。 -
无法在线执行的操作,即仍使用表复制方法的操作。
-
为其指定
ALGORITHM=COPY或old_alter_table=1的操作,以在特定情况下需要精确向后兼容性时强制执行表复制行为。
17.12.7 在线 DDL 失败条件
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-failure-conditions.html
在线 DDL 操作失败通常是由以下条件之一导致的:
-
一个
ALGORITHM子句指定了一个与特定类型的 DDL 操作或存储引擎不兼容的算法。 -
一个
LOCK子句指定了一个低程度的锁定(SHARED或NONE),这与特定类型的 DDL 操作不兼容。 -
在等待对表的独占锁时发生超时,这可能在 DDL 操作的初始和最终阶段短暂需要。
-
当 MySQL 在索引创建过程中在磁盘上写入临时排序文件时,
tmpdir或innodb_tmpdir文件系统的磁盘空间不足。有关更多信息,请参见第 17.12.3 节,“在线 DDL 空间要求”。 -
该操作需要很长时间,同时并发的 DML 修改了表,使得临时在线日志的大小超过了
innodb_online_alter_log_max_size配置选项的值。这种情况会导致DB_ONLINE_LOG_TOO_BIG错误。 -
并发的 DML 对表进行了更改,这些更改在原始表定义中是允许的,但在新表定义中不允许。该操作仅在最后阶段失败,当 MySQL 尝试应用所有并发 DML 语句的更改时。例如,您可能在创建唯一索引时插入重复值,或者在创建主键索引时插入
NULL值。并发 DML 所做的更改优先级更高,并且ALTER TABLE操作实际上被回滚。
17.12.8 在线 DDL 限制
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-limitations.html
在线 DDL 操作有以下限制:
-
在
TEMPORARY TABLE上创建索引时,表会被复制。 -
如果表上存在
ON...CASCADE或ON...SET NULL约束,则不允许使用ALTER TABLE子句LOCK=NONE。 -
在原地在线 DDL 操作完成之前,必须等待持有表上元数据锁的事务提交或回滚。在线 DDL 操作在执行阶段可能会短暂地需要表上的独占元数据锁,并且在更新表定义时的操作的最后阶段始终需要一个。因此,持有表上元数据锁的事务可能会导致在线 DDL 操作阻塞。持有表上元数据锁的事务可能在在线 DDL 操作之前或期间启动。持有表上元数据锁的长时间运行或不活动事务可能会导致在线 DDL 操作超时。
-
在运行原地在线 DDL 操作时,运行
ALTER TABLE语句的线程会应用同时在其他连接线程上并发运行的 DML 操作的在线日志。当应用 DML 操作时,可能会遇到重复键入错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是临时的,并且会在在线日志中的后续条目中被撤销。这类似于InnoDB中外键约束检查的概念,在事务期间约束必须保持。 -
对于
InnoDB表的OPTIMIZE TABLE被映射为一个ALTER TABLE操作,用于重建表并更新索引统计信息以及释放聚簇索引中未使用的空间。由于键按照它们在主键中出现的顺序插入,次要索引的创建效率不高。通过为重建常规和分区InnoDB表提供在线 DDL 支持,支持OPTIMIZE TABLE。 -
在 MySQL 5.6 之前创建的包含时间列(
DATE、DATETIME或TIMESTAMP)且未使用ALGORITHM=COPY重建的表不支持ALGORITHM=INPLACE。在这种情况下,ALTER TABLE ... ALGORITHM=INPLACE操作会返回以下错误:ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. -
在涉及重建表的大表的在线 DDL 操作中,通常适用以下限制:
-
没有机制可以暂停在线 DDL 操作或限制在线 DDL 操作的 I/O 或 CPU 使用率。
-
如果在线 DDL 操作失败,回滚操作可能会很昂贵。
-
长时间运行的在线 DDL 操作可能导致复制延迟。在线 DDL 操作必须在源端完成运行后才能在副本上运行。此外,在源端并发处理的 DML 仅在副本上在副本上的 DDL 操作完成后才会处理。
有关在大表上运行在线 DDL 操作的更多信息,请参见第 17.12.2 节,“在线 DDL 性能和并发性”。
-
17.13 InnoDB 数据静态加密
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html
InnoDB支持对 file-per-table 表空间、通用表空间、mysql系统表空间、重做日志和撤销日志进行数据静态加密。
截至 MySQL 8.0.16 版本,还支持为模式和通用表空间设置加密默认值,这使得 DBA 可以控制在这些模式和表空间中创建的表是否加密。
InnoDB数据静态加密的特性和功能在本节的以下主题中描述。
-
关于数据静态加密
-
加密先决条件
-
为模式和通用表空间定义加密默认值
-
文件-每表表空间加密
-
通用表空间加密
-
双写文件加密
-
mysql 系统表空间加密
-
重做日志加密
-
撤销日志加密
-
主密钥轮换
-
加密和恢复
-
导出加密表空间
-
加密和复制
-
识别加密表空间和模式
-
监控加密进度
-
加密使用注意事项
-
加密限制
关于数据静态加密
InnoDB 使用两层加密密钥架构,包括主加密密钥和表空间密钥。当一个表空间被加密时,表空间密钥会被加密并存储在表空间头部。当应用程序或经过身份验证的用户想要访问加密的表空间数据时,InnoDB 使用主加密密钥来解密表空间密钥。解密后的表空间密钥版本永远不会改变,但主加密密钥可以根据需要更改。这个操作被称为主密钥轮换。
数据静态加密功能依赖于密钥环组件或插件进行主加密密钥管理。
所有 MySQL 版本都提供 component_keyring_file 组件和 keyring_file 插件,每个都将密钥环数据存储在服务器主机本地的文件中。
MySQL 企业版提供额外的密钥环组件和插件:
-
component_keyring_encrypted_file:将密钥环数据存储在服务器主机本地的加密、受密码保护的文件中。 -
keyring_encrypted_file:将密钥环数据存储在服务器主机本地的加密、受密码保护的文件中。 -
keyring_okv:用于与支持 KMIP 的后端密钥环存储产品一起使用的 KMIP 1.1 插件。支持的 KMIP 兼容产品包括集中式密钥管理解决方案,如 Oracle Key Vault、Gemalto KeySecure、Thales Vormetric 密钥管理服务器和 Fornetix Key Orchestration。 -
keyring_aws:与亚马逊网络服务密钥管理服务(AWS KMS)通信,作为密钥生成的后端,并使用本地文件进行密钥存储。 -
keyring_hashicorp:与 HashiCorp Vault 通信,作为后端存储。
警告
对于加密密钥管理,component_keyring_file 和 component_keyring_encrypted_file 组件,以及 keyring_file 和 keyring_encrypted_file 插件并不作为符合监管合规性的解决方案。诸如 PCI、FIPS 等安全标准要求使用密钥管理系统来在密钥保险库或硬件安全模块(HSM)中安全、管理和保护加密密钥。
安全而强大的加密密钥管理解决方案对于安全性和符合各种安全标准至关重要。当数据静态加密功能使用集中式密钥管理解决方案时,该功能被称为“MySQL 企业透明数据加密(TDE)”。
数据静态加密功能支持高级加密标准(AES)块加密算法。它使用电子密码本(ECB)块加密模式进行表空间密钥加密,使用密码块链接(CBC)块加密模式进行数据加密。
有关数据静态加密功能的常见问题,请参见 Section A.17,“MySQL 8.0 FAQ:InnoDB 数据静态加密”。
加密先决条件
-
密钥环组件或插件必须在启动时安装和配置。早期加载确保在初始化
InnoDB存储引擎之前可用该组件或插件。有关密钥环安装和配置说明,请参见 Section 8.4.4,“MySQL 密钥环”。说明显示如何确保所选组件或插件处于活动状态。一次只能启用一个密钥环组件或插件。启用多个密钥环组件或插件是不受支持的,结果可能不如预期。
重要
一旦在 MySQL 实例中创建了加密表空间,创建加密表空间时加载的密钥环组件或插件必须继续在启动时加载。如果未能这样做,将在启动服务器和
InnoDB恢复期间出现错误。 -
在加密生产数据时,请确保采取措施防止主加密密钥丢失。如果主加密密钥丢失,则存储在加密表空间文件中的数据将无法恢复。 如果您使用
component_keyring_file或component_keyring_encrypted_file组件,或者keyring_file或keyring_encrypted_file插件,在创建第一个加密表空间后立即创建密钥环数据文件的备份,在主密钥轮换之前和之后。对于每个组件,其配置文件指示数据文件位置。keyring_file_data配置选项定义了keyring_file插件的密钥环数据文件位置。keyring_encrypted_file_data配置选项定义了keyring_encrypted_file插件的密钥环数据文件位置。如果您使用keyring_okv或keyring_aws插件,请确保已执行必要的配置。有关说明,请参见 Section 8.4.4,“MySQL 密钥环”。
为模式和常规表空间定义加密默认值
从 MySQL 8.0.16 开始,default_table_encryption系统变量定义了模式和常规表空间的默认加密设置。在未明确指定ENCRYPTION子句时,CREATE TABLESPACE和CREATE SCHEMA操作将应用default_table_encryption设置。
ALTER SCHEMA和ALTER TABLESPACE操作不适用于default_table_encryption设置。必须明确指定ENCRYPTION子句才能更改现有模式或通用表空间的加密。
可以使用SET语法为单个客户端连接或全局设置default_table_encryption变量。例如,以下语句在全局范围内启用默认模式和表空间加密:
mysql> SET GLOBAL default_table_encryption=ON;
还可以在创建或更改模式时使用DEFAULT ENCRYPTION子句来定义模式的默认加密设置,如下例所示:
mysql> CREATE SCHEMA test DEFAULT ENCRYPTION = 'Y';
如果在创建模式时未指定DEFAULT ENCRYPTION子句,则将应用default_table_encryption设置。必须指定DEFAULT ENCRYPTION子句才能更改现有模式的默认加密。否则,模式将保留其当前的加密设置。
默认情况下,表继承所在模式或通用表空间的加密设置。例如,在启用加密的模式中创建的表默认是加密的。此行为使得数据库管理员可以通过定义和强制模式和通用表空间加密默认值来控制表加密的使用。
加密默认值是通过启用table_encryption_privilege_check系统变量来强制执行的。当启用table_encryption_privilege_check时,在创建或更改具有与default_table_encryption设置不同的加密设置的模式或通用表空间,或者在创建或更改具有与默认模式加密不同的加密设置的表时,将进行权限检查。当禁用table_encryption_privilege_check(默认情况下)时,权限检查不会发生,前述操作将被允许继续并显示警告。
当启用table_encryption_privilege_check时,需要TABLE_ENCRYPTION_ADMIN权限来覆盖默认加密设置。数据库管理员可以授予此权限,以使用户能够在创建或更改模式或通用表空间时偏离default_table_encryption设置,或在创建或更改表时偏离默认模式加密。此权限不允许在创建或更改表时偏离通用表空间的加密。表必须与其所在的通用表空间具有相同的加密设置。
每表表空间加密
从 MySQL 8.0.16 开始,每表表空间将继承创建表所在模式的默认加密,除非在CREATE TABLE语句中明确指定了一个ENCRYPTION子句。在 MySQL 8.0.16 之前,必须指定ENCRYPTION子句才能启用加密。
mysql> CREATE TABLE t1 (c1 INT) ENCRYPTION = 'Y';
要更改现有每表表空间的加密方式,必须指定一个ENCRYPTION子句。
mysql> ALTER TABLE t1 ENCRYPTION = 'Y';
从 MySQL 8.0.16 开始,如果启用了table_encryption_privilege_check变量,则指定一个与默认模式加密不同的设置的ENCRYPTION子句需要TABLE_ENCRYPTION_ADMIN权限。请参阅为模式和通用表空间定义加密默认值。
通用表空间加密
从 MySQL 8.0.16 开始,default_table_encryption变量确定新创建的通用表空间的加密,除非在CREATE TABLESPACE语句中明确指定了一个ENCRYPTION子句。在 MySQL 8.0.16 之前,必须指定ENCRYPTION子句才能启用加密。
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;
要更改现有通用表空间的加密方式,必须指定一个ENCRYPTION子句。
mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';
截至 MySQL 8.0.16,如果启用了table_encryption_privilege_check变量,则指定与default_table_encryption设置不同的设置的ENCRYPTION子句需要TABLE_ENCRYPTION_ADMIN权限。参见为模式和通用表空间定义加密默认值。
双写文件加密
从 MySQL 8.0.23 开始,双写文件的加密支持可用。InnoDB会自动加密属于加密表空间的双写文件页。不需要任何操作。双写文件页使用相关表空间的加密密钥进行加密。写入表空间数据文件的相同加密页也会写入双写文件。属于未加密表空间的双写文件页保持未加密状态。
在恢复过程中,加密的双写文件页会被解密并检查是否损坏。
mysql 系统表空间加密
从 MySQL 8.0.16 开始,mysql系统表空间的加密支持可用。
mysql系统表空间包含mysql系统数据库和 MySQL 数据字典表。默认情况下,它是未加密的。要为mysql系统表空间启用加密,需在ALTER TABLESPACE语句中指定表空间名称和ENCRYPTION选项。
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';
要禁用mysql系统表空间的加密,使用ALTER TABLESPACE语句设置ENCRYPTION = 'N'。
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';
启用或禁用mysql系统表空间的加密需要在实例中所有表上具有CREATE TABLESPACE权限(CREATE TABLESPACE on *.*)。
重做日志加密
重做日志数据加密是通过innodb_redo_log_encrypt配置选项启用的。默认情况下,重做日志加密是禁用的。
与表空间数据一样,重做日志数据加密发生在重做日志数据写入磁盘时,解密发生在重做日志数据从磁盘读取时。一旦重做日志数据被读入内存,它就是未加密的形式。重做日志数据使用表空间加密密钥进行加密和解密。
当启用innodb_redo_log_encrypt时,磁盘上存在的未加密重做日志页面保持未加密,新的重做日志页面以加密形式写入磁盘。同样,当禁用innodb_redo_log_encrypt时,磁盘上存在的加密重做日志页面保持加密,新的重做日志页面以未加密形式写入磁盘。
警告
MySQL 8.0.30 中引入的一个回归阻止一旦启用重做日志加密就禁用它。(Bug #108052,Bug #34456802)。
从 MySQL 8.0.30 开始,包括表空间加密密钥在内的重做日志加密元数据存储在具有最新检查点 LSN 的重做日志文件的头部。在 MySQL 8.0.30 之前,包括表空间加密密钥在内的重做日志加密元数据存储在第一个重做日志文件(ib_logfile0)的头部。如果带有加密元数据的重做日志文件被移除,则重做日志加密被禁用。
一旦启用重做日志加密,没有密钥环组件或插件或没有加密密钥的情况下,无法进行正常重启,因为InnoDB必须能够在启动时扫描重做页面,如果重做日志页面被加密,则无法实现。没有密钥环组件或插件或加密密钥,只能进行强制启动而不使用重做日志(SRV_FORCE_NO_LOG_REDO)。参见第 17.21.3 节,“强制 InnoDB 恢复”。
撤销日志加密
使用innodb_undo_log_encrypt配置选项启用撤销日志数据加密。撤销日志加密适用于驻留在撤销表空间中的撤销日志。参见第 17.6.3.4 节,“撤销表空间”。默认情况下,撤销日志数据加密是禁用的。
与表空间数据一样,撤销日志数据加密发生在将撤销日志数据写入磁盘时,解密发生在从磁盘读取撤销日志数据时。一旦撤销日志数据被读入内存,它就是未加密的形式。撤销日志数据使用表空间加密密钥进行加密和解密。
当启用innodb_undo_log_encrypt时,磁盘上存在的未加密撤销日志页面保持未加密,新的撤销日志页面以加密形式写入磁盘。同样,当禁用innodb_undo_log_encrypt时,磁盘上存在的加密撤销日志页面保持加密,新的撤销日志页面以未加密形式写入磁盘。
撤销日志加密元数据,包括表空间加密密钥,存储在撤销日志文件的头部。
注意
当撤销日志加密被禁用时,服务器将继续要求用于加密撤销日志数据的密钥环组件或插件,直到包含加密撤销日志数据的撤销表空间被截断。(仅当撤销表空间被截断时,加密头部才会从撤销表空间中移除。)有关截断撤销表空间的信息,请参阅截断撤销表空间。
主密钥旋转
主加密密钥应定期旋转,以及在怀疑密钥已被泄露时。
主密钥旋转是一个原子级别的实例操作。每次旋转主加密密钥时,MySQL 实例中的所有表空间密钥都会重新加密并保存回各自的表空间头部。作为原子操作,一旦启动旋转操作,重新加密必须成功完成所有表空间密钥。如果主密钥旋转在服务器故障时中断,InnoDB 在服务器重新启动时将操作向前推进。有关更多信息,请参阅加密和恢复。
旋转主加密密钥仅会更改主加密密钥并重新加密表空间密钥。它不会解密或重新加密相关的表空间数据。
旋转主加密密钥需要 ENCRYPTION_KEY_ADMIN 权限(或已弃用的 SUPER 权限)。
要旋转主加密密钥,请运行:
mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;
ALTER INSTANCE ROTATE INNODB MASTER KEY 支持并发 DML。但是,它不能与表空间加密操作同时运行,并且会采取锁定以防止由并发执行引起的冲突。如果正在运行一个 ALTER INSTANCE ROTATE INNODB MASTER KEY 操作,则必须等到该操作完成后,才能继续进行表空间加密操作,反之亦然。
加密和恢复
如果在加密操作期间发生服务器故障,则在服务器重新启动时将向前推进操作。对于一般表空间,加密操作将在后台线程中从上次处理的页面继续。
如果在主密钥旋转期间发生服务器故障,InnoDB 在服务器重新启动时继续操作。
必须在存储引擎初始化之前加载密钥环组件或插件,以便在InnoDB 初始化和恢复活动访问表空间数据之前从表空间头部检索解密表空间数据页所需的信息(请参阅加密先决条件)。
当InnoDB初始化和恢复开始时,主密钥旋转操作会继续。由于服务器故障,一些表空间密钥可能已经使用新的主加密密钥加密。InnoDB从每个表空间头读取加密数据,如果数据表明表空间密钥是使用旧的主加密密钥加密的,InnoDB会从 keyring 中检索旧密钥并用它解密表空间密钥。然后,InnoDB使用新的主加密密钥重新加密表空间密钥,并将重新加密的表空间密钥保存回表空间头。
导出加密表空间
仅支持文件-每表表空间的表空间导出。
当导出加密表空间时,InnoDB会生成一个传输密钥,用于加密表空间密钥。加密的表空间密钥和传输密钥存储在一个*tablespace_name*.cfp文件中。这个文件和加密的表空间文件一起需要执行导入操作。在导入时,InnoDB使用传输密钥解密*tablespace_name*.cfp文件中的表空间密钥。有关更多信息,请参见第 17.6.1.3 节,“导入 InnoDB 表”。
加密和复制
-
只有在源和副本运行支持表空间加密的 MySQL 版本的复制环境中才支持
ALTER INSTANCE ROTATE INNODB MASTER KEY语句。 -
成功的
ALTER INSTANCE ROTATE INNODB MASTER KEY语句会被写入二进制日志,用于副本的复制。 -
如果
ALTER INSTANCE ROTATE INNODB MASTER KEY语句失败,则不会记录到二进制日志中,也不会在副本上复制。 -
如果源上安装了 keyring 组件或插件,但副本上没有安装,则
ALTER INSTANCE ROTATE INNODB MASTER KEY操作的复制会失败。 -
如果源和副本上都安装了
keyring_file或keyring_encrypted_file插件,但副本没有 keyring 数据文件,则复制的ALTER INSTANCE ROTATE INNODB MASTER KEY语句会在副本上创建 keyring 数据文件,假设 keyring 文件数据没有缓存在内存中。如果可用,ALTER INSTANCE ROTATE INNODB MASTER KEY会使用缓存在内存中的 keyring 文件数据。
识别加密表空间和模式
MySQL 8.0.13 中引入的信息模式INNODB_TABLESPACES表包括一个ENCRYPTION列,可用于识别加密的表空间。
mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE ENCRYPTION='Y'\G
*************************** 1\. row ***************************
SPACE: 4294967294
NAME: mysql
SPACE_TYPE: General
ENCRYPTION: Y
*************************** 2\. row ***************************
SPACE: 2
NAME: test/t1
SPACE_TYPE: Single
ENCRYPTION: Y
*************************** 3\. row ***************************
SPACE: 3
NAME: ts1
SPACE_TYPE: General
ENCRYPTION: Y
当在CREATE TABLE或ALTER TABLE语句中指定ENCRYPTION选项时,它将记录在INFORMATION_SCHEMA.TABLES的CREATE_OPTIONS列中。可以查询此列以识别位于加密文件-每表表空间中的表。
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+
查询信息模式INNODB_TABLESPACES表,以检索与特定模式和表关联的表空间的信息。
mysql> SELECT SPACE, NAME, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='test/t1';
+-------+---------+------------+
| SPACE | NAME | SPACE_TYPE |
+-------+---------+------------+
| 3 | test/t1 | Single |
+-------+---------+------------+
您可以通过查询信息模式SCHEMATA表来识别启用加密的模式。
mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA
WHERE DEFAULT_ENCRYPTION='YES';
+-------------+--------------------+
| SCHEMA_NAME | DEFAULT_ENCRYPTION |
+-------------+--------------------+
| test | YES |
+-------------+--------------------+
SHOW CREATE SCHEMA还显示DEFAULT ENCRYPTION子句。
监控加密进度
您可以使用性能模式监视通用表空间和mysql系统表空间的加密进度。
stage/innodb/alter tablespace (encryption)阶段事件工具报告了通用表空间加密操作的WORK_ESTIMATED和WORK_COMPLETED信息。
以下示例演示了如何启用stage/innodb/alter tablespace (encryption)阶段事件工具和相关消费者表,以监视通用表空间或mysql系统表空间的加密进度。有关性能模式阶段事件工具和相关消费者的信息,请参阅第 29.12.5 节,“性能模式阶段事件表”。
-
启用
stage/innodb/alter tablespace (encryption)工具:mysql> USE performance_schema; mysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)'; -
启用包括
events_stages_current、events_stages_history和events_stages_history_long的阶段事件消费者表。mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%'; -
运行表空间加密操作。在此示例中,一个名为
ts1的通用表空间被加密。mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y'; -
通过查询性能模式
events_stages_current表来检查加密操作的进度。WORK_ESTIMATED报告表空间中的总页数。WORK_COMPLETED报告已处理的页数。mysql> SELECT EVENT_NAME, WORK_ESTIMATED, WORK_COMPLETED FROM events_stages_current; +--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +--------------------------------------------+----------------+----------------+ | stage/innodb/alter tablespace (encryption) | 1056 | 1407 | +--------------------------------------------+----------------+----------------+如果加密操作已完成,
events_stages_current表将返回一个空集。在这种情况下,您可以查询events_stages_history表查看已完成操作的事件数据。例如:mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history; +--------------------------------------------+----------------+----------------+ | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | +--------------------------------------------+----------------+----------------+ | stage/innodb/alter tablespace (encryption) | 1407 | 1407 | +--------------------------------------------+----------------+----------------+
加密使用注意事项
-
当修改具有
ENCRYPTION选项的现有每个文件表表空间时,请做好计划。驻留在每个文件表表空间中的表将使用COPY算法重建。当修改普通表空间或mysql系统表空间的ENCRYPTION属性时,将使用INPLACE算法。INPLACE算法允许在普通表空间中的表上进行并发 DML。并发 DDL 被阻止。 -
当一个普通表空间或
mysql系统表空间被加密时,驻留在表空间中的所有表都会被加密。同样,创建在加密表空间中的表也会被加密。 -
如果服务器在正常运行期间退出或停止,建议使用之前配置的相同加密设置重新启动服务器。
-
第一个主加密密钥是在第一个新的或现有的表空间加密时生成的。
-
主密钥轮换会重新加密表空间密钥,但不会更改表空间密钥本身。要更改表空间密钥,必须禁用并重新启用加密。对于每个表的文件表空间,重新加密表空间是一个
ALGORITHM=COPY操作,重新构建表。对于普通表空间和mysql系统表空间,这是一个ALGORITHM=INPLACE操作,不需要重新构建驻留在表空间中的表。 -
如果一个表同时使用
COMPRESSION和ENCRYPTION选项创建,压缩会在表空间数据加密之前执行。 -
如果一个密钥环数据文件(由
keyring_file_data或keyring_encrypted_file_data命名的文件)为空或丢失,第一次执行ALTER INSTANCE ROTATE INNODB MASTER KEY将创建一个主加密密钥。 -
卸载
component_keyring_file或component_keyring_encrypted_file组件不会删除现有的密钥环数据文件。卸载keyring_file或keyring_encrypted_file插件不会删除现有的密钥环数据文件。 -
建议不要将密钥环数据文件放在与表空间数据文件相同的目录下。
-
在运行时或重新启动服务器时修改
keyring_file_data或keyring_encrypted_file_data设置可能导致先前加密的表空间无法访问,导致数据丢失。 -
支持对通过添加
FULLTEXT索引隐式创建的InnoDBFULLTEXT索引表进行加密。有关相关信息,请参阅 InnoDB 全文索引表。
加密限制
-
高级加密标准(AES)是唯一支持的加密算法。
InnoDB表空间加密使用电子密码本(ECB)块加密模式进行表空间密钥加密,使用密码块链接(CBC)块加密模式进行数据加密。在 CBC 块加密模式下不使用填充。相反,InnoDB确保要加密的文本是块大小的倍数。 -
加密仅支持 file-per-table 表空间、general 表空间和
mysql系统表空间。MySQL 8.0.13 引入了对 general 表空间的加密支持。MySQL 8.0.16 引入了对mysql系统表空间的加密支持。不支持对其他表空间类型(包括InnoDB系统表空间)进行加密。 -
无法将加密的 file-per-table 表空间、general 表空间或
mysql系统表空间中的表移动或复制到不支持加密的表空间类型。 -
无法将表从加密的表空间移动或复制到未加密的表空间。但是,允许将表从未加密的表空间移动到加密的表空间。例如,可以将表从未加密的 file-per-table 或 general 表空间移动或复制到加密的 general 表空间。
-
默认情况下,表空间加密仅适用于表空间中的数据。可以通过启用
innodb_redo_log_encrypt和innodb_undo_log_encrypt来加密重做日志和撤销日志数据。参见重做日志加密和撤销日志加密。有关二进制日志文件和中继日志文件加密的信息,请参见第 19.3.2 节,“加密二进制日志文件和中继日志文件”。 -
不允许更改位于加密表空间中或先前位于加密表空间中的表的存储引擎。
17.14 InnoDB 启动选项和系统变量
-
可以通过命名启用或使用
--skip-前缀禁用在服务器启动时为真或假的系统变量。例如,要启用或禁用InnoDB自适应哈希索引,可以在命令行上使用--innodb-adaptive-hash-index或--skip-innodb-adaptive-hash-index,或在选项文件中使用innodb_adaptive_hash_index或skip_innodb_adaptive_hash_index。 -
一些变量描述涉及“启用”或“禁用”变量。这些变量可以通过将它们设置为
ON或1来使用SET语句启用,或通过将它们设置为OFF或0来禁用。布尔变量可以在启动时设置为ON、TRUE、OFF和FALSE(不区分大小写),以及1和0的值。参见第 6.2.2.4 节,“程序选项修饰符”。 -
���受数值的系统变量���以在命令行上指定为
--*var_name*=*value*,也可以在选项文件中指定为*var_name*=*value*。 -
许多系统变量可以在运行时更改(参见第 7.1.9.2 节,“动态系统变量”)。
-
有关
GLOBAL和SESSION变量范围修饰符的信息,请参考SET语句文档。 -
某些选项控制
InnoDB数据文件的位置和布局。第 17.8.1 节,“InnoDB 启动配置”解释了如何使用这些选项。 -
一些选项,可能最初不会使用,有助于根据机器容量和数据库工作负载调整
InnoDB性能特征。 -
有关指定选项和系统变量的更多信息,请参见第 6.2.2 节,“指定程序选项”。
表格 17.24 InnoDB 选项和变量参考
| 名称 | 命令行 | 选项文件 | 系统变量 | 状态变量 | 变量范围 | 动态 |
|---|---|---|---|---|---|---|
| daemon_memcached_enable_binlog | 是 | 是 | 是 | 全局 | 否 | |
| daemon_memcached_engine_lib_name | 是 | 是 | 是 | 全局 | 否 | |
| daemon_memcached_engine_lib_path | 是 | 是 | 是 | 全局 | 否 | |
| daemon_memcached_option | 是 | 是 | 是 | 全局 | 否 | |
| daemon_memcached_r_batch_size | 是 | 是 | 是 | 全局 | 否 | |
| daemon_memcached_w_batch_size | 是 | 是 | 是 | 全局 | 否 | |
| foreign_key_checks | 是 | 两者 | 是 | |||
| innodb | 是 | 是 | ||||
| innodb_adaptive_flushing | 是 | 是 | 是 | 全局 | 是 | |
| innodb_adaptive_flushing_lwm | 是 | 是 | 是 | 全局 | 是 | |
| innodb_adaptive_hash_index | 是 | 是 | 是 | 全局 | 是 | |
| innodb_adaptive_hash_index_parts | 是 | 是 | 是 | 全局 | 否 | |
| innodb_adaptive_max_sleep_delay | 是 | 是 | 是 | 全局 | 是 | |
| innodb_api_bk_commit_interval | 是 | 是 | 是 | 全局 | 是 | |
| innodb_api_disable_rowlock | 是 | 是 | 是 | 全局 | 否 | |
| innodb_api_enable_binlog | 是 | 是 | 是 | 全局 | 否 | |
| innodb_api_enable_mdl | 是 | 是 | 是 | 全局 | 否 | |
| innodb_api_trx_level | 是 | 是 | 是 | 全局 | 是 | |
| innodb_autoextend_increment | 是 | 是 | 是 | 全局 | 是 | |
| innodb_autoinc_lock_mode | 是 | 是 | 是 | 全局 | 否 | |
| innodb_background_drop_list_empty | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_buffer_pool_bytes_data | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_bytes_dirty | 是 | 全局 | 否 | |||
| innodb_buffer_pool_chunk_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_buffer_pool_debug | 是 | 是 | 是 | 全局 | 否 | |
| innodb_buffer_pool_dump_at_shutdown | 是 | 是 | 是 | 全局 | 是 | |
| innodb_buffer_pool_dump_now | 是 | 是 | 是 | 全局 | 是 | |
| innodb_buffer_pool_dump_pct | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_buffer_pool_dump_status | 是 | 全局 | 否 | |||
| innodb_buffer_pool_filename | 是 | 是 | 是 | 全局 | 是 | |
| innodb_buffer_pool_in_core_file | 是 | 是 | 是 | 全局 | 是 | |
| innodb_buffer_pool_instances | 是 | 是 | 是 | 全局 | 否 | |
| innodb_buffer_pool_load_abort | 是 | 是 | 是 | 全局 | 是 | |
| innodb_buffer_pool_load_at_startup | 是 | 是 | 是 | 全局 | 否 | |
| innodb_buffer_pool_load_now | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_buffer_pool_load_status | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_data | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_dirty | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_flushed | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_free | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_latched | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_misc | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_pages_total | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_read_ahead | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_read_ahead_evicted | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_read_ahead_rnd | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_read_requests | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_reads | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_resize_status | 是 | 全局 | 否 | |||
| innodb_buffer_pool_size | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_buffer_pool_wait_free | 是 | 全局 | 否 | |||
| Innodb_buffer_pool_write_requests | 是 | 全局 | 否 | |||
| innodb_change_buffer_max_size | 是 | 是 | 是 | 全局 | 是 | |
| innodb_change_buffering | 是 | 是 | 是 | 全局 | 是 | |
| innodb_change_buffering_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_checkpoint_disabled | 是 | 是 | 是 | 全局 | 是 | |
| innodb_checksum_algorithm | 是 | 是 | 是 | 全局 | 是 | |
| innodb_cmp_per_index_enabled | 是 | 是 | 是 | 全局 | 是 | |
| innodb_commit_concurrency | 是 | 是 | 是 | 全局 | 是 | |
| innodb_compress_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_compression_failure_threshold_pct | 是 | 是 | 是 | 全局 | 是 | |
| innodb_compression_level | 是 | 是 | 是 | 全局 | 是 | |
| innodb_compression_pad_pct_max | 是 | 是 | 是 | 全局 | 是 | |
| innodb_concurrency_tickets | 是 | 是 | 是 | 全局 | 是 | |
| innodb_data_file_path | 是 | 是 | 是 | 全局 | 否 | |
| Innodb_data_fsyncs | 是 | 全局 | 否 | |||
| innodb_data_home_dir | 是 | 是 | 是 | 全局 | 否 | |
| Innodb_data_pending_fsyncs | 是 | 全局 | 否 | |||
| Innodb_data_pending_reads | 是 | 全局 | 否 | |||
| Innodb_data_pending_writes | 是 | 全局 | 否 | |||
| Innodb_data_read | 是 | 全局 | 否 | |||
| Innodb_data_reads | 是 | 全局 | 否 | |||
| Innodb_data_writes | 是 | 全局 | 否 | |||
| Innodb_data_written | 是 | 全局 | 否 | |||
| Innodb_dblwr_pages_written | 是 | 全局 | 否 | |||
| Innodb_dblwr_writes | 是 | 全局 | 否 | |||
| innodb_ddl_buffer_size | 是 | 是 | 是 | 两者 | 是 | |
| innodb_ddl_log_crash_reset_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ddl_threads | 是 | 是 | 是 | 两者 | 是 | |
| innodb_deadlock_detect | 是 | 是 | 是 | 全局 | 是 | |
| innodb_dedicated_server | 是 | 是 | 是 | 全局 | 否 | |
| innodb_default_row_format | 是 | 是 | 是 | 全局 | 是 | |
| innodb_directories | 是 | 是 | 是 | 全局 | 否 | |
| innodb_disable_sort_file_cache | 是 | 是 | 是 | 全局 | 是 | |
| innodb_doublewrite | 是 | 是 | 是 | 全局 | 不定 | |
| innodb_doublewrite_batch_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_doublewrite_dir | 是 | 是 | 是 | 全局 | 否 | |
| innodb_doublewrite_files | 是 | 是 | 是 | 全局 | 否 | |
| innodb_doublewrite_pages | 是 | 是 | 是 | 全局 | 否 | |
| innodb_fast_shutdown | 是 | 是 | 是 | 全局 | 是 | |
| innodb_fil_make_page_dirty_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_file_per_table | 是 | 是 | 是 | 全局 | 是 | |
| innodb_fill_factor | 是 | 是 | 是 | 全局 | 是 | |
| innodb_flush_log_at_timeout | 是 | 是 | 是 | 全局 | 是 | |
| innodb_flush_log_at_trx_commit | 是 | 是 | 是 | 全局 | 是 | |
| innodb_flush_method | 是 | 是 | 是 | 全局 | 否 | |
| innodb_flush_neighbors | 是 | 是 | 是 | 全局 | 是 | |
| innodb_flush_sync | 是 | 是 | 是 | 全局 | 是 | |
| innodb_flushing_avg_loops | 是 | 是 | 是 | 全局 | 是 | |
| innodb_force_load_corrupted | 是 | 是 | 是 | 全局 | 否 | |
| innodb_force_recovery | 是 | 是 | 是 | 全局 | 否 | |
| innodb_fsync_threshold | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ft_aux_table | 是 | 全局 | 是 | |||
| innodb_ft_cache_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_ft_enable_diag_print | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ft_enable_stopword | 是 | 是 | 是 | 两者 | 是 | |
| innodb_ft_max_token_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_ft_min_token_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_ft_num_word_optimize | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ft_result_cache_limit | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ft_server_stopword_table | 是 | 是 | 是 | 全局 | 是 | |
| innodb_ft_sort_pll_degree | 是 | 是 | 是 | 全局 | 否 | |
| innodb_ft_total_cache_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_ft_user_stopword_table | 是 | 是 | 是 | 两者 | 是 | |
| Innodb_have_atomic_builtins | 是 | 全局 | 否 | |||
| innodb_idle_flush_pct | 是 | 是 | 是 | 全局 | 是 | |
| innodb_io_capacity | 是 | 是 | 是 | 全局 | 是 | |
| innodb_io_capacity_max | 是 | 是 | 是 | 全局 | 是 | |
| innodb_limit_optimistic_insert_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_lock_wait_timeout | 是 | 是 | 是 | 两者 | 是 | |
| innodb_log_buffer_size | 是 | 是 | 是 | 全局 | 变化 | |
| innodb_log_checkpoint_fuzzy_now | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_checkpoint_now | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_checksums | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_compressed_pages | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_file_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_log_files_in_group | 是 | 是 | 是 | 全局 | 否 | |
| innodb_log_group_home_dir | 是 | 是 | 是 | 全局 | 否 | |
| innodb_log_spin_cpu_abs_lwm | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_spin_cpu_pct_hwm | 是 | 是 | 是 | 全局 | 是 | |
| innodb_log_wait_for_flush_spin_hwm | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_log_waits | 是 | 全局 | 否 | |||
| innodb_log_write_ahead_size | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_log_write_requests | 是 | 全局 | 否 | |||
| innodb_log_writer_threads | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_log_writes | 是 | 全局 | 否 | |||
| innodb_lru_scan_depth | 是 | 是 | 是 | 全局 | 是 | |
| innodb_max_dirty_pages_pct | 是 | 是 | 是 | 全局 | 是 | |
| innodb_max_dirty_pages_pct_lwm | 是 | 是 | 是 | 全局 | 是 | |
| innodb_max_purge_lag | 是 | 是 | 是 | 全局 | 是 | |
| innodb_max_purge_lag_delay | 是 | 是 | 是 | 全局 | 是 | |
| innodb_max_undo_log_size | 是 | 是 | 是 | 全局 | 是 | |
| innodb_merge_threshold_set_all_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_monitor_disable | 是 | 是 | 是 | 全局 | 是 | |
| innodb_monitor_enable | 是 | 是 | 是 | 全局 | 是 | |
| innodb_monitor_reset | 是 | 是 | 是 | 全局 | 是 | |
| innodb_monitor_reset_all | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_num_open_files | 是 | 全局 | 否 | |||
| innodb_numa_interleave | 是 | 是 | 是 | 全局 | 否 | |
| innodb_old_blocks_pct | 是 | 是 | 是 | 全局 | 是 | |
| innodb_old_blocks_time | 是 | 是 | 是 | 全局 | 是 | |
| innodb_online_alter_log_max_size | 是 | 是 | 是 | 全局 | 是 | |
| innodb_open_files | 是 | 是 | 是 | 全局 | 不定 | |
| innodb_optimize_fulltext_only | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_os_log_fsyncs | 是 | 全局 | 否 | |||
| Innodb_os_log_pending_fsyncs | 是 | 全局 | 否 | |||
| Innodb_os_log_pending_writes | 是 | 全局 | 否 | |||
| Innodb_os_log_written | 是 | 全局 | 否 | |||
| innodb_page_cleaners | 是 | 是 | 是 | 全局 | 否 | |
| Innodb_page_size | 是 | 全局 | 否 | |||
| innodb_page_size | 是 | 是 | 是 | 全局 | 否 | |
| Innodb_pages_created | 是 | 全局 | 否 | |||
| Innodb_pages_read | 是 | 全局 | 否 | |||
| Innodb_pages_written | 是 | 全局 | 否 | |||
| innodb_parallel_read_threads | 是 | 是 | 是 | 会话 | 是 | |
| innodb_print_all_deadlocks | 是 | 是 | 是 | 全局 | 是 | |
| innodb_print_ddl_logs | 是 | 是 | 是 | 全局 | 是 | |
| innodb_purge_batch_size | 是 | 是 | 是 | 全局 | 是 | |
| innodb_purge_rseg_truncate_frequency | 是 | 是 | 是 | 全局 | 是 | |
| innodb_purge_threads | 是 | 是 | 是 | 全局 | 否 | |
| innodb_random_read_ahead | 是 | 是 | 是 | 全局 | 是 | |
| innodb_read_ahead_threshold | 是 | 是 | 是 | 全局 | 是 | |
| innodb_read_io_threads | 是 | 是 | 是 | 全局 | 否 | |
| innodb_read_only | 是 | 是 | 是 | 全局 | 否 | |
| innodb_redo_log_archive_dirs | 是 | 是 | 是 | 全局 | 是 | |
| innodb_redo_log_capacity | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_redo_log_capacity_resized | 是 | 全局 | 否 | |||
| Innodb_redo_log_checkpoint_lsn | 是 | 全局 | 否 | |||
| Innodb_redo_log_current_lsn | 是 | 全局 | 否 | |||
| Innodb_redo_log_enabled | 是 | 全局 | 否 | |||
| innodb_redo_log_encrypt | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_redo_log_flushed_to_disk_lsn | 是 | 全局 | 否 | |||
| Innodb_redo_log_logical_size | 是 | 全局 | 否 | |||
| Innodb_redo_log_physical_size | 是 | 全局 | 否 | |||
| Innodb_redo_log_read_only | 是 | 全局 | 否 | |||
| Innodb_redo_log_resize_status | 是 | 全局 | 否 | |||
| Innodb_redo_log_uuid | 是 | 全局 | 否 | |||
| innodb_replication_delay | 是 | 是 | 是 | 全局 | 是 | |
| innodb_rollback_on_timeout | 是 | 是 | 是 | 全局 | 否 | |
| innodb_rollback_segments | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_row_lock_current_waits | 是 | 全局 | 否 | |||
| Innodb_row_lock_time | 是 | 全局 | 否 | |||
| Innodb_row_lock_time_avg | 是 | 全局 | 否 | |||
| Innodb_row_lock_time_max | 是 | 全局 | 否 | |||
| Innodb_row_lock_waits | 是 | 全局 | 否 | |||
| Innodb_rows_deleted | 是 | 全局 | 否 | |||
| Innodb_rows_inserted | 是 | 全局 | 否 | |||
| Innodb_rows_read | 是 | 全局 | 否 | |||
| Innodb_rows_updated | 是 | 全局 | 否 | |||
| innodb_saved_page_number_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_segment_reserve_factor | 是 | 是 | 是 | 全局 | 是 | |
| innodb_sort_buffer_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_spin_wait_delay | 是 | 是 | 是 | 全局 | 是 | |
| innodb_spin_wait_pause_multiplier | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_auto_recalc | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_include_delete_marked | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_method | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_on_metadata | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_persistent | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_persistent_sample_pages | 是 | 是 | 是 | 全局 | 是 | |
| innodb_stats_transient_sample_pages | 是 | 是 | 是 | 全局 | 是 | |
| innodb-status-file | 是 | 是 | ||||
| innodb_status_output | 是 | 是 | 是 | 全局 | 是 | |
| innodb_status_output_locks | 是 | 是 | 是 | 全局 | 是 | |
| innodb_strict_mode | 是 | 是 | 是 | 两者 | 是 | |
| innodb_sync_array_size | 是 | 是 | 是 | 全局 | 否 | |
| innodb_sync_debug | 是 | 是 | 是 | 全局 | 否 | |
| innodb_sync_spin_loops | 是 | 是 | 是 | 全局 | 是 | |
| Innodb_system_rows_deleted | 是 | 全局 | 否 | |||
| Innodb_system_rows_inserted | 是 | 全局 | 否 | |||
| Innodb_system_rows_read | 是 | 全局 | 否 | |||
| innodb_table_locks | 是 | 是 | 是 | 两者 | 是 | |
| innodb_temp_data_file_path | 是 | 是 | 是 | 全局 | 否 | |
| innodb_temp_tablespaces_dir | 是 | 是 | 是 | 全局 | 否 | |
| innodb_thread_concurrency | 是 | 是 | 是 | 全局 | 是 | |
| innodb_thread_sleep_delay | 是 | 是 | 是 | 全局 | 是 | |
| innodb_tmpdir | 是 | 是 | 是 | 两者 | 是 | |
| Innodb_truncated_status_writes | 是 | 全局 | 否 | |||
| innodb_trx_purge_view_update_only_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_trx_rseg_n_slots_debug | 是 | 是 | 是 | 全局 | 是 | |
| innodb_undo_directory | 是 | 是 | 是 | 全局 | 否 | |
| innodb_undo_log_encrypt | 是 | 是 | 是 | 全局 | 是 | |
| innodb_undo_log_truncate | 是 | 是 | 是 | 全局 | 是 | |
| innodb_undo_tablespaces | 是 | 是 | 是 | 全局 | 不定 | |
| Innodb_undo_tablespaces_active | 是 | 全局 | 否 | |||
| Innodb_undo_tablespaces_explicit | 是 | 全局 | 否 | |||
| Innodb_undo_tablespaces_implicit | 是 | 全局 | 否 | |||
| Innodb_undo_tablespaces_total | 是 | 全局 | 否 | |||
| innodb_use_fdatasync | 是 | 是 | 是 | 全局 | 是 | |
| innodb_use_native_aio | 是 | 是 | 是 | 全局 | 否 | |
| innodb_validate_tablespace_paths | 是 | 是 | 是 | 全局 | 否 | |
| innodb_version | 是 | 全局 | 否 | |||
| innodb_write_io_threads | 是 | 是 | 是 | 全局 | 否 | |
| unique_checks | 是 | 两者 | 是 | |||
| 名称 | 命令行 | 选项文件 | 系统变量 | 状态变量 | 变量范围 | 动态 |
InnoDB 命令选项
-
命令行格式 --innodb[=value]弃用 是 类型 枚举 默认值 ON有效值 OFF``ON``FORCE控制
InnoDB存储引擎的加载,如果服务器编译时支持InnoDB。此选项具有三态格式,可能的值为OFF、ON或FORCE。请参阅 第 7.6.1 节,“安装和卸载插件”。要禁用
InnoDB,请使用--innodb=OFF或--skip-innodb。在这种情况下,由于默认存储引擎是InnoDB,除非还使用--default-storage-engine和--default-tmp-storage-engine将默认值设置为其他引擎,否则服务器不会启动,用于永久表和TEMPORARY表。InnoDB存储引擎不再可以被禁用,--innodb=OFF和--skip-innodb选项已被弃用且无效。使用它们会产生警告。预计这些选项将在未来的 MySQL 版本中被移除。 -
--innodb-status-file命令行格式 --innodb-status-file[={OFF|ON}]类型 布尔 默认值 OFF--innodb-status-file启动选项控制InnoDB是否在数据目录中创建一个名为innodb_status.*pid*的文件,并每隔约 15 秒将SHOW ENGINE INNODB STATUS输出到其中。默认情况下不会创建
innodb_status.*pid*文件。要创建该文件,请使用--innodb-status-file选项启动 mysqld。InnoDB在服务器正常关闭时会删除该文件。如果发生异常关闭,则可能需要手动删除状态文件。--innodb-status-file选项仅供临时使用,因为SHOW ENGINE INNODB STATUS输出生成可能会影响性能,并且随着时间的推移,innodb_status.*pid*`文件可能会变得非常大。有关相关信息,请参见第 17.17.2 节,“启用 InnoDB 监视器”。
-
--skip-innodb禁用
InnoDB存储引擎。请参阅--innodb的描述。
InnoDB 系统变量
-
daemon_memcached_enable_binlog命令行格式 --daemon-memcached-enable-binlog[={OFF|ON}]已弃用 8.0.22 系统变量 daemon_memcached_enable_binlog作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF在源服务器上启用此选项以使用 MySQL 的
InnoDBmemcached插件(daemon_memcached)与 MySQL 的二进制日志。此选项只能在服务器启动时设置。您还必须使用--log-bin选项在源服务器上启用 MySQL 二进制日志。有关更多信息,请参见第 17.20.7 节,“InnoDB memcached 插件和复制”。
-
daemon_memcached_engine_lib_name命令行格式 --daemon-memcached-engine-lib-name=file_name已弃用 8.0.22 系统变量 daemon_memcached_engine_lib_name作用范围 全局 动态 否 SET_VAR提示适用否 类型 文件名 默认值 innodb_engine.so指定实现
InnoDBmemcached插件的共享库。有关更多信息,请参见第 17.20.3 节,“设置 InnoDB memcached 插件”。
-
daemon_memcached_engine_lib_path命令行格式 --daemon-memcached-engine-lib-path=dir_name已弃用 8.0.22 系统变量 daemon_memcached_engine_lib_path作用范围 全局 动态 否 SET_VAR提示适用否 类型 目录名 默认值 NULL包含实现
InnoDBmemcached插件的共享库的目录路径。默认值为 NULL,表示 MySQL 插件目录。除非指定位于 MySQL 插件目录之外的不同存储引擎的memcached插件,否则您不应该需要修改此参数。更多信息,请参阅第 17.20.3 节,“设置 InnoDB memcached 插件”。
-
daemon_memcached_option命令行格式 --daemon-memcached-option=options已弃用 8.0.22 系统变量 daemon_memcached_option范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 默认值 用于在启动时将空格分隔的memcached选项传递给底层memcached内存对象缓存守护程序。例如,您可以更改memcached侦听的端口,减少最大同时连接数,更改键值对的最大内存大小,或者为错误日志启用调试消息。
有关使用详细信息,请参阅第 17.20.3 节,“设置 InnoDB memcached 插件”。有关memcached选项的信息,请参考memcached手册页。
-
daemon_memcached_r_batch_size命令行格式 --daemon-memcached-r-batch-size=#已弃用 8.0.22 系统变量 daemon_memcached_r_batch_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 1最小值 1最大值 1073741824指定在启动新事务之前执行多少个memcached读取操作(
get操作)。与daemon_memcached_w_batch_size相对应。默认值为 1,因此通过 SQL 语句对表进行的任何更改都会立即对memcached操作可见。您可以增加它以减少在仅通过memcached接口访问底层表的系统上频繁提交的开销。如果将值设置得太大,则撤消或重做数据量可能会对存储造成一些开销,就像任何长时间运行的事务一样。
更多信息,请参阅 第 17.20.3 节,“设置 InnoDB memcached 插件”。
-
daemon_memcached_w_batch_size命令行格式 --daemon-memcached-w-batch-size=#已弃用 8.0.22 系统变量 daemon_memcached_w_batch_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 1最小值 1最大值 1048576指定在启动新事务之前执行多少个memcached写操作,例如
add、set和incr。与daemon_memcached_r_batch_size相对应。默认情况下,此值设置为 1,假设存储的数据在发生故障时很重要并且应立即提交。当存储非关键数据时,您可以增加此值以减少频繁提交的开销;但是如果发生意外退出,则最后*
N*-1 个未提交的写操作可能会丢失。更多信息,请参阅 第 17.20.3 节,“设置 InnoDB memcached 插件”。
-
innodb_adaptive_flushing命令行格式 --innodb-adaptive-flushing[={OFF|ON}]系统变量 innodb_adaptive_flushing范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON指定是否根据工作负载动态调整
InnoDB缓冲池中脏页的刷新速率。动态调整刷新速率旨在避免 I/O 活动的突发发生。此设置默认启用。有关更多信息,请参阅 第 17.8.3.5 节,“配置缓冲池刷新”。有关一般 I/O 调优建议,请参阅 第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。 -
innodb_adaptive_flushing_lwm命令行格式 --innodb-adaptive-flushing-lwm=#系统变量 innodb_adaptive_flushing_lwm范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 10最小值 0最大值 70定义表示重做日志容量百分比的低水位标记,在此百分比下启用自适应刷新。有关更多信息,请参阅第 17.8.3.5 节,“配置缓冲池刷新”。
-
innodb_adaptive_hash_index命令行格式 --innodb-adaptive-hash-index[={OFF|ON}]系统变量 innodb_adaptive_hash_index范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ONInnoDB自适应哈希索引是否启用或禁用。根据您的工作负载,动态启用或禁用自适应哈希索引可能是有益的,以提高查询性能。由于自适应哈希索引可能并非适用于所有工作负载,因此请使用真实工作负载分别启用和禁用它进行基准测试。有关详细信息,请参阅第 17.5.3 节,“自适应哈希索引”。此变量默认启用。您可以使用
SET GLOBAL语句修改此参数,无需重新启动服务器。在运行时更改设置需要具有足够权限设置全局系统变量。请参阅第 7.1.9.1 节,“系统变量权限”。您也可以在服务器启动时使用--skip-innodb-adaptive-hash-index来禁用它。禁用自适应哈希索引会立即清空哈希表。在清空哈希表的同时,正常操作可以继续进行,并且执行使用哈希表的查询将直接访问索引 B 树。重新启用自适应哈希索引时,在正常操作期间哈希表将再次填充。
-
innodb_adaptive_hash_index_parts命令行格式 --innodb-adaptive-hash-index-parts=#系统变量 innodb_adaptive_hash_index_parts范围 全局 动态 否 SET_VAR提示适用否 类型 数值 默认值 8最小值 1最大值 512对自适应哈希索引搜索系统进行分区。每个索引绑定到特定分区,每个分区由单独的闩保护。
自适应哈希索引搜索系统默认分为 8 部分。最大设置为 512。
有关相关信息,请参见第 17.5.3 节,“自适应哈希索引”。
-
innodb_adaptive_max_sleep_delay命令行格式 --innodb-adaptive-max-sleep-delay=#系统变量 innodb_adaptive_max_sleep_delay范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 150000最小值 0最大值 1000000单位 微秒 允许
InnoDB根据当前工作负载自动调整innodb_thread_sleep_delay的值。任何非零值都会启用innodb_thread_sleep_delay值的自动动态调整,最高值不超过innodb_adaptive_max_sleep_delay选项中指定的最大值。该值表示微秒数。此选项在繁忙系统中非常有用,具有超过 16 个InnoDB线程。(实际上,对于具有数百或数千个同时连接的 MySQL 系统来说,这是最有价值的。)有关更多信息,请参见第 17.8.4 节,“配置 InnoDB 的线程并发性”。
-
innodb_api_bk_commit_interval命令行格式 --innodb-api-bk-commit-interval=#已弃用 8.0.22 系统变量 innodb_api_bk_commit_interval范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 5最小值 1最大值 1073741824单位 秒 自动提交使用
InnoDBmemcached接口的空闲连接的频率,单位为秒。更多信息,请参见第 17.20.6.4 节,“控制 InnoDB memcached 插件的事务行为”。 -
innodb_api_disable_rowlock命令行格式 --innodb-api-disable-rowlock[={OFF|ON}]已弃用 8.0.22 系统变量 innodb_api_disable_rowlock作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF使用此选项禁用
InnoDBmemcached 执行 DML 操作时的行锁。默认情况下,innodb_api_disable_rowlock处于禁用状态,这意味着 memcached 请求行锁用于get和set操作。当启用innodb_api_disable_rowlock时,memcached 请求表锁而不是行锁。innodb_api_disable_rowlock不是动态的。必须在mysqld命令行上指定,或者输入到 MySQL 配置文件中。配置在插件安装时生效,插件安装发生在 MySQL 服务器启动时。更多信息,请参见 Section 17.20.6.4, “控制 InnoDB memcached 插件的事务行为”。
-
innodb_api_enable_binlog命令行格式 --innodb-api-enable-binlog[={OFF|ON}]已弃用 8.0.22 系统变量 innodb_api_enable_binlog作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF允许您使用 MySQL 二进制日志 的
InnoDBmemcached 插件。更多信息,请参见 启用 InnoDB memcached 二进制日志。 -
innodb_api_enable_mdl命令行格式 --innodb-api-enable-mdl[={OFF|ON}]���弃用 8.0.22 系统变量 innodb_api_enable_mdl作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF锁定
InnoDBmemcached 插件使用的表,以防止通过 SQL 接口的 DDL 删除或更改。更多信息,请参见 Section 17.20.6.4, “控制 InnoDB memcached 插件的事务行为”。 -
innodb_api_trx_level命令行格式 --innodb-api-trx-level=#已弃用 8.0.22 系统变量 innodb_api_trx_level作用域 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 3控制由memcached接口处理的查询的事务隔离级别。对应于熟悉名称的常量为:
-
0 =
READ UNCOMMITTED -
1 =
READ COMMITTED -
2 =
REPEATABLE READ -
3 =
SERIALIZABLE
有关更多信息,请参阅第 17.20.6.4 节,“控制 InnoDB memcached 插件的事务行为”。
-
-
innodb_autoextend_increment命令行格式 --innodb-autoextend-increment=#系统变量 innodb_autoextend_increment作用域 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 64最小值 1最大值 1000单位 兆字节 当
InnoDB系统表空间文件满时,自动扩展大小的增量大小(以兆字节为单位)。默认值为 64。有关相关信息,请参阅系统表空间数据文件配置和调整系统表空间大小。innodb_autoextend_increment设置不影响 file-per-table 表空间文件或 general tablespace 文件。这些文件会自动扩展,不受innodb_autoextend_increment设置的影响。初始扩展量较小,之后每次扩展增加 4MB。 -
innodb_autoinc_lock_mode命令行格式 --innodb-autoinc-lock-mode=#系统变量 innodb_autoinc_lock_mode作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 2有效值 0``1``2用于生成自增值的锁定模式。允许的值为 0、1 或 2,分别表示传统、连续或交错。
截至 MySQL 8.0,默认设置为 2(交错),之前为 1(连续)。从语句为基础的复制变为行为基础的复制作为默认复制类型的变化反映在默认设置为交错锁定模式上,这发生在 MySQL 5.7 中。语句为基础的复制需要连续的自增锁定模式,以确保自增值按照给定 SQL 语句序列的可预测和可重复的顺序分配,而行为基础的复制不受 SQL 语句执行顺序的影响。
有关每种锁定模式的特性,请参阅 InnoDB AUTO_INCREMENT Lock Modes。
-
innodb_background_drop_list_empty命令行格式 --innodb-background-drop-list-empty[={OFF|ON}]系统变量 innodb_background_drop_list_empty作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用
innodb_background_drop_list_empty调试选项有助于避免测试用例失败,延迟表的创建直到后台删除列表为空。例如,如果测试用例 A 将表t1放在后台删除列表中,测试用例 B 将等待直到后台删除列表为空才创建表t1。 -
innodb_buffer_pool_chunk_size命令行格式 --innodb-buffer-pool-chunk-size=#系统变量 innodb_buffer_pool_chunk_size作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 134217728最小值 1048576最大值 innodb_buffer_pool_size / innodb_buffer_pool_instances单位 字节 innodb_buffer_pool_chunk_size定义了InnoDB缓冲池调整大小操作的块大小。为避免在调整大小操作期间复制所有缓冲池页面,操作是以“块”进行的。默认情况下,
innodb_buffer_pool_chunk_size为 128MB(134217728 字节)。块中包含的页面数量取决于innodb_page_size的值。innodb_buffer_pool_chunk_size可以以 1MB(1048576 字节)的单位增加或减少。更改
innodb_buffer_pool_chunk_size值时应满足以下条件:-
如果在初始化缓冲池时,
innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances大于当前缓冲池大小,则innodb_buffer_pool_chunk_size会被截断为innodb_buffer_pool_size/innodb_buffer_pool_instances。 -
缓冲池大小必须始终等于或是
innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数。如果更改innodb_buffer_pool_chunk_size,innodb_buffer_pool_size会自动舍入为等于或是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的值。此调整发生在初始化缓冲池时。
重要
更改
innodb_buffer_pool_chunk_size时需谨慎,因为更改此值可能会自动增加缓冲池的大小。在更改innodb_buffer_pool_chunk_size之前,计算其对innodb_buffer_pool_size的影响,以确保生成的缓冲池大小是可接受的。为避免潜在的性能问题,块的数量(
innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)不应超过 1000。innodb_buffer_pool_size变量是动态的,允许在服务器在线时调整缓冲池的大小。然而,缓冲池的大小必须等于或是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数,改变这两个变量设置中的任何一个都需要重新启动服务器。更多信息请参见 第 17.8.3.1 节,“配置 InnoDB 缓冲池大小”。
-
-
innodb_buffer_pool_debug命令行格式 --innodb-buffer-pool-debug[={OFF|ON}]系统变量 innodb_buffer_pool_debug范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用此选项允许在缓冲池小于 1GB 时存在多个缓冲池实例,忽略对
innodb_buffer_pool_instances强加的 1GB 最小缓冲池大小约束。只有在使用WITH_DEBUGCMake 选项编译时才可用innodb_buffer_pool_debug选项。 -
innodb_buffer_pool_dump_at_shutdown命令行格式 --innodb-buffer-pool-dump-at-shutdown[={OFF|ON}]系统变量 innodb_buffer_pool_dump_at_shutdown范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON指定在 MySQL 服务器关闭时记录缓存在
InnoDB缓冲池 中的页面,以缩短下次重启时的 预热 过程。通常与innodb_buffer_pool_load_at_startup结合使用。innodb_buffer_pool_dump_pct选项定义要转储的最近使用的缓冲池页面的百分比。innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup默认启用。更多信息,请参阅 Section 17.8.3.6,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_dump_now命令行格式 --innodb-buffer-pool-dump-now[={OFF|ON}]系统变量 innodb_buffer_pool_dump_now范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF立即记录在
InnoDB缓冲池中缓存的页面。通常与innodb_buffer_pool_load_now结合使用。启用
innodb_buffer_pool_dump_now会触发记录操作,但不会改变变量设置,该设置始终保持OFF或0。要在触发转储后查看缓冲池转储状态,请查询Innodb_buffer_pool_dump_status变量。启用
innodb_buffer_pool_dump_now会触发转储操作,但不会改变变量设置,该设置始终保持OFF或0。要在触发转储后查看缓冲池转储状态,请查询Innodb_buffer_pool_dump_status变量。更多信息,请参阅 Section 17.8.3.6,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_dump_pct命令行格式 --innodb-buffer-pool-dump-pct=#系统变量 innodb_buffer_pool_dump_pct范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 25最小值 1��大值 100指定每个缓冲池中最近使用的页面的百分比以读取并转储。范围为 1 到 100。默认值为 25。例如,如果有 4 个每个有 100 页的缓冲池,并且
innodb_buffer_pool_dump_pct设置为 25,则从每个缓冲池中转储最近使用的 25 页。 -
innodb_buffer_pool_filename命令行格式 --innodb-buffer-pool-filename=file_name系统变量 innodb_buffer_pool_filename范围 全局 动态 是 SET_VAR提示适用否 类型 文件名 默认值 ib_buffer_pool指定保存由
innodb_buffer_pool_dump_at_shutdown或innodb_buffer_pool_dump_now生成的表空间 ID 和页面 ID 列表的文件的名称。表空间 ID 和页面 ID 以以下格式保存:space, page_id。默认情况下,文件名为ib_buffer_pool,位于InnoDB数据目录中。必须相对于数据目录指定非默认位置。可以在运行时使用
SET语句指定文件名:SET GLOBAL innodb_buffer_pool_filename=*'file_name'*;您还可以在启动时指定文件名,在启动字符串或 MySQL 配置文件中。在启动时指定文件名时,文件必须存在,否则
InnoDB会返回启动错误,指示没有这样的文件或目录。有关更多信息,请参见第 17.8.3.6 节,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_in_core_file命令行格式 --innodb-buffer-pool-in-core-file[={OFF|ON}]引入版本 8.0.14 系统变量 innodb_buffer_pool_in_core_file范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON禁用
innodb_buffer_pool_in_core_file变量可通过排除InnoDB缓冲池页面来减小核心文件的大小。要使用此变量,必须启用core_file变量,并且操作系统必须支持MADV_DONTDUMP非 POSIX 扩展到madvise(),该扩展在 Linux 3.4 及更高版本中受支持。有关更多信息,请参见第 17.8.3.7 节,“从核心文件中排除缓冲池页面”。 -
innodb_buffer_pool_instances命令行格式 --innodb-buffer-pool-instances=#系统变量 innodb_buffer_pool_instances范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值(Windows,32 位平台) (autosized)默认值(其他) 8(如果 innodb_buffer_pool_size < 1GB,则为 1)最小值 1最大值 64InnoDB缓冲池 分成的区域数量。对于具有多个千兆字节范围的缓冲池的系统,将缓冲池分成单独的实例可以通过减少不同线程读取和写入缓存页面时的争用来提高并发性。存储在缓冲池中或从缓冲池中读取的每个页面都会随机分配给缓冲池实例之一,使用哈希函数。每个缓冲池管理自己的空闲列表、刷新列表、LRU 以及与缓冲池相关的所有其他数据结构,并由自己的缓冲池互斥锁保护。当将
innodb_buffer_pool_size设置为 1GB 或更高时,此选项才会生效。总缓冲池大小将分配给所有缓冲池。为了达到最佳效率,请指定innodb_buffer_pool_instances和innodb_buffer_pool_size的组合,以便每个缓冲池实例至少为 1GB。在 32 位 Windows 系统上的默认值取决于
innodb_buffer_pool_size的值,如下所述:-
如果
innodb_buffer_pool_size大于 1.3GB,则innodb_buffer_pool_instances的默认值为innodb_buffer_pool_size/128MB,每个块的内存分配请求。选择 1.3GB 作为边界是因为在此处,32 位 Windows 无法为单个缓冲池分配所需的连续地址空间存在显著风险。 -
否则,默认值为 1。
在所有其他平台上,当
innodb_buffer_pool_size大于或等于 1GB 时,默认值为 8。否则,默认值为 1。有关相关信息,请参阅第 17.8.3.1 节,“配置 InnoDB 缓冲池大小”。
-
-
innodb_buffer_pool_load_abort命令行格式 --innodb-buffer-pool-load-abort[={OFF|ON}]系统变量 innodb_buffer_pool_load_abort范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF中断由
innodb_buffer_pool_load_at_startup或innodb_buffer_pool_load_now触发的InnoDB缓冲池内容恢复过程。启用
innodb_buffer_pool_load_abort会触发中止操作,但不会改变变量设置,其始终保持为OFF或0。要在触发中止操作后查看缓冲池加载状态,请查询Innodb_buffer_pool_load_status变量。有关更多信息,请参见第 17.8.3.6 节,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_load_at_startup命令行格式 --innodb-buffer-pool-load-at-startup[={OFF|ON}]系统变量 innodb_buffer_pool_load_at_startup范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 ON指定在 MySQL 服务器启动时,
InnoDB缓冲池会自动通过加载先前保存的页面来预热。通常与innodb_buffer_pool_dump_at_shutdown一起使用。innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup默认启用。有关更多信息,请参见第 17.8.3.6 节,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_load_now命令行格式 --innodb-buffer-pool-load-now[={OFF|ON}]系统变量 innodb_buffer_pool_load_now范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF通过加载数据页立即 预热
InnoDB缓冲池,无需等待服务器重新启动。在进行基准测试期间,或在运行报告或维护查询后准备 MySQL 服务器恢复其正常工作负载时,这可能很有用。启用
innodb_buffer_pool_load_now触发加载操作,但不会改变变量设置,变量始终保持OFF或0。在触发加载后查看缓冲池加载进度,请查询Innodb_buffer_pool_load_status变量。更多信息,请参阅 Section 17.8.3.6, “保存和恢复缓冲池状态”。
-
innodb_buffer_pool_size命令行格式 --innodb-buffer-pool-size=#系统变量 innodb_buffer_pool_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 134217728最小值 5242880最大值(64 位平台) 2**64-1最大值(32 位平台) 2**32-1单位 字�� 缓冲池的大小(以字节为单位),即
InnoDB缓存表和索引数据的内存区域。默认值为 134217728 字节(128MB)。最大值取决于 CPU 架构;32 位系统上的最大值为 4294967295(2³²-1),64 位系统上的最大值为 18446744073709551615(2⁶⁴-1)。在 32 位系统上,CPU 架构和操作系统可能会强加一个比规定最大值更低的实际最大值。当缓冲池的大小大于 1GB 时,将innodb_buffer_pool_instances设置为大于 1 的值可以提高繁忙服务器的可伸缩性。更大的缓冲池需要更少的磁盘 I/O 来多次访问相同的表数据。在专用数据库服务器上,您可能会将缓冲池大小设置为机器物理内存大小的 80%。在配置缓冲池大小时,请注意以下潜在问题,并准备根据需要缩小缓冲池的大小。
-
物理内存的竞争可能导致操作系统进行分页。
-
InnoDB为缓冲区和控制结构保留额外的内存,因此总分配空间大约比指定的缓冲池大小大约多 10%。 -
缓冲池的地址空间必须是连续的,在 Windows 系统中,DLL 可能会加载到特定地址,这可能会成为一个问题。
-
初始化缓冲池的时间大致与其大小成正比。在具有大型缓冲池的实例上,初始化时间可能很显著。为了缩短初始化时间,您可以在服务器关闭时保存缓冲池状态,并在服务器启动时恢复它。参见第 17.8.3.6 节,“保存和恢复缓冲池状态”。
当您增加或减少缓冲池大小时,操作是以块为单位执行的。块大小由
innodb_buffer_pool_chunk_size变量定义,默认值为 128 MB。缓冲池大小必须始终等于或是
innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数。如果您将缓冲池大小更改为不等于或不是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数的值,则缓冲池大小会自动调整为等于或是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数的值。innodb_buffer_pool_size可以动态设置,这允许您在不重启服务器的情况下调整缓冲池大小。Innodb_buffer_pool_resize_status状态变量报告在线缓冲池调整操作的状态。有关更多信息,请参见第 17.8.3.1 节,“配置 InnoDB 缓冲池大小”。如果启用了
innodb_dedicated_server,并且未明确定义innodb_buffer_pool_size的值,则该值会自动配置。有关更多信息,请参见第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”�� -
-
innodb_change_buffer_max_size命令行格式 --innodb-change-buffer-max-size=#系统变量 innodb_change_buffer_max_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 25最小值 0最大值 50InnoDB更改缓冲区的最大大小,作为缓冲池总大小的百分比。您可能会增加此值,用于具有大量插入、更新和删除活动的 MySQL 服务器,或者减少用于报告中使用的数据保持不变的 MySQL 服务器。有关更多信息,请参见第 17.5.2 节,“更改缓冲区”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。 -
innodb_change_buffering命令行格式 --innodb-change-buffering=value系统变量 innodb_change_buffering范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 all有效值 none``inserts``deletes``changes``purges``allInnoDB是否执行更改缓冲,这是一种优化,延迟写入操作到次要索引,以便 I/O 操作可以按顺序执行。允许的值在下表中描述。值也可以用数字指定。表 17.25 innodb_change_buffering 允许的值
值 数值 描述 none0不缓冲任何操作。 inserts1缓冲插入操作。 deletes2缓冲删除标记操作;严格来说,标记索引记录以便稍后在清除操作期间删除。 changes3缓冲插入和删除标记操作。 purges4缓冲后台中发生的物理删除操作。 all5默认值。缓冲插入、删除标记操作和清除。 有关更多信息,请参见第 17.5.2 节,“更改缓冲区”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_change_buffering_debug命令行格式 --innodb-change-buffering-debug=#系统变量 innodb_change_buffering_debug范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 2设置
InnoDB更改缓冲区的调试标志。值为 1 会强制所有更改进入更改缓冲区。值为 2 会在合并时导致意外退出。默认值为 0 表示更改缓冲区调试标志未设置。此选项仅在使用WITH_DEBUGCMake 选项编译调试支持时才可用。 -
innodb_checkpoint_disabled命令行格式 --innodb-checkpoint-disabled[={OFF|ON}]系统变量 innodb_checkpoint_disabled范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF这是一个仅供专家调试使用的调试选项。它禁用了检查点,以便有意的服务器退出始终会启动
InnoDB恢复。通常在运行写入重做日志条目的 DML 操作之前,应该仅启用它一小段时间。此选项仅在使用WITH_DEBUGCMake 选项编译调试支持时才可用。 -
innodb_checksum_algorithm命令行格式 --innodb-checksum-algorithm=value系统变量 innodb_checksum_algorithm范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 crc32有效值 crc32``strict_crc32``innodb``strict_innodb``none``strict_none指定如何生成和验证
InnoDB表空间中磁盘块中存储的校验和。innodb_checksum_algorithm的默认值为crc32。MySQL 企业备份版本直到 3.8.0 不支持备份使用 CRC32 校验和的表空间。MySQL 企业备份在 3.8.1 中添加了 CRC32 校验和支持,但有一些限制。有关更多信息,请参考 MySQL 企业备份 3.8.1 变更历史。
值
innodb向后兼容早期版本的 MySQL。值crc32使用一种更快的算法来计算每个修改块的校验和,并检查每个磁盘读取的校验和。它每次扫描 64 位块,比每次扫描 8 位块的innodb校验算法更快。值none在校验字段中写入一个常数值,而不是基于块数据计算值。表空间中的块可以使用旧、新和无校验和值的混合,随着数据逐渐修改而逐步更新;一旦表空间中的块被修改为使用crc32算法,相关表将无法被早期版本的 MySQL 读取。校验算法的严格形式在表空间中遇到有效但不匹配的校验和值时会报错。建议您只在新实例中使用严格设置,首次设置表空间。严格设置略快,因为在磁盘读取期间不需要计算所有校验和值。
以下表格显示了
none、innodb和crc32选项值及其严格对应项之间的区别。none、innodb和crc32将指定类型的校验和值写入每个数据块,但在验证读取操作期间的块时,也接受其他校验和值以确保兼容性。严格设置还接受有效的校验和值,但在遇到有效但不匹配的校验和值时会打印错误消息。如果实例中的所有InnoDB数据文件都是在相同的innodb_checksum_algorithm值下创建的,则使用严格形式可以使验证更快。表 17.26 允许的 innodb_checksum_algorithm 值
值 生成的校验和(写入时) 允许的校验和(读取时) none 一个常数值。 由 none、innodb或crc32生成的任何校验和。innodb 使用 InnoDB原始算法在软件中计算的校验和。由 none、innodb或crc32生成的任何校验和。crc32 使用 crc32算法计算的校验和,可能使用硬件辅助完成。由 none、innodb或crc32生成的任何校验和。strict_none 一个常数值 由 none、innodb或crc32生成的任何校验和。如果遇到有效但不匹配的校验和,InnoDB会打印错误消息。strict_innodb 使用 InnoDB原始算法在软件中计算的校验和。由 none、innodb或crc32生成的任何校验和。如果遇到有效但不匹配的校验和,InnoDB会打印错误消息。strict_crc32 使用 crc32算法计算的校验和,可能使用硬件辅助完成。由 none、innodb或crc32生成的任何校验和。如果遇到有效但不匹配的校验和,InnoDB会打印错误消息。 -
innodb_cmp_per_index_enabled命令行格式 --innodb-cmp-per-index-enabled[={OFF|ON}]系统变量 innodb_cmp_per_index_enabled作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用信息模式
INNODB_CMP_PER_INDEX表中每个索引的压缩相关统计信息。由于这些统计信息可能很昂贵,只在与InnoDB压缩表相关的性能调优期间的开发、测试或副本实例上启用此选项。更多信息,请参阅第 28.4.8 节,“INFORMATION_SCHEMA INNODB_CMP_PER_INDEX 和 INNODB_CMP_PER_INDEX_RESET 表”,以及第 17.9.1.4 节,“运行时监视 InnoDB 表压缩”。
-
innodb_commit_concurrency命令行格式 --innodb-commit-concurrency=#系统变量 innodb_commit_concurrency作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 1000可以同时提交的线程数量。值为 0(默认值)允许任意数量的事务同时提交。
innodb_commit_concurrency的值不能在运行时从零更改为非零或反之。可以从一个非零值更改为另一个非零值。 -
innodb_compress_debug命令行格式 --innodb-compress-debug=value系统变量 innodb_compress_debug作用范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 none有效值 none``zlib``lz4``lz4hc使用指定的压缩算法压缩所有表,而无需为每个表定义
COMPRESSION属性。此选项仅在使用WITH_DEBUGCMake 选项编译调试支持时才可用。有关更多信息,请参阅第 17.9.2 节,“InnoDB 页面压缩”。
-
innodb_compression_failure_threshold_pct命令行格式 --innodb-compression-failure-threshold-pct=#系统变量 innodb_compression_failure_threshold_pct范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 5最小值 0最大值 100定义表的压缩失败率阈值,以百分比表示,在此阈值之上,MySQL 开始在压缩页面内添加填充,以避免昂贵的压缩失败。当超过此阈值时,MySQL 开始在每个新的压缩页面内留下额外的空闲空间,动态调整空闲空间的量,直到达到由
innodb_compression_pad_pct_max指定的页面大小百分比。值为零会禁用监视压缩效率并动态调整填充量的机制。有关更多信息,请参阅第 17.9.1.6 节,“OLTP 工作负载的压缩”。
-
innodb_compression_level命令行格式 --innodb-compression-level=#系统变量 innodb_compression_level范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 6最小值 0最大值 9指定用于
InnoDB压缩表和索引的 zlib 压缩级别。较高的值可以让您将更多数据放入存储设备,但会增加压缩时的 CPU 开销。较低的值可以减少 CPU 开销,当存储空间不是关键问题,或者您预计数据不太容易压缩时使用。更多信息,请参阅第 17.9.1.6 节,“OLTP 工作负载的压缩”。
-
innodb_compression_pad_pct_max命令行格式 --innodb-compression-pad-pct-max=#系统变量 innodb_compression_pad_pct_max作用域 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 50最小值 0最大值 75指定每个压缩页内可保留为自由空间的最大百分比,以便在更新压缩表或索引时重新组织数据和修改日志,并在数据可能被重新压缩时为页内留出空间。仅在
innodb_compression_failure_threshold_pct设置为非零值,并且压缩失败的速率超过截止点时才适用。更多信息,请参阅第 17.9.1.6 节,“OLTP 工作负载的压缩”。
-
innodb_concurrency_tickets命令行格式 --innodb-concurrency-tickets=#系统变量 innodb_concurrency_tickets作用域 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 5000最小值 1最大值 4294967295确定可以同时进入
InnoDB的线程数量。当尝试进入InnoDB的线程数已达到并发限制时,线程将被放置在队列中。当线程被允许进入InnoDB时,它将获得与innodb_concurrency_tickets值相等的“票”,并且线程可以自由进入和离开InnoDB直到使用完票为止。在那之后,线程再次成为并发检查的对象(可能排队),下次尝试进入InnoDB时。默认值为 5000。具有较小的
innodb_concurrency_tickets值时,只需要处理少量行的小事务与处理许多行的大事务公平竞争。较小的innodb_concurrency_tickets值的缺点是,大型事务必须多次遍历队列才能完成,这会延长完成任务所需的时间。具有较大的
innodb_concurrency_tickets值,大型事务等待队列末尾位置的时间较短(由innodb_thread_concurrency控制),更多时间用于检索行。大型事务还需要较少的队列遍历次数才能完成任务。较大的innodb_concurrency_tickets值的缺点是,同时运行太多大型事务可能会通过使它们等待更长时间来执行,使较小事务饥饿。具有非零的
innodb_thread_concurrency值时,您可能需要调整innodb_concurrency_tickets值,以找到较大和较小事务之间的最佳平衡。SHOW ENGINE INNODB STATUS报告显示了当前通过队列执行事务时剩余的票数。此数据也可以从信息模式INNODB_TRX表的TRX_CONCURRENCY_TICKETS列中获取。有关更多信息,请参见第 17.8.4 节,“配置 InnoDB 的线程并发性”。
-
innodb_data_file_path命令行格式 --innodb-data-file-path=file_name系统变量 innodb_data_file_path范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 默认值 ibdata1:12M:autoextend定义
InnoDB系统表空间数据文件的名称、大小和属性。如果未为innodb_data_file_path指定值,则默认行为是创建一个稍大于 12MB 的单个自动扩展数据文件,命名为ibdata1。数据文件规范的完整语法包括文件名、文件大小、
autoextend属性和max属性:*file_name*:*file_size*[:autoextend[:max:*max_file_size*]]文件大小通过在大小值后附加
K、M或G来指定为千字节、兆字节或千兆字节。如果以千字节指定数据文件大小,请以 1024 的倍数进行。否则,KB 值将四舍五入到最近的兆字节(MB)边界。文件大小之和必须至少略大于 12MB。有关其他配置信息,请参阅系统表空间数据文件配置。有关调整大小的说明,请参阅调整系统表空间大小。
-
innodb_data_home_dir命令行格式 --innodb-data-home-dir=dir_name系统变量 innodb_data_home_dir范围 全局 动态 否 SET_VAR提示适用否 类型 目录名称 InnoDB系统表空间数据文件的目录路径的公共部分。默认值为 MySQL 的data目录。该设置与innodb_data_file_path设置连接在一起,除非该设置使用绝对路径定义。在为
innodb_data_home_dir指定值时,需要添加尾随斜杠。例如:[mysqld] innodb_data_home_dir = /path/to/myibdata/此设置不影响 file-per-table 表空间的位置。
有关信息,请参阅第 17.8.1 节,“InnoDB 启动配置”。
-
innodb_ddl_buffer_size命令行格式 --innodb-ddl-buffer-size=#引入版本 8.0.27 系统变量 innodb_ddl_buffer_size范围 全局,会话 动态 是 SET_VAR提示适用否 类型 整数 默认值 1048576最小值 65536最大值 4294967295单位 字节 定义了 DDL 操作的最大缓冲区大小。默认设置为 1048576 字节(约 1 MB)。适用于创建或重建二级索引的在线 DDL 操作。请参见第 17.12.4 节,“在线 DDL 内存管理”。每个 DDL 线程的最大缓冲区大小是最大缓冲区大小除以 DDL 线程数(
innodb_ddl_buffer_size/innodb_ddl_threads)。 -
innodb_ddl_log_crash_reset_debug命令行格式 --innodb-ddl-log-crash-reset-debug[={OFF|ON}]系统变量 innodb_ddl_log_crash_reset_debug作用范围 全局 动态 是 SET_VARHint Applies否 类型 布尔值 默认值 OFF启用此调试选项可将 DDL 日志崩溃注入计数器重置为 1。此选项仅在使用
WITH_DEBUGCMake 选项编译时才可用。 -
innodb_ddl_threads命令行格式 --innodb-ddl-threads=#引入版本 8.0.27 系统变量 innodb_ddl_threads作用范围 全局,会话 动态 是 SET_VARHint Applies否 类型 整数 默认值 4最小值 1最大值 64定义了索引创建的排序和构建阶段的最大并行线程数。适用于创建或重建二级索引的在线 DDL 操作。有关更多信息,请参见第 17.12.5 节,“配置在线 DDL 操作的并行线程”和第 17.12.4 节,“在线 DDL 内存管理”。
-
innodb_deadlock_detect命令行格式 --innodb-deadlock-detect[={OFF|ON}]系统变量 innodb_deadlock_detect作用范围 全局 动态 是 SET_VARHint Applies否 类型 布尔值 默认值 ON此选项用于禁用死锁检测。在高并发系统中,死锁检测可能导致大量线程等待同一锁时减速。有时,更有效的做法是禁用死锁检测,并依赖于
innodb_lock_wait_timeout设置在死锁发生时进行事务回滚。有关更多信息,请参阅第 17.7.5.2 节,“死锁检测”。
-
innodb_dedicated_server命令行格式 --innodb-dedicated-server[={OFF|ON}]系统变量 innodb_dedicated_server范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF当启用
innodb_dedicated_server时,InnoDB会自动配置以下变量:-
innodb_buffer_pool_size -
innodb_redo_log_capacity或在 MySQL 8.0.30 之前,innodb_log_file_size和innodb_log_files_in_group。注意
innodb_log_file_size和innodb_log_files_in_group在 MySQL 8.0.30 中已弃用。这些变量已被innodb_redo_log_capacity取代。有关更多信息,请参阅第 17.6.5 节,“重做日志”。 -
innodb_flush_method
只有在 MySQL 实例位于可以使用所有可用系统资源的专用服务器上时,才考虑启用
innodb_dedicated_server。如果 MySQL 实例与其他应用程序共享系统资源,则不建议启用innodb_dedicated_server。更多信息,请参阅第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”。
-
-
innodb_default_row_format命令行格式 --innodb-default-row-format=value系统变量 innodb_default_row_format范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 DYNAMIC有效值 REDUNDANT``COMPACT``DYNAMICinnodb_default_row_format选项定义了InnoDB表和用户创建的临时表的默认行格式。默认设置为DYNAMIC。其他允许的值为COMPACT和REDUNDANT。不支持在系统表空间中使用的COMPRESSED行格式不能定义为默认值。新创建的表在未明确指定
ROW_FORMAT选项或使用ROW_FORMAT=DEFAULT时,会使用由innodb_default_row_format定义的行格式。当未明确指定
ROW_FORMAT选项或使用ROW_FORMAT=DEFAULT时,任何重建表的操作都会悄无声息地将表的行格式更改为由innodb_default_row_format定义的格式。更多信息,请参阅定义表的行格式。服务器为处理查询而创建的内部
InnoDB临时表使用DYNAMIC行格式,不受innodb_default_row_format设置的影响。 -
innodb_directories命令行格式 --innodb-directories=dir_name系统变量 innodb_directories范围 全局 动态 否 SET_VAR提示适用否 类型 目录名称 默认值 NULL定义在启动时扫描用于表空间文件的目录。在服务器离线时移动或恢复表空间文件到新位置时使用此选项。还用于指定使用绝对路径创建或位于数据目录之外的表空间文件的目录。
在崩溃恢复期间,表空间的发现依赖于
innodb_directories设置来识别重做日志中引用的表空间。更多信息,请参阅崩溃恢复期间的表空间发现。默认值为 NULL,但由
innodb_data_home_dir、innodb_undo_directory和datadir定义的目录始终会在InnoDB在启动时构建要扫描的目录列表时附加到innodb_directories参数值。这些目录会被附加,无论是否明确指定了innodb_directories设置。innodb_directories可以作为启动命令中的选项或 MySQL 选项文件中的选项指定。引号包围参数值,否则某些命令解释器会将分号(;)解释为特殊字符。(例如,Unix shell 将其视为命令终止符。)启动命令:
mysqld --innodb-directories="*directory_path_1*;*directory_path_2*"MySQL 选项文件:
[mysqld] innodb_directories="*directory_path_1*;*directory_path_2*"不能使用通配符表达式来指定目录。
innodb_directories扫描还会遍历指���目录的子目录。重复的目录和子目录将从要扫描的目录列表中丢弃。有关更多信息,请参见第 17.6.3.6 节,“服务器离线时移动表空间文件”。
-
innodb_disable_sort_file_cache命令行格式 --innodb-disable-sort-file-cache[={OFF|ON}]系统变量 innodb_disable_sort_file_cache作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF禁用合并排序临时文件的操作系统文件系统缓存。效果是以
O_DIRECT的等效方式打开这些文件。 -
innodb_doublewrite命令行格式 --innodb-doublewrite=value(≥ 8.0.30)--innodb-doublewrite[={OFF|ON}](≤ 8.0.29)系统变量 innodb_doublewrite作用范围 全局 动态(≥ 8.0.30) 是 动态(≤ 8.0.29) 否 SET_VAR提示适用否 类型(≥ 8.0.30) 枚举 类型(≤ 8.0.29) 布尔值 默认值 ON有效值 ON``OFF``DETECT_AND_RECOVER``DETECT_ONLYinnodb_doublewrite变量控制双写缓冲。在大多数情况下,默认情况下启用双写缓冲。在 MySQL 8.0.30 之前,您可以在启动服务器时将
innodb_doublewrite设置为ON或OFF以分别启用或禁用双写缓冲,从 MySQL 8.0.30 开始,innodb_doublewrite还支持DETECT_AND_RECOVER和DETECT_ONLY设置。DETECT_AND_RECOVER设置与ON设置相同。使用此设置,双写缓冲区完全启用,数据库页面内容被写入双写缓冲区,在恢复过程中访问以修复不完整的页面写入。使用
DETECT_ONLY设置时,只有元数据被写入双写缓冲区。数据库页面内容不会被写入双写缓冲区,并且恢复不使用双写缓冲区来修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。MySQL 8.0.30 及更高版本支持动态更改
innodb_doublewrite设置,可以在ON、DETECT_AND_RECOVER和DETECT_ONLY之间启用双写缓冲区。MySQL 不支持在启用双写缓冲区和OFF之间进行动态更改。如果双写缓冲区位于支持原子写入的 Fusion-io 设备上,则双写缓冲区将自动禁用,并且数据文件写入将使用 Fusion-io 原子写入。但是,请注意
innodb_doublewrite设置是全局的。当双写缓冲区被禁用时,所有数据文件都被禁用,包括那些不位于 Fusion-io 硬件上的文件。此功能仅在 Fusion-io 硬件上受支持,并且仅在 Linux 上为 Fusion-io NVMFS 启用。为了充分利用此功能,建议将innodb_flush_method设置为O_DIRECT。有关相关信息,请参见第 17.6.4 节,“双写缓冲区”。
-
innodb_doublewrite_batch_size命令行格式 --innodb-doublewrite-batch-size=#引入版本 8.0.20 系统变量 innodb_doublewrite_batch_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 256定义要批量写入的双写页面数。
有关更多信息,请参见第 17.6.4 节,“双写缓冲区”。
-
innodb_doublewrite_dir命令行格式 --innodb-doublewrite-dir=dir_name引入版本 8.0.20 系统变量 innodb_doublewrite_dir作用范围 全局 动态 否 SET_VAR提示适用否 类型 目录名称 定义双写文件的目录。如果未指定目录,则双写文件将在
innodb_data_home_dir目录中创建,默认情况下为数据目录(如果未指定)。更多信息,请参见第 17.6.4 节,“双写缓冲区”。
-
innodb_doublewrite_files命令行格式 --innodb-doublewrite-files=#引入版本 8.0.20 系统变量 innodb_doublewrite_files作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 innodb_buffer_pool_instances * 2最小值 2最大值 256定义双写文件的数量。默认情况下,为每个缓冲池实例创建两个双写文件。
至少有两个双写文件。双写文件的最大数量是缓冲池实例数量的两倍。(缓冲池实例数量由
innodb_buffer_pool_instances变量控制。)更多信息,请参见第 17.6.4 节,“双写缓冲区”。
-
innodb_doublewrite_pages命令行格式 --innodb-doublewrite-pages=#引入版本 8.0.20 系统变量 innodb_doublewrite_pages作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 innodb_write_io_threads value最小值 innodb_write_io_threads value最大值 512定义每个线程的批量写入的双写页面的最大数量。如果未指定值,则
innodb_doublewrite_pages设置为innodb_write_io_threads的值。更多信息,请参见第 17.6.4 节,“双写缓冲区”。
-
innodb_extend_and_initialize命令行格式 --innodb=extend-and-initialize[={OFF|ON}]引入版本 8.0.22 系统变量 innodb_extend_and_initialize范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON控制在 Linux 系统上为每个表和通用表空间分配空间的方式。
启用时,
InnoDB会将 NULL 写入新分配的页面。禁用时,空间是通过posix_fallocate()调用进行分配的,该调用保留空间而不实际写入 NULL。欲了解更多信息,请参阅第 17.6.3.8 节,“优化 Linux 上的表空间空间分配”。
-
innodb_fast_shutdown命令行格式 --innodb-fast-shutdown=#系统变量 innodb_fast_shutdown范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 1有效值 0``1``2InnoDB关闭模式。如果值为 0,则InnoDB在关闭之前执行慢关闭、完全清理和更改缓冲区合并。如果值为 1(默认值),InnoDB在关闭时跳过这些操作,这个过程称为快速关闭。如果值为 2,则InnoDB刷新其日志并冷静���闭,就像 MySQL 崩溃了一样;没有提交的事务会丢失,但崩溃恢复操作会使下一次启动时间变长。慢关闭可能需要几分钟,甚至在极端情况下,仍有大量数据缓冲时可能需要几个小时。在升级或降级 MySQL 主要版本之前,请使用慢关闭技术,以便在升级过程中更新文件格式时,所有数据文件都已准备就绪。
在紧急情况或故障排除情况下使用
innodb_fast_shutdown=2,以获得绝对最快的关闭速度,如果数据有损坏风险。 -
innodb_fil_make_page_dirty_debug命令行格式 --innodb-fil-make-page-dirty-debug=#系统变量 innodb_fil_make_page_dirty_debug范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 2**32-1默认情况下,将
innodb_fil_make_page_dirty_debug设置为表空间的 ID 会立即使表空间的第一页变脏。如果innodb_saved_page_number_debug设置为非默认值,则设置innodb_fil_make_page_dirty_debug会使指定页变脏。只有在使用WITH_DEBUGCMake 选项编译时,才能使用innodb_fil_make_page_dirty_debug选项。 -
innodb_file_per_table命令行格式 --innodb-file-per-table[={OFF|ON}]系统变量 innodb_file_per_table作用域 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON当启用
innodb_file_per_table时,默认情况下表会在文件表空间中创建。当禁用时,默认情况下表会在系统表空间中创建。有关文件表空间的信息,请参阅 第 17.6.3.2 节,“文件表空间”。有关InnoDB系统表空间的信息,请参阅 第 17.6.3.1 节,“系统表空间”。innodb_file_per_table变量可以通过SET GLOBAL语句在运行时配置,在启动时在命令行上指定,或在选项文件中指定。在运行时配置需要足够的权限来设置全局系统变量(参见 第 7.1.9.1 节,“系统变量权限”),并立即影响所有连接的操作。当位于文件表空间中的表被截断或删除时,释放的空间会返回给操作系统。截断或删除位于系统表空间中的表只会释放系统表空间中的空间。系统表空间中释放的空间可以再次用于
InnoDB数据,但不会返回给操作系统,因为系统表空间数据文件永远不会收缩。innodb_file_per-table设置不影响临时表的创建。从 MySQL 8.0.14 开始,临时表在会话临时表空间中创建,在此之前是在全局临时表空间中创建。请参阅 第 17.6.3.5 节,“临时表空间”。 -
innodb_fill_factor命令行格式 --innodb-fill-factor=#系统变量 innodb_fill_factor作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 100最小值 10最大值 100InnoDB在创建或重建索引时执行批量加载。这种索引创建方法被称为“排序索引构建”。innodb_fill_factor定义了在排序索引构建期间填充在每个 B 树页上的空间百分比,剩余空间保留用于未来的索引增长���例如,将innodb_fill_factor设置为 80,将在每个 B 树页上保留 20% 的空间用于未来的索引增长。实际百分比可能有所不同。innodb_fill_factor设置被解释为提示而不是硬限制。将
innodb_fill_factor设置为 100,将聚簇索引页中的 1/16 空间留给未来的索引增长。innodb_fill_factor适用于 B 树叶子页和非叶子页。它不适用于用于TEXT或BLOB条目的外部页。欲了解更多信息,请参阅 第 17.6.2.3 节,“排序索引构建”。
-
innodb_flush_log_at_timeout命令行格式 --innodb-flush-log-at-timeout=#系统变量 innodb_flush_log_at_timeout作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 1最小值 1最大值 2700单位 秒 每隔*
N*秒写入并刷新日志。innodb_flush_log_at_timeout允许增加刷新之间的超时时间,以减少刷新并避免影响二进制日志组提交的性能。innodb_flush_log_at_timeout的默认设置是每秒一次。 -
innodb_flush_log_at_trx_commit命令行格式 --innodb-flush-log-at-trx-commit=#系统变量 innodb_flush_log_at_trx_commit作用范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 1有效值 0``1``2控制严格的 ACID 合规性和在重新排列和批量执行与提交相关的 I/O 操作时可能实现的更高性能之间的平衡。通过更改默认值,您可以获得更好的性能,但在崩溃时可能会丢失事务。
-
默认设置为 1 是为了完全符合 ACID 要求。日志在每次事务提交时被写入并刷新到磁盘。
-
设置为 0 时,日志每秒写入并刷新到磁盘一次。在崩溃时可能会丢失未刷新日志的事务。
-
设置为 2 时,日志在每次事务提交后写入并每秒刷新到磁盘一次。在崩溃时可能会丢失未刷新日志的事务。
-
对于设置为 0 和 2 的情况,每秒刷新并不是 100%保证的。由于 DDL 更改和其他内部
InnoDB活动可能导致日志独立于innodb_flush_log_at_trx_commit设置而更频繁地刷新,有时由于调度问题而更少地刷新。如果日志每秒刷新一次,在崩溃时可能会丢失最多一秒钟的事务。如果日志的刷新频率高于或低于每秒一次,可能会相应地丢失不同数量的事务。 -
日志刷新频率由
innodb_flush_log_at_timeout控制,允许您将日志刷新频率设置为*N秒(其中N为1 ... 2700,默认值为 1)。然而,任何意外的mysqld进程退出可能会擦除最多N*秒的事务。 -
DDL 更改和其他内部
InnoDB活动会独立于innodb_flush_log_at_trx_commit设置刷新日志。 -
InnoDB崩溃恢复无论innodb_flush_log_at_trx_commit设置如何都能正常工作。事务要么完全应用,要么完全擦除。
对于使用带有事务的
InnoDB的复制设置中的耐用性和一致性:-
如果启用了二进制日志记录,请设置
sync_binlog=1。 -
始终设置
innodb_flush_log_at_trx_commit=1。
对于在复制品上组合设置的信息,以使其对意外停机最具弹性,请参阅第 19.4.2 节,“处理复制品意外停机”。
警告
许多操作系统和一些磁盘硬件欺骗了刷新到磁盘的操作。它们可能会告诉mysqld刷新已经完成,尽管实际上并没有。在这种情况下,即使使用推荐的设置,事务的持久性也无法得到保证,最坏的情况下,断电可能会损坏
InnoDB数据。在 SCSI 磁盘控制器或磁盘本身中使用带电池后备的磁盘缓存可以加快文件刷新速度,并使操作更安全。您还可以尝试禁用硬件缓存中的磁盘写入缓存。 -
-
innodb_flush_method命令行格式 --innodb-flush-method=value系统变量 innodb_flush_method范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 默认值(Unix) fsync默认值(Windows) unbuffered有效值(Unix) fsync``O_DSYNC``littlesync``nosync``O_DIRECT``O_DIRECT_NO_FSYNC有效值(Windows) unbuffered``normal定义用于将数据刷新到
InnoDB数据文件和日志文件的方法,这可能会影响 I/O 吞吐量。在类 Unix 系统上,默认值为
fsync。在 Windows 上,默认值为unbuffered。注意
在 MySQL 8.0 中,可以通过数字方式指定
innodb_flush_method选项。适用于类 Unix 系统的
innodb_flush_method选项包括:-
fsync或0:InnoDB使用fsync()系统调用来刷新数据和日志文件。fsync是默认设置。 -
O_DSYNC或1:InnoDB使用O_SYNC来打开和刷新日志文件,并使用fsync()来刷新数据文件。InnoDB不直接使用O_DSYNC,因为在许多 Unix 变种上存在问题。 -
littlesync或2:此选项用于内部性能测试,目前不受支持。请自行承担风险。 -
nosync或3:此选项用于内部性能测试,目前不受支持。请自行承担风险。 -
O_DIRECT或4:InnoDB使用O_DIRECT(或 Solaris 上的directio())来打开数据文件,并使用fsync()来刷新数据和日志文件。此选项适用于某些 GNU/Linux 版本、FreeBSD 和 Solaris。 -
O_DIRECT_NO_FSYNC:InnoDB在刷新 I/O 时使用O_DIRECT,但在每次写操作后跳过fsync()系统调用。在 MySQL 8.0.14 之前,此设置不适用于需要
fsync()系统调用同步文件系统元数据更改的文件系统,如 XFS 和 EXT4。如果不确定您的文件系统是否需要fsync()系统调用来同步文件系统元数据更改,请改用O_DIRECT。自 MySQL 8.0.14 起,在创建新文件、增加文件大小和关闭文件后,会调用
fsync()以确保文件系统元数据更改被同步。每次写操作后仍会跳过fsync()系统调用。如果重做日志文件和数据文件位于不同存储设备上,并且在数据文件写入未从非带电池备份的设备缓存中刷新时发生意外退出,则可能会发生数据丢失。如果您使用或打算使用不同的存储设备用于重做日志文件和数据文件,并且您的数据文件位于没有带电池备份的缓存的设备上,请改用
O_DIRECT。
在支持
fdatasync()系统调用的平台上,MySQL 8.0.26 中引入的innodb_use_fdatasync变量允许使用fsync()的innodb_flush_method选项来代替fdatasync()。fdatasync()系统调用不会刷新文件元数据,除非需要用于后续数据检索,从而提供潜在的性能优势。Windows 系统的
innodb_flush_method选项包括:-
unbuffered或0:InnoDB使用模拟异步 I/O 和非缓冲 I/O。 -
normal或1:InnoDB使用模拟异步 I/O 和缓冲 I/O。
每个设置如何影响性能取决于硬件配置和工作负载。基准测试您的特定配置以决定使用哪个设置,或者是否保留默认设置。检查
Innodb_data_fsyncs状态变量,查看每个设置的fsync()调用总数(如果启用了innodb_use_fdatasync,则为fdatasync()调用)。工作负载中读取和写入操作的混合可能会影响设置的性能。例如,在具有硬件 RAID 控制器和带电池后备写缓存的系统上,O_DIRECT可以帮助避免InnoDB缓冲池和操作系统文件系统缓存之间的双重缓冲。在一些InnoDB数据和日志文件位于 SAN 上的系统中,默认值或O_DSYNC可能对大部分为SELECT语句的读取密集型工作负载更快。始终使用反映生产环境的硬件和工作负载测试此参数。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。如果启用了
innodb_dedicated_server,则如果未明确定义,innodb_flush_method值将自动配置。有关更多信息,请参见第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”。 -
-
innodb_flush_neighbors命令行格式 --innodb-flush-neighbors=#系统变量 innodb_flush_neighbors范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 0有效值 0``1``2指定从
InnoDB缓冲池刷新页面时是否也刷新同一范围中的其他脏页。-
设置为 0 会禁用
innodb_flush_neighbors。同一范围内的脏页不会被刷新。 -
设置为 1 会刷新同一范围内连续的脏页。
-
设置为 2 会刷新同一范围内的脏页。
当表数据存储在传统的 HDD 存储设备上时,一次刷新这样的相邻页减少了 I/O 开销(主要是磁盘寻道操作)与在不同时间刷新单个页相比。对于存储在 SSD 上的表数据,寻道时间不是一个重要因素,您可以将此选项设置为 0 以分散写操作。有关相关信息,请参见第 17.8.3.5 节,“配置缓冲池刷新”。
-
-
innodb_flush_sync命令行格式 --innodb-flush-sync[={OFF|ON}]系统变量 innodb_flush_sync范围 全局 动态 是 SET_VAR提示适用否 类型 布尔 默认值 ON默认情况下启用的
innodb_flush_sync变量导致在检查点发生 I/O 活动突发时忽略innodb_io_capacity设置。要遵守由innodb_io_capacity设置定义的 I/O 速率,在 I/O 活动突发时禁用innodb_flush_sync。有关配置
innodb_flush_sync变量的信息,请参见第 17.8.7 节,“配置 InnoDB I/O 容量”。 -
innodb_flushing_avg_loops命令行格式 --innodb-flushing-avg-loops=#系统变量 innodb_flushing_avg_loops范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 30最小值 1最大值 1000InnoDB保留先前计算的刷新状态快照的迭代次数,控制自适应刷新对变化的工作负载作出响应的速度。增加该值使得刷新操作的速率在工作负载变化时平稳逐渐变化。减少该值使得自适应刷新快速调整到工作负载变化,这可能导致刷新活动在工作负载突然增加和减少时出现波动。有关相关信息,请参阅第 17.8.3.5 节,“配置缓冲池刷新”。
-
innodb_force_load_corrupted命令行格式 --innodb-force-load-corrupted[={OFF|ON}]系统变量 innodb_force_load_corrupted作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF允许
InnoDB在启动时加载标记为损坏的表格。仅在故障排除期间使用,以恢复其他无法访问的数据。故障排除完成后,请禁用此设置并重新启动服务器。 -
innodb_force_recovery命令行格式 --innodb-force-recovery=#系统变量 innodb_force_recovery作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 6崩溃恢复模式,通常仅在严重故障排除情况下更改。可能的值为 0 到 6。有关这些值的含义以及关于
innodb_force_recovery的重要信息,请参阅第 17.21.3 节,“强制 InnoDB 恢复”。警告
仅在紧急情况下将此变量设置为大于 0 的值,以便您可以启动
InnoDB并转储表格。作为安全措施,当innodb_force_recovery大于 0 时,InnoDB会阻止INSERT、UPDATE或DELETE操作。innodb_force_recovery设置为 4 或更高时,将InnoDB置于只读模式。这些限制可能导致复制管理命令失败并显示错误,因为复制将副本状态日志存储在
InnoDB表中。 -
innodb_fsync_threshold命令行格式 --innodb-fsync-threshold=#引入版本 8.0.13 系统变量 innodb_fsync_threshold作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 2**64-1默认情况下,当
InnoDB创建新的数据文件,例如新的日志文件或表空间文件时,文件在刷新到磁盘之前会完全写入操作系统缓存,这可能导致大量的磁盘写入活动一次性发生。为了强制从操作系统缓存中定期刷新较小的数据块,您可以使用innodb_fsync_threshold变量定义一个阈值值,以字节为单位。当达到字节阈值时,操作系统缓存的内容会刷新到磁盘。默认值为 0,强制默认行为,即仅在文件完全写入缓存后才将数据刷新到磁盘。指定阈值以强制较小的定期刷新可能有益于多个 MySQL 实例使用相同存储设备的情况。例如,创建新的 MySQL 实例及其关联的数据文件可能导致大量的磁盘写入活动激增,影响使用相同存储设备的其他 MySQL 实例的性能。配置阈值有助于避免此类写入活动激增。
-
innodb_ft_aux_table系统变量 innodb_ft_aux_table范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 指定包含
FULLTEXT索引的InnoDB表的限定名称。此变量仅用于诊断目的,并且只能在运行时设置。例如:SET GLOBAL innodb_ft_aux_table = 'test/t1';将此变量设置为格式为
*db_name*/*table_name*的名称后,INFORMATION_SCHEMA表INNODB_FT_INDEX_TABLE、INNODB_FT_INDEX_CACHE、INNODB_FT_CONFIG、INNODB_FT_DELETED和INNODB_FT_BEING_DELETED显示关于指定表的搜索索引的信息。更多信息,请参见 第 17.15.4 节,“InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables”。
-
innodb_ft_cache_size命令行格式 --innodb-ft-cache-size=#系统变量 innodb_ft_cache_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 8000000最小值 1600000最大值 80000000单位 字节 为
InnoDBFULLTEXT搜索索引缓存分配的内存量(以字节为单位),在创建InnoDBFULLTEXT索引时,该缓存在内存中保存解析的文档。仅当达到innodb_ft_cache_size大小限制时,索引插入和更新才会提交到磁盘。innodb_ft_cache_size定义了每个表的缓存大小。要为所有表设置全局限制,请参阅innodb_ft_total_cache_size。欲了解更多信息,请参阅 InnoDB 全文索引缓存。
-
innodb_ft_enable_diag_print命令行格式 --innodb-ft-enable-diag-print[={OFF|ON}]系统变量 innodb_ft_enable_diag_print作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF是否启用额外的全文搜索(FTS)诊断输出。此选项主要用于高级 FTS 调试,对大多数用户不感兴趣。输出打印到错误日志中,包括以下信息:
-
FTS 索引同步进度(当达到 FTS 缓存限制时)。例如:
FTS SYNC for table test, deleted count: 100 size: 10000 bytes SYNC words: 100 -
FTS 优化进度。例如:
FTS start optimize test FTS_OPTIMIZE: optimize "mysql" FTS_OPTIMIZE: processed "mysql" -
FTS 索引构建进度。例如:
Number of doc processed: 1000 -
对于 FTS 查询,会打印查询解析树、词权重、查询处理时间和内存使用情况。例如:
FTS Search Processing time: 1 secs: 100 millisec: row(s) 10000 Full Search Memory: 245666 (bytes), Row: 10000
-
-
innodb_ft_enable_stopword命令行格式 --innodb-ft-enable-stopword[={OFF|ON}]系统变量 innodb_ft_enable_stopword作用范围 全局,会话 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON指定在创建
InnoDBFULLTEXT索引时,与之关联的一组停用词。如果设置了innodb_ft_user_stopword_table选项,则从该表中获取停用词。否则,如果设置了innodb_ft_server_stopword_table选项,则从该表中获取停用词。否则,将使用内置的默认停用词集。欲了解更多信息,请参阅 第 14.9.4 节,“全文搜索停用词”。
-
innodb_ft_max_token_size命令行格式 --innodb-ft-max-token-size=#系统变量 innodb_ft_max_token_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 84最小值 10最大值 84存储在
InnoDBFULLTEXT索引中的单词的最大字符长度。设置此值的限制会减小索引的大小,从而加快查询速度,通过省略长关键词或不是真实单词且不太可能是搜索词的任意字母集合。欲了解更多信息,请参阅 第 14.9.6 节,“调整 MySQL 全文搜索”。
-
innodb_ft_min_token_size命令行格式 --innodb-ft-min-token-size=#系统变量 innodb_ft_min_token_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 3最小值 0最大值 16存储在
InnoDBFULLTEXT索引中的单词的最小长度。增加此值会减小索引的大小,从而加快查询速度,通过省略在搜索上下文中不太可能重要的常见单词,例如英语单词“a”和“to”。对于使用 CJK(中文、日文、韩文)字符集的内容,请指定值为 1。欲了解更多信息,请参阅 第 14.9.6 节,“调整 MySQL 全文搜索”。
-
innodb_ft_num_word_optimize命令行格式 --innodb-ft-num-word-optimize=#系统变量 innodb_ft_num_word_optimize范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 2000最小值 1000最大值 10000在每次对
InnoDBFULLTEXT索引执行OPTIMIZE TABLE操作期间要处理的单词数。因为对包含全文搜索索引的表进行大量插入或更新操作可能需要大量的索引维护来合并所有更改,您可能需要执行一系列OPTIMIZE TABLE语句,每个语句从上一个语句结束的地方开始。更多信息,请参见 第 14.9.6 节,“调整 MySQL 全文搜索”。
-
innodb_ft_result_cache_limit命令行格式 --innodb-ft-result-cache-limit=#系统变量 innodb_ft_result_cache_limit作用范围 全局 动态 是 SET_VAR提��适用否 类型 整数 默认值 2000000000最小值 1000000最大值 2**32-1单位 字节 每个全文搜索查询或每个线程的
InnoDB全文搜索查询结果缓存限制(以字节为单位)。中间和最终的InnoDB全文搜索查询结果在内存中处理。使用innodb_ft_result_cache_limit来对全文搜索查询结果缓存设置大小限制,以避免在出现非常大的InnoDB全文搜索查询结果(例如数百万或数亿行)时导致过多的内存消耗。在处理全文搜索查询时根据需要分配内存。如果达到结果缓存大小限制,将返回错误,指示查询超过允许的最大内存。所有平台类型和位数的
innodb_ft_result_cache_limit的最大值为 2**32-1。 -
innodb_ft_server_stopword_table命令行格式 --innodb-ft-server-stopword-table=db_name/table_name系统变量 innodb_ft_server_stopword_table作用范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 NULL此选项用于为所有
InnoDB表指定自己的InnoDBFULLTEXT索引停用词列表。要为特定的InnoDB表配置自己的停用词列表,请使用innodb_ft_user_stopword_table。将
innodb_ft_server_stopword_table设置为包含停用词列表的表的名称,格式为*db_name*/*table_name*。在配置
innodb_ft_server_stopword_table之前,停用词表必须存在。在创建FULLTEXT索引之前,必须启用innodb_ft_enable_stopword,并配置innodb_ft_server_stopword_table选项。停用词表必须是一个
InnoDB表,包含一个名为value的单个VARCHAR列。更多信息,请参见第 14.9.4 节,“全文停用词”。
-
innodb_ft_sort_pll_degree命令行格式 --innodb-ft-sort-pll-degree=#系统变量 innodb_ft_sort_pll_degree范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 2最小值 1最大值 16在构建搜索索引时,用于并行索引和标记
InnoDBFULLTEXT索引中文本的线程数。有关信息,请参见第 17.6.2.4 节,“InnoDB 全文索引”,以及
innodb_sort_buffer_size。 -
innodb_ft_total_cache_size命令行格式 --innodb-ft-total-cache-size=#系统变量 innodb_ft_total_cache_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 640000000最小值 32000000最大值 1600000000单位 字节 为所有表的
InnoDB全文搜索索引缓存分配的总内存,以字节为单位。创建多个具有FULLTEXT搜索索引的表可能会消耗大量可用内存。innodb_ft_total_cache_size定义了所有全文搜索索引的全局内存限制,以帮助避免过度内存消耗。如果索引操作达到全局限制,将触发强制同步。更多信息,请参见 InnoDB 全文索引缓存。
-
innodb_ft_user_stopword_table命令行格式 --innodb-ft-user-stopword-table=db_name/table_name系统变量 innodb_ft_user_stopword_table范围 全局,会话 动态 是 SET_VAR提示适用否 类型 字符串 默认值 NULL此选项用于在特定表上指定自己的
InnoDBFULLTEXT索引停用词列表。要为所有InnoDB表配置自己的停用词列表,请使用innodb_ft_server_stopword_table。将
innodb_ft_user_stopword_table设置为包含停用词列表的表的名称,格式为*db_name*/*table_name*。在配置
innodb_ft_user_stopword_table之前,停用词表必须存在。在创建FULLTEXT索引之前,必须启用innodb_ft_enable_stopword并配置innodb_ft_user_stopword_table。停用词表必须是一个
InnoDB表,包含一个名为value的单个VARCHAR列。更多信息,请参阅 第 14.9.4 节,“全文本停用词”。
-
innodb_idle_flush_pct命令行格式 --innodb-idle-flush-pct=#引入版本 8.0.18 系统变量 innodb_idle_flush_pct范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 100最小值 0最大值 100当
InnoDB空闲时限制页面刷新。innodb_idle_flush_pct值是innodb_io_capacity设置的百分比,该设置定义了InnoDB每秒可用的 I/O 操作数。更多信息,请参阅 在空闲时期限制缓冲区刷新。 -
innodb_io_capacity命令行格式 --innodb-io-capacity=#系统变量 innodb_io_capacity范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 200最小值 100最大值(64 位平台) 2**64-1最大值(32 位平台) 2**32-1innodb_io_capacity变量定义了InnoDB后台任务每秒(IOPS)可用的 I/O 操作数量,例如从缓冲池刷新页面和从更改缓冲区合并数据。有关配置
innodb_io_capacity变量的信息,请参见第 17.8.7 节,“配置 InnoDB I/O 容量”。 -
innodb_io_capacity_max命令行格式 --innodb-io-capacity-max=#系统变量 innodb_io_capacity_max范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 见描述最小值 100最大值(32 位平台) 2**32-1最大值(Unix,64 位平台,≥ 8.0.29) 2**32-1最大值(Unix,64 位平台,≤ 8.0.28) 2**64-1最大值(Windows,64 位平台) 2**32-1如果刷新活动落后,
InnoDB可以以比innodb_io_capacity变量定义的更高的 I/O 操作每秒(IOPS)速率更积极地刷新。innodb_io_capacity_max变量定义了在这种情况下InnoDB后台任务执行的最大 IOPS 数量。有关配置
innodb_io_capacity_max变量的信息,请参见第 17.8.7 节,“配置 InnoDB I/O 容量”。 -
innodb_limit_optimistic_insert_debug命令行格式 --innodb-limit-optimistic-insert-debug=#系统变量 innodb_limit_optimistic_insert_debug范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 2**32-1限制每个 B 树页面的记录数。默认值为 0 表示不施加限制。此选项仅在使用
WITH_DEBUGCMake 选项编译调试支持时才可用。 -
innodb_lock_wait_timeout命令行格式 --innodb-lock-wait-timeout=#系统变量 innodb_lock_wait_timeout范围 全局,会话 动态 是 SET_VAR提示适用否 类型 整数 默认值 50最小值 1最大值 1073741824单位 秒 在
InnoDB事务在放弃之前等待行锁的时间长度(以秒为单位)。默认值为 50 秒。尝试访问被另一个InnoDB事务锁定的行的事务在发出以下错误之前最多等待这么多秒以获得对行的写访问:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction当发生锁等待超时时,当前语句会被回滚(而不是整个事务)。要使整个事务回滚,请使用
--innodb-rollback-on-timeout选项启动服务器。另请参见第 17.21.5 节,“InnoDB 错误处理”。对于高度交互式应用程序或 OLTP 系统,您可以减少此值,以便快速显示用户反馈或将更新放入队列以供稍后处理。对于长时间运行的后端操作,例如数据仓库中等待其他大型插入或更新操作完成的转换步骤,您可以增加此值。
innodb_lock_wait_timeout适用于InnoDB行锁。MySQL 的表锁不会发生在InnoDB中,因此此超时不适用于等待表锁。当启用(默认)
innodb_deadlock_detect时,锁等待超时值不适用于死锁,因为InnoDB立即检测到死锁并回滚其中一个死锁事务。当禁用innodb_deadlock_detect时,InnoDB依赖于innodb_lock_wait_timeout在发生死锁时进行事务回滚。参见第 17.7.5.2 节,“死锁检测”。innodb_lock_wait_timeout可以使用SET GLOBAL或SET SESSION语句在运行时设置。更改GLOBAL设置需要足够权限来设置全局系统变量(请参阅第 7.1.9.1 节,“系统变量权限”),并影响随后连接的所有客户端的操作。任何客户端都可以更改innodb_lock_wait_timeout的SESSION设置,这仅影响该客户端。 -
innodb_log_buffer_size命令行格式 --innodb-log-buffer-size=#系统变量 innodb_log_buffer_size作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 16777216最小值 1048576最大值 4294967295InnoDB用于在磁盘上写入日志文件的缓冲区大小(以字节为单位)。默认值为 16MB。较大的日志缓冲区使得大型事务可以在提交之前无需将日志写入磁盘。因此,如果您有更新、插入或删除多行的事务,增大日志缓冲区可以节省磁盘 I/O。有关相关信息,请参阅内存配置和第 10.5.4 节,“优化 InnoDB 重做日志记录”。有关一般 I/O 调优建议,请参阅第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。 -
innodb_log_checkpoint_fuzzy_now命令行格式 --innodb-log-checkpoint-fuzzy-now[={OFF|ON}]引入版本 8.0.13 系统变量 innodb_log_checkpoint_fuzzy_now作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用此调试选项以强制
InnoDB执行模糊检查点。此选项仅在使用WITH_DEBUGCMake 选项编译时才可用。 -
innodb_log_checkpoint_now命令行格式 --innodb-log-checkpoint-now[={OFF|ON}]系统变量 innodb_log_checkpoint_now范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用此调试选项以强制
InnoDB写入检查点。此选项仅在使用WITH_DEBUGCMake选项编译时才可用。 -
innodb_log_checksums命令行格式 --innodb-log-checksums[={OFF|ON}]系统变量 innodb_log_checksums范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON启用或禁用重做日志页面的校验和。
innodb_log_checksums=ON启用CRC-32C校验算法用于重做日志页面。当禁用innodb_log_checksums时,重做日志页面校验字段的内容将被忽略。重做日志头页面和重做日志检查点页面上的校验和永远不会被禁用。
-
innodb_log_compressed_pages命令行格式 --innodb-log-compressed-pages[={OFF|ON}]系统变量 innodb_log_compressed_pages范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON指定是否将重新压缩的页面图像写入重做日志。当对压缩数据进行更改时可能会发生重新压缩。
innodb_log_compressed_pages默认启用,以防止在恢复期间使用不同版本的zlib压缩算法时可能发生的损坏。如果您确定zlib版本不会更改,可以禁用innodb_log_compressed_pages以减少修改压缩数据的工作负载的重做日志生成。要衡量启用或禁用
innodb_log_compressed_pages的影响,请比较相同工作负载下两种设置的重做日志生成情况。衡量重做日志生成的选项包括观察SHOW ENGINE INNODB STATUS输出中LOG部分中的Log sequence number(LSN),或监视Innodb_os_log_written状态,查看写入重做日志文件的字节数。有关相关信息,请参阅第 17.9.1.6 节,“OLTP 工作负载的压缩”。
-
innodb_log_file_size命令行格式 --innodb-log-file-size=#已弃用 8.0.30 系统变量 innodb_log_file_size作用范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 50331648最小值 4194304最大值 512GB / innodb_log_files_in_group单位 字节 注意
innodb_log_file_size和innodb_log_files_in_group在 MySQL 8.0.30 中已弃用。这些变量已被innodb_redo_log_capacity取代。有关更多信息,请参阅第 17.6.5 节,“重做日志”。每个日志组中每个日志文件的大小(
innodb_log_file_size*innodb_log_files_in_group)。日志文件的组合大小(innodb_log_file_size*innodb_log_files_in_group)不能超过略小于 512GB 的最大值。例如,一对 255GB 的日志文件接近限制但不超过。默认值为 48MB。通常,日志文件的组合大小应足够大,以便服务器可以平滑处理工作负载活动的峰值和谷值,这通常意味着有足够的重做日志空间来处理超过一个小时的写入活动。数值越大,在缓冲池中需要的检查点刷新活动就越少,从而节省磁盘 I/O。更大的日志文件也会使崩溃恢复变慢。
innodb_log_file_size的最小值为 4MB。有关更多信息,请参阅重做日志配置。有关一般 I/O 调优建议,请参阅第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
如果启用了
innodb_dedicated_server,并且未明确定义,则innodb_log_file_size的值将自动配置。有关更多信息,请参阅第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”。 -
innodb_log_files_in_group命令行格式 --innodb-log-files-in-group=#已弃用 8.0.30 系统变量 innodb_log_files_in_group作用域 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 2最小值 2最大值 100注意
innodb_log_file_size和innodb_log_files_in_group在 MySQL 8.0.30 中已弃用。这些变量已被innodb_redo_log_capacity取代。有关更多信息,请参阅第 17.6.5 节,“重做日志”。日志文件在日志组中的数量。
InnoDB以循环方式写入这些文件。默认(也是推荐的)值为 2。文件的位置由innodb_log_group_home_dir指定。日志文件的组合大小(innodb_log_file_size*innodb_log_files_in_group)最多可达 512GB。有关更多信息,请参阅重做日志配置。
如果启用了
innodb_dedicated_server,并且未明确定义,则innodb_log_files_in_group将自动配置。有关更多信息,请参阅第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”。 -
innodb_log_group_home_dir命令行格式 --innodb-log-group-home-dir=dir_name系统变量 innodb_log_group_home_dir范围 全局 动态 否 SET_VAR提示适用否 类型 目录名称 InnoDB重做日志文件的目录路径。有关信息,请参阅重做日志配置。
-
innodb_log_spin_cpu_abs_lwm命令行格式 --innodb-log-spin-cpu-abs-lwm=#系统变量 innodb_log_spin_cpu_abs_lwm范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 80最小值 0最大值 4294967295定义了用户线程在等待刷新的重做时不再自旋的最小 CPU 使用率。该值表示为 CPU 核心使用率的总和。例如,80 的默认值是单个 CPU 核心的 80%。在具有多核处理器的系统上,值为 150 表示一个 CPU 核心的 100%使用率加上第二个 CPU 核心的 50%使用率。
有关信息,请参阅第 10.5.4 节,“优化 InnoDB 重做日志”。
-
innodb_log_spin_cpu_pct_hwm命令行格式 --innodb-log-spin-cpu-pct-hwm=#系统变量 innodb_log_spin_cpu_pct_hwm范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 50最小值 0最大值 100定义了用户线程在等待刷新的重做时不再自旋的最大 CPU 使用率。该值表示为所有 CPU 核心的总处理能力的百分比。默认值为 50%。例如,对于具有四个 CPU 核心的服务器,两个 CPU 核心的 100%使用率是组合 CPU 处理能力的 50%。
innodb_log_spin_cpu_pct_hwm变量遵守处理器亲和性。例如,如果服务器有 48 个核心,但mysqld进程只固定在四个 CPU 核心上,则其他 44 个 CPU 核心将被忽略。有关信息,请参阅第 10.5.4 节,“优化 InnoDB 重做日志”。
-
innodb_log_wait_for_flush_spin_hwm命令行格式 --innodb-log-wait-for-flush-spin-hwm=#系统变量 innodb_log_wait_for_flush_spin_hwm范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 400最小值 0最大值(64 位平台) 2**64-1最大值(32 位平台) 2**32-1单位 微秒 定义了超过最大平均日志刷新时间的值,用户线程在等待刷新的重做时不再旋转。默认值为 400 微秒。
有关信息,请参见 Section 10.5.4, “Optimizing InnoDB Redo Logging”。
-
innodb_log_write_ahead_size命令行格式 --innodb-log-write-ahead-size=#系统变量 innodb_log_write_ahead_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 8192最小值 512(日志文件块大小)最大值 等于 innodb_page_size单位 字节 定义了重做日志的预写块大小,以字节为单位。为避免“读写”,将
innodb_log_write_ahead_size设置为与操作系统或文件系统缓存块大小相匹配。默认设置为 8192 字节。当由于重做日志块与操作系统或文件系统的缓存块大小不匹配而导致重做日志块未完全缓存在操作系统或文件系统中时,就会发生读写。innodb_log_write_ahead_size的有效值是InnoDB日志文件块大小(2^n)的倍数。最小值是InnoDB日志文件块大小(512)。当指定最小值时,不会发生预写。最大值等于innodb_page_size值。如果为innodb_log_write_ahead_size指定的值大于innodb_page_size值,则innodb_log_write_ahead_size设置将被截断为innodb_page_size值。如果
innodb_log_write_ahead_size的值相对于操作系统或文件系统缓存块大小设置得太低,会导致“写入时读取”。如果值设置得太高,可能会对fsync性能产生轻微影响,因为多个块一次被写入。有关更多信息,请参阅第 10.5.4 节,“优化 InnoDB 重做日志记录”。
-
innodb_log_writer_threads命令行格式 --innodb-log-writer-threads[={OFF|ON}]引入版本 8.0.22 系统变量 innodb_log_writer_threads范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON启用专用日志写入线程,用于将重做日志记录从日志缓冲区写入系统缓冲区并将系统缓冲区刷新到重做日志文件。专用日志写入线程可以提高高并发系统的性能,但对于低并发系统,禁用专用日志写入线程可以提供更好的性能。
有关更多信息,请参阅第 10.5.4 节,“优化 InnoDB 重做日志记录”。
-
innodb_lru_scan_depth命令行格式 --innodb-lru-scan-depth=#系统变量 innodb_lru_scan_depth范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 1024最小值 100最大值(64 位平台) 2**64-1最大值(32 位平台) 2**32-1影响
InnoDB缓冲池的刷新操作算法和启发式的参数。主要关注性能专家调整 I/O 密集型工作负载。它指定了每个缓冲池实例,页面清理线程在 LRU 页面列表中扫描多深以查找要刷新的脏页。这是一个每秒执行一次的后台操作。一般来说,比默认值小的设置对大多数工作负载都适用。如果值远高于必要值,可能会影响性能。只有在典型工作负载下有多余 I/O 容量时才考虑增加该值。相反,如果写入密集型工作负载使 I/O 容量饱和,降低该值,尤其是在有大缓冲池的情况下。
在调整
innodb_lru_scan_depth时,从一个较低值开始,并将设置向上配置,目标是很少看到零空闲页。此外,考虑在更改缓冲池实例数时调整innodb_lru_scan_depth,因为innodb_lru_scan_depth*innodb_buffer_pool_instances定义了页面清理线程每秒执行的工作量。有关相关信息,请参见第 17.8.3.5 节,“配置缓冲池刷新”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_max_dirty_pages_pct命令行格式 --innodb-max-dirty-pages-pct=#系统变量 innodb_max_dirty_pages_pct范围 全局 动态 是 SET_VAR提示适用否 类型 数值 默认值 90最小值 0最大值 99.999InnoDB尝试从缓冲池中刷新数据,以使脏页的百分比不超过此值。innodb_max_dirty_pages_pct设置了刷新活动的目标,不影响刷新速率。有关管理刷新速率的信息,请参见第 17.8.3.5 节,“配置缓冲池刷新”。有关相关信息,请参见第 17.8.3.5 节,“配置缓冲池刷新”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_max_dirty_pages_pct_lwm命令行格式 --innodb-max-dirty-pages-pct-lwm=#系统变量 innodb_max_dirty_pages_pct_lwm范围 全局 动态 是 SET_VAR提示适用否 类型 数值 默认值 10最小值 0最大值 99.999定义了表示脏页百分比的低水位,当预刷写启用以控制脏页比率时。值为 0 会完全禁用预刷写行为。配置的值应始终低于
innodb_max_dirty_pages_pct的值。更多信息,请参见第 17.8.3.5 节,“配置缓冲池刷新”。 -
innodb_max_purge_lag命令行格式 --innodb-max-purge-lag=#系统变量 innodb_max_purge_lag范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 4294967295定义了期望的最大清除延迟。如果超过此值,将对
INSERT、UPDATE和DELETE操作施加延迟,以便清除赶上。默认值为 0,这意味着没有最大清除延迟和没有延迟。更多信息,请参见第 17.8.9 节,“清除配置”。
-
innodb_max_purge_lag_delay命令行格式 --innodb-max-purge-lag-delay=#系统变量 innodb_max_purge_lag_delay范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 10000000单位 微秒 指定了当超过
innodb_max_purge_lag阈值时施加的延迟的最大延迟时间(以微秒为单位)。指定的innodb_max_purge_lag_delay值是由innodb_max_purge_lag公式计算的延迟期限的上限。更多信息,请参见第 17.8.9 节,“清除配置”。
-
innodb_max_undo_log_size命令行格式 --innodb-max-undo-log-size=#系统变量 innodb_max_undo_log_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 1073741824最小值 10485760最大值 2**64-1单位 字节 定义回滚表空间的阈值大小。如果回滚表空间超过阈值,则在启用
innodb_undo_log_truncate时可以标记为截断。默认值为 1073741824 字节(1024 MiB)。更多信息,请参见截断回滚表空间。
-
innodb_merge_threshold_set_all_debug命令行格式 --innodb-merge-threshold-set-all-debug=#系统变量 innodb_merge_threshold_set_all_debug范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 50最小值 1最大值 50定义索引页的页面满百分比值,该值覆盖当前字典缓存中当前所有索引的
MERGE_THRESHOLD设置。仅当使用WITH_DEBUGCMake选项编译调试支持时才可用此选项。有关相关信息,请参见第 17.8.11 节,“配置索引页合并阈值”。 -
innodb_monitor_disable命令行格式 --innodb-monitor-disable={counter|module|pattern|all}系统变量 innodb_monitor_disable范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 此变量充当开关,禁用
InnoDB度量计数器。可以使用信息模式INNODB_METRICS表查询计数器数据。有关使用信息,请参见第 17.15.6 节,“InnoDB INFORMATION_SCHEMA 度量表”。innodb_monitor_disable='latch'禁用SHOW ENGINE INNODB MUTEX的统计信息收集。更多信息,请参见 第 15.7.7.15 节,“SHOW ENGINE 语句”。 -
innodb_monitor_enable命令行格式 --innodb-monitor-enable={counter|module|pattern|all}系统变量 innodb_monitor_enable作用域 全局 动态 是 SET_VAR提示适用否 类型 字符串 该变量充当开关,启用
InnoDB的 度量计数器。可以使用信息模式INNODB_METRICS表查询计数器数据。有关使用信息,请参见 第 17.15.6 节,“InnoDB INFORMATION_SCHEMA Metrics Table”。innodb_monitor_enable='latch'启用统计信息收集,用于SHOW ENGINE INNODB MUTEX。更多信息,请参见 第 15.7.7.15 节,“SHOW ENGINE 语句”。 -
innodb_monitor_reset命令行格式 --innodb-monitor-reset={counter|module|pattern|all}系统变量 innodb_monitor_reset作用域 ��局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 NULL有效值 counter``module``pattern``all该变量充当开关,将
InnoDB的 度量计数器 的计数值重置为零。可以使用信息模式INNODB_METRICS表查询计数器数据。有关使用信息,请参见 第 17.15.6 节,“InnoDB INFORMATION_SCHEMA Metrics Table”。innodb_monitor_reset='latch'重置由SHOW ENGINE INNODB MUTEX报告的统计信息。更多信息,请参见 第 15.7.7.15 节,“SHOW ENGINE 语句”。 -
innodb_monitor_reset_all命令行格式 --innodb-monitor-reset-all={counter|module|pattern|all}系统变量 innodb_monitor_reset_all作用范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 NULL有效值 counter``module``pattern``all此变量充当开关,重置所有
InnoDB度量计数器的值(最小值、最大值等)。可以使用信息模式INNODB_METRICS表查询计数器数据。有关使用信息,请参见第 17.15.6 节,“InnoDB INFORMATION_SCHEMA 度量表”。 -
innodb_numa_interleave命令行格式 --innodb-numa-interleave[={OFF|ON}]系统变量 innodb_numa_interleave作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔 默认值 OFF启用 NUMA 交错内存策略以分配
InnoDB缓冲池。当启用innodb_numa_interleave时,NUMA 内存策略设置为MPOL_INTERLEAVE用于mysqld进程。分配InnoDB缓冲池后,NUMA 内存策略将恢复为MPOL_DEFAULT。要使innodb_numa_interleave选项可用,必须在启用 NUMA 的 Linux 系统上编译 MySQL。CMake根据当前平台是否支持
NUMA,设置默认WITH_NUMA值。有关更多信息,请参见第 2.8.7 节,“MySQL 源配置选项”。 -
innodb_old_blocks_pct命令行格式 --innodb-old-blocks-pct=#系统变量 innodb_old_blocks_pct作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 37最小值 5最大值 95指定用于旧块 sublist 的
InnoDB缓冲池的近似百分比。值的范围为 5 到 95。默认值为 37(即池的 3/8)。通常与innodb_old_blocks_time结合使用。更多信息,请参阅第 17.8.3.3 节,“使缓冲池具有扫描抵抗力”。有关缓冲池管理、LRU 算法和驱逐策略的信息,请参阅第 17.5.1 节,“缓冲池”。
-
innodb_old_blocks_time命令行格式 --innodb-old-blocks-time=#系统变量 innodb_old_blocks_time范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 1000最小值 0最大值 2**32-1单位 毫秒 非零值可防止缓冲池被仅在短时间内引用的数据填满,例如在全表扫描期间。增加此值可提供更多保护,防止全表扫描干扰缓冲池中缓存的数据。
指定一个块插入到旧 sublist 后,在第一次访问之后必须在那里停留多长时间(以毫秒为单位),然后才能移动到新的子列表。如果值为 0,则插入到旧子列表的块在第一次访问时立即移动到新子列表,无论插入后多久发生访问。如果值大于 0,则块保留在旧子列表中,直到第一次访问后至少经过那么多毫秒。例如,值为 1000 会导致块在第一次访问后在旧子列表中停留 1 秒,然后才能移动到新子列表。
默认值为 1000。
这个变量通常与
innodb_old_blocks_pct结合使用。更多信息,请参阅第 17.8.3.3 节,“使缓冲池具有扫描抵抗力”。有关缓冲池管理、LRU 算法和驱逐策略的信息,请参阅第 17.5.1 节,“缓冲池”。 -
innodb_online_alter_log_max_size命令行格式 --innodb-online-alter-log-max-size=#系统变量 innodb_online_alter_log_max_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 134217728最小值 65536最大值 2**64-1单位 字节 指定
InnoDB表的在线 DDL 操作期间使用的临时日志文件大小上限(以字节为单位)。每个正在创建的索引或正在更改的表都有一个这样的日志文件。此日志文件存储在 DDL 操作期间插入、更新或删除的表中的数据。临时日志文件在需要时通过innodb_sort_buffer_size的值扩展,最多扩展到innodb_online_alter_log_max_size指定的最大值。如果临时日志文件超过上限大小,ALTER TABLE操作将失败,并且所有未提交的并发 DML 操作都将被回滚。因此,此选项的较大值允许在在线 DDL 操作期间发生更多的 DML 操作,但也会延长 DDL 操作结束时表被锁定以应用日志中数据的时间。 -
innodb_open_files命令行格式 --innodb-open-files=#系统变量 innodb_open_files范围 全局 动态 (≥ 8.0.28) 是 动态 (≤ 8.0.27) 否 SET_VAR提示适用否 类型 整数 默认值 -1(表示自动调整大小;不要分配此字面值)最小值 10最大值 2147483647指定
InnoDB在同一时间内可以打开的文件的最大数量。最小值为 10。如果禁用了innodb_file_per_table,默认值为 300;否则,默认值为 300 或table_open_cache设置中的较高值。截至 MySQL 8.0.28,可以使用
SELECT innodb_set_open_files_limit(*N*)语句在运行时设置innodb_open_files限制,其中N是所需的innodb_open_files限制;例如:mysql> SELECT innodb_set_open_files_limit(1000);该语句执行一个存储过程,设置新的限制。如果过程成功,则返回新设置限制的值;否则,返回失败消息。
不允许使用
SET语句设置innodb_open_files。要在运行时设置innodb_open_files,请使用上述描述的SELECT innodb_set_open_files_limit(*N*)语句。设置
innodb_open_files=default不受支持。只允许整数值。从 MySQL 8.0.28 开始,为防止非 LRU 管理文件占用整个
innodb_open_files限制,非 LRU 管理文件限制为innodb_open_files限制的 90%,这样就为 LRU 管理文件保留了innodb_open_files限制的 10%。从 MySQL 8.0.24 到 MySQL 8.0.27,临时表空间文件不计入
innodb_open_files限制。 -
innodb_optimize_fulltext_only命令行格式 --innodb-optimize-fulltext-only[={OFF|ON}]系统变量 innodb_optimize_fulltext_only范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF改变了
OPTIMIZE TABLE在InnoDB表上的操作方式。旨在在具有FULLTEXT索引的InnoDB表的维护操作期间暂时启用。默认情况下,
OPTIMIZE TABLE重新组织表的聚簇索引中的数据。当启用此选项时,OPTIMIZE TABLE将跳过表数据的重新组织,而是处理InnoDBFULLTEXT索引中新添加、删除和更新的标记数据。更多信息,请参见优化 InnoDB 全文索引。 -
innodb_page_cleaners命令行格式 --innodb-page-cleaners=#系统变量 innodb_page_cleaners范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 4最小值 1最大值 64从缓冲池实例刷新脏页的页面清理线程数量。页面清理线程执行刷新列表和 LRU 刷新。当存在多个页面清理线程时,每个缓冲池实例的缓冲池刷新任务将分派给空闲的页面清理线程。
innodb_page_cleaners的默认值为 4。如果页面清理线程的数量超过缓冲池实例的数量,则innodb_page_cleaners会自动设置为与innodb_buffer_pool_instances相同的值。如果在将脏页从缓冲池实例刷新到数据文件时,您的工作负载受写入 IO 限制,并且系统硬件有可用容量,则增加页面清理线程的数量可能有助于提高写入 IO 吞吐量。
多线程页面清理支持扩展到关闭和恢复阶段。
setpriority()系统调用在支持的 Linux 平台上使用,在 mysqld 执行用户被授权为帮助页面刷新跟上当前工作负载而给page_cleaner线程优先级高于其他 MySQL 和InnoDB线程的情况下。setpriority()支持由此InnoDB启动消息指示:[Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().对于不由 systemd 管理服务器启动和关闭的系统,可以在
/etc/security/limits.conf中配置 mysqld 执行用户授权。例如,如果 mysqld 在mysql用户下运行,则可以通过将以下行添加到/etc/security/limits.conf来授权mysql用户:mysql hard nice -20 mysql soft nice -20对于由 systemd 管理的系统,可以通过在本地化 systemd 配置文件中指定
LimitNICE=-20来实现相同的效果。例如,在/etc/systemd/system/mysqld.service.d/override.conf中创建一个名为override.conf的文件,并添加以下条目:[Service] LimitNICE=-20创建或更改
override.conf后,重新加载 systemd 配置,然后告诉 systemd 重新启动 MySQL 服务:systemctl daemon-reload systemctl restart mysqld # RPM platforms systemctl restart mysql # Debian platforms有关使用本地化 systemd 配置文件的更多信息,请参见为 MySQL 配置 systemd。
授权 mysqld 执行用户后,使用 cat 命令验证 mysqld 进程配置的
Nice限制:$> cat /proc/*mysqld_pid*/limits | grep nice Max nice priority 18446744073709551596 18446744073709551596 -
innodb_page_size命令行格式 --innodb-page-size=#系统变量 innodb_page_size范围 全局 动态 否 SET_VAR提示适用否 类型 枚举 默认值 16384有效值 4096``8192``16384``32768``65536指定
InnoDB表空间的页面大小。值可以以字节或千字节为单位指定。例如,可以将 16KB 页面大小值指定为 16384、16KB 或 16k。innodb_page_size只能在初始化 MySQL 实例之前配置,之后不能更改。如果未指定任何值,则实例将使用默认页面大小进行初始化。请参阅第 17.8.1 节,“InnoDB 启动配置”。对于 32KB 和 64KB 页面大小,最大行长度约为 16000 字节。当
innodb_page_size设置为 32KB 或 64KB 时,不支持ROW_FORMAT=COMPRESSED。对于innodb_page_size=32KB,扩展大小为 2MB。对于innodb_page_size=64KB,扩展大小为 4MB。在使用 32KB 或 64KB 页面大小时,innodb_log_buffer_size应至少设置为 16M(默认值)。默认的 16KB 页面大小或更大适用于各种工作负载,特别是涉及表扫描和涉及大量更新的 DML 操作的查询。较小的页面大小可能对涉及许多小写入的 OLTP 工作负载更有效,当单个页面包含许多行时,争用可能是一个问题。较小的页面在通常使用小块大小的 SSD 存储设备上也可能更有效。保持
InnoDB页面大小接近存储设备块大小可以最大程度地减少被重写到磁盘的未更改数据量。第一个系统表空间数据文件(
ibdata1)的最小文件大小取决于innodb_page_size值。有关更多信息,请参阅innodb_data_file_path选项描述。使用特定
InnoDB页面大小的 MySQL 实例不能使用来自使用不同页面大小的实例的数据文件或日志文件。有关一般 I/O 调优建议,请参阅第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_parallel_read_threads命令行格式 --innodb-parallel-read-threads=#引入 8.0.14 系统变量 innodb_parallel_read_threads作用范围 会话 动态 是 SET_VARHint Applies否 类型 整数 默认值 4最小值 1最大值 256定义可用于并行集群索引读取的线程数。截至 MySQL 8.0.17 版本,支持对分区进行并行扫描。并行读取线程可以提高
CHECK TABLE性能。InnoDB在CHECK TABLE操作期间两次读取聚簇索引。第二次读取可以并行执行。此功能不适用于二级索引扫描。必须将innodb_parallel_read_threads会话变量设置为大于 1 的值,才能进行并行集群索引读取。执行并行集群索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树数量决定,取两者中较小的值。扫描期间读取到缓冲池的页面保持在缓冲池 LRU 列表的尾部,以便在需要空闲缓冲池页面时可以快速丢弃它们。截至 MySQL 8.0.17 版本,最大并行读取线程数(256)是所有客户端连接的总线程数。如果达到线程限制,连接将回退到使用单个线程。
-
innodb_print_all_deadlocks命令行格式 --innodb-print-all-deadlocks[={OFF|ON}]系统变量 innodb_print_all_deadlocks作用范围 全局 动态 是 SET_VARHint Applies否 类型 布尔值 默认值 OFF当启用此选项时,
InnoDB用户事务中所有 死锁 的信息都记录在mysqld错误日志 中。否则,您只会看到关于最后一个死锁的信息,使用SHOW ENGINE INNODB STATUS命令。偶尔的InnoDB死锁并不一定是问题,因为InnoDB立即检测到条件并自动回滚其中一个事务。如果应用程序没有适当的错误处理逻辑来检测回滚并重试其操作,您可能会使用此选项来排除死锁发生的原因。大量的死锁可能表明需要重新构造为多个表发出 DML 或SELECT ... FOR UPDATE语句的事务,以便每个事务以相同顺序访问表,从而避免死锁条件。有关更多信息,请参见 第 17.7.5 节,“InnoDB 中的死锁”。
-
innodb_print_ddl_logs命令行格式 --innodb-print-ddl-logs[={OFF|ON}]系统变量 innodb_print_ddl_logs范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF启用此选项会导致 MySQL 将 DDL 日志写入
stderr。更多信息,请参见 查看 DDL 日志。 -
innodb_purge_batch_size命令行格式 --innodb-purge-batch-size=#系统变量 innodb_purge_batch_size范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 300最小值 1最大值 5000定义了一批从 历史列表 中解析和处理的撤销日志页数。在多线程清除配置中,协调员清除线程将
innodb_purge_batch_size除以innodb_purge_threads,并将该数量的页分配给每个清除线程。innodb_purge_batch_size变量还定义了清除在通过撤销日志的每 128 次迭代后释放的撤销日志页数。innodb_purge_batch_size选项旨在与innodb_purge_threads设置结合进行高级性能调优。大多数用户不需要更改innodb_purge_batch_size的默认值。有关更多信息,请参见 第 17.8.9 节,“清除配置”。
-
innodb_purge_threads命令行格式 --innodb-purge-threads=#系统变量 innodb_purge_threads范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 4最小值 1最大值 32专用于
InnoDB清除 操作的后台线程数。增加该值会创建额外的清除线程,可以提高在执行多个表的 DML 操作的系统上的效率。有关更多信息,请参见 第 17.8.9 节,“清除配置”。
-
innodb_purge_rseg_truncate_frequency命令行格式 --innodb-purge-rseg-truncate-frequency=#系统变量 innodb_purge_rseg_truncate_frequency范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 128最小值 1最大值 128定义清除系统释放回滚段的频率,以调用清除的次数来衡量。在回滚段被释放之前,无法截断撤消表空间。通常,清除系统每调用 128 次就会释放一次回滚段。默认值为 128。减少此值会增加清除线程释放回滚段的频率。
innodb_purge_rseg_truncate_frequency旨在与innodb_undo_log_truncate一起使用。有关更多信息,请参见 截断撤消表空间。 -
innodb_random_read_ahead命令行格式 --innodb-random-read-ahead[={OFF|ON}]系统变量 innodb_random_read_ahead范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 关闭启用随机预读技术,优化
InnoDBI/O。有关不同类型预读请求的性能考虑的详细信息,请参见第 17.8.3.4 节,“配置 InnoDB 缓冲池预取(预读)”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_read_ahead_threshold命令行格式 --innodb-read-ahead-threshold=#系统变量 innodb_read_ahead_threshold范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 56最小值 0最大值 64控制
InnoDB用于预取页面到缓冲池的线性预读的灵敏度。如果InnoDB按顺序从一个 extent(64 页)中至少读取innodb_read_ahead_threshold页,它将启动对整个后续 extent 的异步读取。允许的值范围是 0 到 64。值为 0 表示禁用预读。对于默认值 56,InnoDB必须按顺序从一个 extent 中至少读取 56 页,才能启动对后续 extent 的异步读取。了解通过预读机制读取了多少页面,以及这些页面中有多少被从缓冲池中驱逐而从未被访问,对于微调
innodb_read_ahead_threshold设置可能是有用的。SHOW ENGINE INNODB STATUS输出显示了来自Innodb_buffer_pool_read_ahead和Innodb_buffer_pool_read_ahead_evicted全局状态变量的计数器信息,这些变量报告了通过预读请求带入缓冲池的页面数,以及这些页面从未被访问而从缓冲池中驱逐的页面数。这些状态变量报告自上次服务器重启以来的全局值。SHOW ENGINE INNODB STATUS还显示了预读页面的读取速率以及这些页面被驱逐而没有被访问的速率。每秒平均值基于自上次调用SHOW ENGINE INNODB STATUS以来收集的统计数据,并显示在SHOW ENGINE INNODB STATUS输出的BUFFER POOL AND MEMORY部分。更多信息,请参见第 17.8.3.4 节,“配置 InnoDB 缓冲池预取(预读)”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
-
innodb_read_io_threads命令行格式 --innodb-read-io-threads=#系统变量 innodb_read_io_threads范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 4最小值 1最大值 64用于
InnoDB读操作的 I/O 线程数。其写线程的对应项是innodb_write_io_threads。有关更多信息,请参见第 17.8.5 节,“配置后台 InnoDB I/O 线程数”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。注意
在 Linux 系统上,使用默认设置的
innodb_read_io_threads、innodb_write_io_threads和 Linux 的aio-max-nr设置运行多个 MySQL 服务器(通常超过 12 个)可能超出系统限制。理想情况下,增加aio-max-nr设置;作为解决方法,您可以减少一个或两个 MySQL 变量的设置。 -
innodb_read_only命令行格式 --innodb-read-only[={OFF|ON}]系统变量 innodb_read_only范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFF以只读模式启动
InnoDB。用于在只读媒体上分发数据库应用程序或数据集。也可用于数据仓库,在多个实例之间共享相同的数据目录。有关更多信息,请参见第 17.8.2 节,“配置 InnoDB 进行只读操作”。以前,启用
innodb_read_only系统变量仅阻止了InnoDB存储引擎的表的创建和删除。从 MySQL 8.0 开始,启用innodb_read_only将阻止所有存储引擎的这些操作。任何存储引擎的表创建和删除操作都会修改mysql系统数据库中的数据字典表,但这些表使用InnoDB存储引擎,在启用innodb_read_only时无法修改。同样的原则也适用于其他需要修改数据字典表的表操作。例如:-
如果启用了
innodb_read_only系统变量,ANALYZE TABLE可能会失败,因为它无法更新使用InnoDB的数据字典中的统计表。对于更新键分布的ANALYZE TABLE操作,即使操作更新了表本身(例如,如果它是一个MyISAM表),也可能会发生失败。要获取更新后的分布统计信息,请设置information_schema_stats_expiry=0。 -
ALTER TABLE *tbl_name* ENGINE=*engine_name*失败,因为它更新了存储引擎的指定,这些信息存储在数据字典中。
此外,MySQL 8.0 中
mysql系统数据库中的其他表使用InnoDB存储引擎。将这些表设置为只读会导致修改它们的操作受到限制。例如:-
帐户管理语句,如
CREATE USER和GRANT失败,因为授权表使用了InnoDB。 -
INSTALL PLUGIN和UNINSTALL PLUGIN插件管理语句失败,因为mysql.plugin系统表使用了InnoDB。 -
CREATE FUNCTION和DROP FUNCTION可加载函数管理语句失败,因为mysql.func系统表使用了InnoDB。
-
-
innodb_redo_log_archive_dirs命令行格式 --innodb-redo-log-archive-dirs引入 8.0.17 系统变量 innodb_redo_log_archive_dirs范围 全局 动态 是 SET_VAR提示适用否 类型 字符串 默认值 NULL定义标记目录,可以在其中创建重做日志归档文件。您可以在分号分隔的列表中定义多个标记目录。例如:
innodb_redo_log_archive_dirs='label1:/backups1;label2:/backups2'标签可以是任意字符的字符串,但不允许使用冒号(:)。空标签也是允许的,但在这种情况下仍然需要冒号(:)。
必须指定路径,并且目录必须存在。路径可以包含冒号(':'),但不允许使用分号(;)。
-
innodb_redo_log_capacity命令行格式 --innodb-redo-log-capacity=#引入 8.0.30 系统变量 innodb_redo_log_capacity范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 104857600最小值 8388608最大值 (≥ 8.0.34) 549755813888最大值 (≥ 8.0.30, ≤ 8.0.33) 137438953472单位 字节 定义重做日志文件占用的磁盘空间量。
此变量取代了
innodb_log_files_in_group和innodb_log_file_size变量。当定义了innodb_redo_log_capacity设置时,innodb_log_files_in_group和innodb_log_file_size设置将被忽略;否则,这些设置将用于计算innodb_redo_log_capacity设置(innodb_log_files_in_group*innodb_log_file_size=innodb_redo_log_capacity)。如果没有设置这些变量中的任何一个,重做日志容量将设置为innodb_redo_log_capacity的默认值。有关更多信息,请参见第 17.6.5 节,“重做日志”。
-
innodb_redo_log_encrypt命令行格式 --innodb-redo-log-encrypt[={OFF|ON}]系统变量 innodb_redo_log_encrypt作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF控制使用
InnoDB数据静态加密功能加密的表的重做日志数据的加密。默认情况下,重做日志数据的加密是禁用的。有关更多信息,请参见重做日志加密。 -
innodb_replication_delay命令行格式 --innodb-replication-delay=#系统变量 innodb_replication_delay作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 4294967295单位 毫秒 如果达到
innodb_thread_concurrency时,在副本服务器上的复制线程延迟���以毫秒为单位)。 -
innodb_rollback_on_timeout命令行格式 --innodb-rollback-on-timeout[={OFF|ON}]系统变量 innodb_rollback_on_timeout作用范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 OFFInnoDB默认仅在事务超时时回滚最后一个语句。如果指定了--innodb-rollback-on-timeout,事务超时会导致InnoDB中止并回滚整个事务。更多信息,请参见 第 17.21.5 节,“InnoDB 错误处理”。
-
innodb_rollback_segments命令行格式 --innodb-rollback-segments=#系统变量 innodb_rollback_segments作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 128最小值 1最大值 128innodb_rollback_segments定义了分配给每个撤消表空间和生成撤消记录的全局临时表空间的撤消段数量。每个撤消段支持的事务数量取决于InnoDB页大小和分配给每个事务的撤消日志数量。更多信息,请参见 第 17.6.6 节,“撤消日志”。相关信息,请参见 第 17.3 节,“InnoDB 多版本”。有关撤消表空间的信息,请参见 第 17.6.3.4 节,“撤消表空间”。
-
innodb_saved_page_number_debug命令行格式 --innodb-saved-page-number-debug=#系统变量 innodb_saved_page_number_debug作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 2**32-1保存一个页面编号。设置
innodb_fil_make_page_dirty_debug选项会使由innodb_saved_page_number_debug定义的页面变脏。只有在使用WITH_DEBUGCMake 选项编译支持调试时,才能使用innodb_saved_page_number_debug选项。 -
innodb_segment_reserve_factor命令行格式 --innodb-segment-reserve-factor=#引入版本 8.0.26 系统变量 innodb_segment_reserve_factor范围 全局 动态 是 SET_VAR提示适用否 类型 数值 默认值 12.5最小值 0.03最大值 40定义表空间文件段页面保留为空页面的百分比。该设置适用于每表文件和通用表空间。
innodb_segment_reserve_factor默认设置为 12.5%,这与之前的 MySQL 版本中保留的页面百分比相同。更多信息,请参阅配置保留文件段页面的百分比。
-
innodb_sort_buffer_size命令行格式 --innodb-sort-buffer-size=#系统变量 innodb_sort_buffer_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 1048576最小值 65536最大值 67108864单位 字节 此变量定义:
-
用于创建或重建二级索引的在线 DDL 操作的排序缓冲区大小。然而,从 MySQL 8.0.27 开始,这一责任被
innodb_ddl_buffer_size变量所取代。 -
在在线 DDL 操作期间记录并发 DML 时,临时日志文件扩展的量,以及临时日志文件读缓冲区和写缓冲区的大小。
有关更多信息,请参阅第 17.12.3 节,“在线 DDL 空间要求”。
-
-
innodb_spin_wait_delay命令行格式 --innodb-spin-wait-delay=#系统变量 innodb_spin_wait_delay范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 6最小值 0最大值(64 位平台,≤ 8.0.13) 2**64-1最大值(32 位平台,≤ 8.0.13) 2**32-1最大值(≥ 8.0.14) 1000自旋锁之间轮询的最大延迟。此机制的底层实现因硬件和操作系统的组合而异,因此延迟不对应固定的时间间隔。
可与
innodb_spin_wait_pause_multiplier变量结合使用,以更好地控制自旋锁轮询延迟的持续时间。更多信息,请参阅��17.8.8 节,“配置自旋锁轮询”。
-
innodb_spin_wait_pause_multiplier命令行格式 --innodb-spin-wait-pause-multiplier=#引入版本 8.0.16 系统变量 innodb_spin_wait_pause_multiplier范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 50最小值 0最大值 100定义一个乘数值,用于确定线程在等待获取互斥锁或读写锁时发生自旋等待循环中的 PAUSE 指令数量。
更多信息,请参阅第 17.8.8 节,“配置自旋锁轮询”。
-
innodb_stats_auto_recalc命令行格式 --innodb-stats-auto-recalc[={OFF|ON}]系统变量 innodb_stats_auto_recalc范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON导致
InnoDB在表中的数据发生重大更改后自动重新计算持久性统计信息。阈值为表中行数的 10%。此设置适用于启用innodb_stats_persistent选项时创建的表。还可以通过在CREATE TABLE或ALTER TABLE语句中指定STATS_PERSISTENT=1来配置自动统计信息重新计算。用于生成统计信息的采样数据量由innodb_stats_persistent_sample_pages变量控制。更多信息,请参阅第 17.8.10.1 节,“配置持久性优化器统计参数”。
-
innodb_stats_include_delete_marked命令行格式 --innodb-stats-include-delete-marked[={OFF|ON}]系统变量 innodb_stats_include_delete_marked范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF默认情况下,
InnoDB在计算统计信息时读取未提交的数据。在未提交事务删除表中的行的情况下,InnoDB在计算行估计和索引统计信息时排除了被标记为删除的记录,这可能导致其他使用事务隔离级别为READ UNCOMMITTED并发操作表的事务执行计划不佳。为避免这种情况,可以启用innodb_stats_include_delete_marked以确保InnoDB在计算持久优化器统计信息时包括被标记为删除的记录。当启用
innodb_stats_include_delete_marked时,ANALYZE TABLE在重新计算统计信息时考虑了删除标记记录。innodb_stats_include_delete_marked是一个影响所有InnoDB表的全局设置。仅适用于持久优化器统计信息。有关相关信息,请参阅第 17.8.10.1 节,“配置持久优化器统计参数”。
-
innodb_stats_method命令行格式 --innodb-stats-method=value系统变量 innodb_stats_method范围 全局 动态 是 SET_VAR提示适用否 类型 枚举 默认值 nulls_equal有效取值 nulls_equal``nulls_unequal``nulls_ignored服务器在收集关于
InnoDB表索引值分布的统计信息时如何处理NULL值。允许的取值为nulls_equal、nulls_unequal和nulls_ignored。对于nulls_equal,所有NULL索引值被视为相等,并形成一个大小等于NULL值数量的值组。对于nulls_unequal,NULL值被视为不相等,每个NULL形成一个大小为 1 的独立值组。对于nulls_ignored,NULL值被忽略。生成表统计信息的方法会影响优化器选择查询执行时使用的索引,详见第 10.3.8 节,“InnoDB 和 MyISAM 索引统计信息收集”。
-
innodb_stats_on_metadata命令行格式 --innodb-stats-on-metadata[={OFF|ON}]系统变量 innodb_stats_on_metadata范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF此选项仅在优化器统计信息配置为非持久性时适用。当禁用
innodb_stats_persistent或使用STATS_PERSISTENT=0创建或更改单个表时,优化器统计信息不会持久保存到磁盘。有关更多信息,请参阅第 17.8.10.2 节,“配置非持久性优化器统计参数”。当启用
innodb_stats_on_metadata时,InnoDB在元数据语句(如SHOW TABLE STATUS)或访问信息模式TABLES或STATISTICS表时更新非持久性统计信息。(这些更新类似于ANALYZE TABLE的操作。)禁用时,InnoDB在这些操作期间不会更新统计信息。保持禁用设置可以提高对具有大量表或索引的模式的访问速度。它还可以改善涉及InnoDB表的查询的执行计划的稳定性。要更改设置,请发出语句
SET GLOBAL innodb_stats_on_metadata=*mode*,其中*mode*为ON或OFF(或1或0)。更改设置需要足够设置全局系统变量的权限(请参阅第 7.1.9.1 节,“系统变量权限”),并立即影响所有连接的操作。 -
innodb_stats_persistent命令行格式 --innodb-stats-persistent[={OFF|ON}]系统变量 innodb_stats_persistent范围 全局 动态 是 SET_VAR提示适用否 类型 布尔 默认值 ON指定
InnoDB索引统计信息是否持久化到磁盘。否则,统计信息可能会经常重新计算,这可能导致查询执行计划的变化。此设置在创建表时与每个表一起存储。您可以在创建表之前在全局级别设置innodb_stats_persistent,或者使用CREATE TABLE和ALTER TABLE语句的STATS_PERSISTENT子句覆盖系统级设置,并为单个表配置持久性统计信息。更多信息,请参阅 第 17.8.10.1 节,“配置持久性优化器统计参数”。
-
innodb_stats_persistent_sample_pages命令行格式 --innodb-stats-persistent-sample-pages=#系统变量 innodb_stats_persistent_sample_pages范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 20最小值 1最大值 18446744073709551615用于估算索引列的基数和其他统计信息的索引页的数量,例如
ANALYZE TABLE计算的那些。增加该值可以提高索引统计信息的准确性,从而可以改善查询执行计划,但会增加执行ANALYZE TABLE时InnoDB表的 I/O 开销。更多信息,请参阅 第 17.8.10.1 节,“配置持久性优化器统计参数”。注意
为
innodb_stats_persistent_sample_pages设置一个较高的值可能导致ANALYZE TABLE执行时间过长。要估算ANALYZE TABLE访问的数据库页数,请参见 Section 17.8.10.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”。当为表启用
innodb_stats_persistent时,innodb_stats_persistent_sample_pages才适用;当禁用innodb_stats_persistent时,将使用innodb_stats_transient_sample_pages。 -
innodb_stats_transient_sample_pages命令行格式 --innodb-stats-transient-sample-pages=#系统变量 innodb_stats_transient_sample_pages范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 8最小值 1最大值 18446744073709551615在估算索引列的基数和其他统计信息时要采样的索引页数,例如通过
ANALYZE TABLE计算的那些。默认值为 8。增加该值可以提高索引统计信息的准确性,从而改善查询执行计划,但会增加打开InnoDB表或重新计算统计信息时的 I/O。有关更多信息,请参见 Section 17.8.10.2, “Configuring Non-Persistent Optimizer Statistics Parameters”。注意
为
innodb_stats_transient_sample_pages设置一个较高的值可能导致ANALYZE TABLE执行时间过长。要估算ANALYZE TABLE访问的数据库页数,请参见 Section 17.8.10.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”。innodb_stats_transient_sample_pages仅在为表禁用innodb_stats_persistent时适用;当启用innodb_stats_persistent时,将使用innodb_stats_persistent_sample_pages。取代innodb_stats_sample_pages。更多信息,请参见第 17.8.10.2 节,“配置非持久性优化器统计参数”。 -
innodb_status_output命令行格式 `--innodb-status-output[={OFF ON}]` 系统变量 innodb_status_output范围 全局 动态 是 SET_VAR提示适用否 类型 布尔 默认值 OFF启用或禁用标准
InnoDB监视器的定期输出。也与innodb_status_output_locks结合使用,以启用或禁用InnoDB锁监视器的定期输出。更多信息,请参见第 17.17.2 节,“启用 InnoDB 监视器”。 -
innodb_status_output_locks命令行格式 `--innodb-status-output-locks[={OFF ON}]` 系统变量 innodb_status_output_locks范围 全局 动态 是 SET_VAR提示适用否 类型 布尔 默认值 OFF启用或禁用
InnoDB锁监视器。启用后,InnoDB锁监视器会在SHOW ENGINE INNODB STATUS输出和定期输出中打印有关锁的附加信息,并在 MySQL 错误日志中打印。InnoDB锁监视器的定期输出作为标准InnoDB监视器输出的一部分打印。因此,必须启用标准InnoDB监视器,InnoDB锁监视器才能定期将数据打印到 MySQL 错误日志中。更多信息,请参见第 17.17.2 节,“启用 InnoDB 监视器”。 -
innodb_strict_mode命令行格式 `--innodb-strict-mode[={OFF ON}]` 系统变量 innodb_strict_mode范围 全局,会话 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON当启用
innodb_strict_mode时,InnoDB在检查无效或不兼容表选项时返回错误而不是警告。它检查
KEY_BLOCK_SIZE、ROW_FORMAT、DATA DIRECTORY、TEMPORARY和TABLESPACE选项是否与彼此和其他设置兼容。innodb_strict_mode=ON还在创建或更改表时启用行大小检查,以防止由于记录对所选页面大小过大而导致INSERT或UPDATE失败。您可以在启动mysqld时在命令行上启用或禁用innodb_strict_mode,或者在 MySQL 配置文件中启用或禁用innodb_strict_mode。您还可以使用语句SET [GLOBAL|SESSION] innodb_strict_mode=mode在运行时启用或禁用innodb_strict_mode,其中mode为ON或OFF。更改GLOBAL设置需要具有足够权限设置全局系统变量的权限(请参阅 Section 7.1.9.1, “系统变量权限”),并影响随后连接的所有客户端的操作。任何客户端都可以更改innodb_strict_mode的SESSION设置,该设置仅影响该客户端。从 MySQL 8.0.26 开始,设置此系统变量的会话值是受限制的操作。会话用户必须具有足够的权限来设置受限制的会话变量。请参阅 Section 7.1.9.1, “系统变量权限”。 -
innodb_sync_array_size| 命令行格式 |--innodb-sync-array-size=#` |系统变量 innodb_sync_array_size范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 1最小值 1最大值 1024定义互斥锁/锁等待数组的大小。增加该值会分割用于协调线程的内部数据结构,以提高在具有大量等待线程的工作负载中的并发性。必须在 MySQL 实例启动时配置此设置,之后无法更改。建议增加该值以适应频繁产生大量等待线程的工作负载,通常大于 768 个。`
-
innodb_sync_spin_loops| 命令行格式 |--innodb-sync-spin-loops=#` |System Variable innodb_sync_spin_loopsScope Global Dynamic Yes SET_VARHint AppliesNo Type Integer Default Value 30Minimum Value 0Maximum Value 4294967295线程等待
InnoDB互斥锁被释放的次数,超过后线程将被挂起。 -
innodb_sync_debug| Command-Line Format |--innodb-sync-debug[={OFF|ON}]` |System Variable innodb_sync_debugScope Global Dynamic No SET_VARHint AppliesNo Type Boolean Default Value OFF启用
InnoDB存储引擎的同步调试检查。此选项仅在使用WITH_DEBUGCMake选项编译时才可用。 -
innodb_table_locks| Command-Line Format |--innodb-table-locks[={OFF|ON}]` |System Variable innodb_table_locksScope Global, Session Dynamic Yes SET_VARHint AppliesNo Type Boolean Default Value ON如果
autocommit = 0,InnoDB会遵守LOCK TABLES;MySQL 在LOCK TABLES ... WRITE直到所有其他线程都释放对表的锁之前不会返回。innodb_table_locks的默认值为 1,这意味着LOCK TABLES会导致 InnoDB 在autocommit = 0时内部锁定表。innodb_table_locks = 0对使用LOCK TABLES ... WRITE显式锁定的表没有影响。但对通过触发器隐式锁定的表或通过LOCK TABLES ... READ读写锁定的表有影响。有关更多信息,请参见第 17.7 节,“InnoDB 锁定和事务模型”。
-
innodb_temp_data_file_path| Command-Line Format |--innodb-temp-data-file-path=file_name` |系统变量 innodb_temp_data_file_path范围 全局 动态 否 SET_VAR提示适用否 类型 字符串 默认值 ibtmp1:12M:autoextend定义全局临时表空间数据文件的相对路径、名称、大小和属性。全局临时表空间存储对用户创建的临时表所做更改的回滚段。
如果未为
innodb_temp_data_file_path指定任何值,则默认行为是在innodb_data_home_dir目录中创建一个名为ibtmp1的单个自动扩展数据文件。初始文件大小略大于 12MB。全局临时表空间数据文件规范的语法包括文件名、文件大小以及
autoextend和max属性���*file_name*:*file_size*[:autoextend[:max:*max_file_size*]]全局临时表空间数据文件的名称不能与另一个
InnoDB数据文件相同。任何无法创建全局临时表空间数据文件或出现错误的情况都被视为致命,服务器启动将被拒绝。文件大小通过在大小值后附加
K、M或G来指定为 KB、MB 或 GB。文件大小之和必须略大于 12MB。单个文件的大小限制由操作系统确定。在支持大文件的操作系统上,文件大小可以超过 4GB。不支持使用原始磁盘分区用于全局临时表空间数据文件。
autoextend和max属性只能用于在innodb_temp_data_file_path设置中指定的最后一个数据文件。例如:[mysqld] innodb_temp_data_file_path=ibtmp1:50M;ibtmp2:12M:autoextend:max:500Mautoextend选项会在数据文件用尽空间时自动增加大小。autoextend增量默认为 64MB。要修改增量,请更改innodb_autoextend_increment变量设置。全局临时表空间数据文件的目录路径是通过连接由
innodb_data_home_dir和innodb_temp_data_file_path定义的路径形成的。在以只读模式运行
InnoDB之前,将innodb_temp_data_file_path设置为数据目录之外的位置。路径必须相对于数据目录。例如:--innodb-temp-data-file-path=../../../tmp/ibtmp1:12M:autoextend有关更多信息,请参阅 全局临时表空间。`
-
innodb_temp_tablespaces_dir| 命令行格式 |--innodb-temp-tablespaces-dir=dir_name` |引入版本 8.0.13 系统变量 innodb_temp_tablespaces_dir范围 全局 Dynamic No SET_VARHint AppliesNo 类型 目录名称 Default Value #innodb_temp定义
InnoDB在启动时创建会话临时表空间池的位置。默认位置是数据目录中的#innodb_temp目录。允许使用完全限定路径或相对于数据目录的路径。截至 MySQL 8.0.16,会话临时表空间始终存储用户创建的临时表和使用
InnoDB创建的优化器内部临时表。(以前,内部临时表的磁盘存储引擎由不再支持的internal_tmp_disk_storage_engine系统变量确定。请参阅磁盘内部临时表的存储引擎。)更多信息,请参阅会话临时表空间。
-
innodb_thread_concurrency| 命令行格式 |--innodb-thread-concurrency=#` |系统变量 innodb_thread_concurrencyScope Global 动态 是 SET_VARHint AppliesNo 类型 整数 Default Value 0最小值 0最大值 1000定义
InnoDB内允许的最大线程数。值为 0(默认值)被解释为无限并发(无限制)。此变量旨在用于高并发系统的性能调优。InnoDB试图保持InnoDB内部线程的数量小于或等于innodb_thread_concurrency限制。等待锁的线程不计入并发执行线程数。正确的设置取决于工作负载和计算环境。如果你的 MySQL 实例与其他应用程序共享 CPU 资源,或者你的工作负载或并发用户数量正在增加,考虑设置这个变量。测试一系列值以确定提供最佳性能的设置。
innodb_thread_concurrency是一个动态变量,允许在实时测试系统上尝试不同的设置。如果某个设置表现不佳,你可以快速将innodb_thread_concurrency设置回 0。使用以下准则来帮助找到并保持适当的设置:
-
如果工作负载的并发用户线程数量始终很少且不影响性能,设置
innodb_thread_concurrency=0(无限制)。 -
如果你的工作负载始终很重或偶尔会出现峰值,设置一个
innodb_thread_concurrency值,并调整直到找到提供最佳性能的线程数量。例如,假设你的系统通常有 40 到 50 个用户,但有时用户数量增加到 60、70 或更多。通过测试,你发现限制为 80 个并发用户时性能基本稳定。在这种情况下,将innodb_thread_concurrency设置为 80。 -
如果你不希望
InnoDB为用户线程使用超过一定数量的虚拟 CPU(例如 20 个虚拟 CPU),将innodb_thread_concurrency设置为这个数字(或根据性能测试可能更低)。如果你的目标是将 MySQL 与其他应用程序隔离开来,考虑将mysqld进程专门绑定到虚拟 CPU。然而,请注意,独占绑定可能导致硬件使用不佳,如果mysqld进程没有持续繁忙。在这种情况下,你可以将mysqld进程绑定到虚拟 CPU,但允许其他应用程序使用部分或全部虚拟 CPU。注意
从操作系统的角度来看,使用资源管理解决方案来管理 CPU 时间在应用程序之间的共享可能比绑定
mysqld进程更可取。例如,你可以在其他关键进程不运行时将 90% 的虚拟 CPU 时间分配给特定应用程序,而在其他关键进程运行时将该值缩减到 40%。 -
在某些情况下,最佳的
innodb_thread_concurrency设置可能小于虚拟 CPU 的数量。 -
如果
innodb_thread_concurrency值过高,可能会导致性能下降,因为系统内部和资源的争用增加。 -
定期监视和分析您的系统。工作负载、用户数量或计算环境的变化可能需要您调整
innodb_thread_concurrency设置。
值为 0 会禁用
SHOW ENGINE INNODB STATUS输出中ROW OPERATIONS部分的InnoDB内部查询和队列中查询计数器。有关更多信息,请参阅第 17.8.4 节,“配置 InnoDB 的线程并发性”。
-
-
innodb_thread_sleep_delay| 命令行格式 |--innodb-thread-sleep-delay=#` |系统变量 innodb_thread_sleep_delay作用范围 全局 动态 是 SET_VARHint Applies否 类型 整数 默认值 10000最小值 0最大值 1000000单位 微秒 InnoDB线程在加入InnoDB队列之前睡眠的时间,单位为微秒。默认值为 10000。值为 0 会禁用睡眠。您可以将innodb_adaptive_max_sleep_delay设置为允许的最高值,以供innodb_thread_sleep_delay使用,InnoDB会根据当前线程调度活动自动调整innodb_thread_sleep_delay的值,以适应系统轻载或接近满负荷运行时的情况,这种动态调整有助于线程调度机制在系统轻载或接近满负荷运行时平稳工作。有关更多信息,请参阅第 17.8.4 节,“配置 InnoDB 的线程并发性”。
-
innodb_tmpdir| 命令行格式 |--innodb-tmpdir=dir_name` |系统变量 innodb_tmpdir作用范围 全局,会话 动态 是 SET_VARHint Applies否 类型 目录名称 默认值 NULL用于定义在线
ALTER TABLE操作重建表时创建的临时排序文件的替代目录。在线
ALTER TABLE操作重建表时,还会在与原始表相同目录中创建一个中间表文件。innodb_tmpdir选项不适用于中间表文件。有效值是除 MySQL 数据目录路径之外的任何目录路径。如果值为 NULL(默认值),则临时文件将在 MySQL 临时目录(Unix 上的
$TMPDIR,Windows 上的%TEMP%,或由--tmpdir配置选项指定的目录)中创建。如果指定了目录,则仅在使用SET语句配置innodb_tmpdir时才检查目录的存在和权限。如果在目录字符串中提供了符号链接,则符号链接将被解析并存储为绝对路径。路径不应超过 512 字节。如果将innodb_tmpdir设置为无效目录,则在线ALTER TABLE操作将报告错误。innodb_tmpdir覆盖了 MySQL 的tmpdir设置,但仅适用于在线ALTER TABLE操作。配置
innodb_tmpdir需要FILE权限。innodb_tmpdir选项的引入是为了帮助避免在tmpfs文件系统上的临时文件目录溢出。这种溢出可能是由在线ALTER TABLE操作中创建的大型临时排序文件导致的,这些操作会重建表。在复制环境中,只有当所有服务器具有相同的操作系统环境时,才考虑复制
innodb_tmpdir设置。否则,在运行重建表的在线ALTER TABLE操作时,复制innodb_tmpdir设置可能导致复制失败。如果服务器操作环境不同,建议在每台服务器上单独配置innodb_tmpdir。更多信息,请参见第 17.12.3 节,“在线 DDL 空间要求”。有关在线
ALTER TABLE操作的信息,请参见第 17.12 节,“InnoDB 和在线 DDL”。 -
innodb_trx_purge_view_update_only_debug| 命令行格式 |--innodb-trx-purge-view-update-only-debug[={OFF|ON}]` |系统变量 innodb_trx_purge_view_update_only_debug范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF暂停删除标记记录的清除,同时允许更新清除视图。此选项人为地创建了一种情况,即清除视图已更新但尚未执行清除。此选项仅在使用
WITH_DEBUGCMake选项编译时才可用。 -
innodb_trx_rseg_n_slots_debug| 命令行格式 |
--innodb-trx-rseg-n-slots-debug=#|系统变量 innodb_trx_rseg_n_slots_debug作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 0最小值 0最大值 1024设置一个调试标志,将
TRX_RSEG_N_SLOTS限制为trx_rsegf_undo_find_free函数中查找撤销日志段的空闲槽位的给定值。此选项仅在使用WITH_DEBUGCMake选项编译时才可用。 -
innodb_undo_directory| 命令行格式 |
--innodb-undo-directory=dir_name|系统变量 innodb_undo_directory作用范围 全局 动态 否 SET_VAR提示适用否 类型 目录名称 InnoDB创建撤销表空间的路径。通常用于将撤销表空间放置在不同的存储设备上。没有默认值(为 NULL)。如果未定义
innodb_undo_directory变量,则撤销表空间将在数据目录中创建。MySQL 实例初始化时创建的默认撤销表空间(
innodb_undo_001和innodb_undo_002)始终驻留在由innodb_undo_directory变量定义的目录中。使用
CREATE UNDO TABLESPACE语法创建的撤销表空间将在由innodb_undo_directory变量定义的目录中创建,如果没有指定不同的路径。更多信息,请参阅第 17.6.3.4 节,“撤销表空间”。
-
innodb_undo_log_encrypt| 命令行格式 |
--innodb-undo-log-encrypt[={OFF|ON}]|系统变量 innodb_undo_log_encrypt作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF控制使用
InnoDB数据静态加密功能加密的表的撤消日志数据的加密。仅适用于驻留在单独的撤消表空间中的撤消日志。请参阅第 17.6.3.4 节,“撤消表空间”。不支持对驻留在系统表空间中的撤消日志数据进行加密。有关更多信息,请参阅撤消日志加密。 -
innodb_undo_log_truncate| 命令行格式 |--innodb-undo-log-truncate[={OFF|ON}]` |系统变量 innodb_undo_log_truncate作用范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 ON启用后,超过由
innodb_max_undo_log_size定义的阈值的撤消表空间将被标记为截断。只能截断撤消表空间。不支持截断驻留在系统表空间中的撤消日志。要进行截断,必须至少有两个撤消表空间。innodb_purge_rseg_truncate_frequency变量可用于加快截断撤消表空间的速度。更多信息,请参阅截断撤消表空间。
-
innodb_undo_tablespaces| 命令行格式 |--innodb-undo-tablespaces=#` |已弃用 是 系统变量 innodb_undo_tablespaces作用范围 全局 动态 是 SET_VAR提示适用否 类型 整数 默认值 2最小值 2最大值 127定义
InnoDB使用的撤消表空间的数量。默认值和最小值均为 2。注意
innodb_undo_tablespaces变量已被弃用,并且自 MySQL 8.0.14 版本起不再可配置。预计在未来的版本中将被移除。有关更多信息,请参见第 17.6.3.4 节,“撤销表空间”。`
-
innodb_use_fdatasync| 命令行格式 |
--innodb-use-fdatasync[={OFF|ON}]|引入版本 8.0.26 系统变量 innodb_use_fdatasync范围 全局 动态 是 SET_VAR提示适用否 类型 布尔值 默认值 OFF在支持
fdatasync()系统调用的平台上,启用innodb_use_fdatasync变量允许使用fdatasync()而不是fsync()系统调用进行操作系统刷新。fdatasync()调用不会刷新文件元数据,除非需要进行后续数据检索,从而提供潜在的性能优势。一些
innodb_flush_method设置的子集,如fsync、O_DSYNC和O_DIRECT使用fsync()系统调用。在使用这些设置时,innodb_use_fdatasync变量是适用的。` -
innodb_use_native_aio| 命令行格式 |
--innodb-use-native-aio[={OFF|ON}]|系统变量 innodb_use_native_aio范围 全局 动态 否 SET_VAR提示适用否 类型 布尔值 默认值 ON指定是否使用 Linux 异步 I/O 子系统。此变量仅适用于 Linux 系统,并且不能在服务器运行时更改。通常情况下,您不需要配置此选项,因为它默认启用。
InnoDB在 Windows 系统上具有的异步 I/O 功能也适用于 Linux 系统。(其他类 Unix 系统继续使用同步 I/O 调用。)此功能提高了通常在SHOW ENGINE INNODB STATUS\G输出中显示许多待处理读取/写入的 I/O 密集型系统的可伸缩性。使用大量
InnoDBI/O 线程运行,尤其是在同一台服务器上运行多个这样的实例,可能会超出 Linux 系统的容量限制。在这种情况下,您可能会收到以下错误:EAGAIN: The specified maxevents exceeds the user's limit of available events.通常情况下,您可以通过将更高的限制写入
/proc/sys/fs/aio-max-nr来解决此错误。然而,如果操作系统中异步 I/O 子系统出现问题导致
InnoDB无法启动,您可以使用innodb_use_native_aio=0启动服务器。在启动过程中,如果InnoDB检测到潜在问题,例如tmpdir位置、tmpfs文件系统和不支持tmpfs上的 AIO 的 Linux 内核的组合,此选项也可能会被自动禁用。欲了解更多信息,请参阅 第 17.8.6 节,“在 Linux 上使用异步 I/O”。
-
innodb_validate_tablespace_paths| 命令行格式 |--innodb-validate-tablespace-paths[={OFF|ON}]` |引入版本 8.0.21 系统变量 innodb_validate_tablespace_paths范围 全局 动态 否 SET_VAR提示适用否 类型 布尔 默认值 ON控制表空间文件路径验证。在启动时,
InnoDB验证已知表空间文件的路径与数据字典中存储的表空间文件路径是否匹配,以防表空间文件已移至其他位置。innodb_validate_tablespace_paths变量允许禁用表空间路径验证。此功能适用于表空间文件未移动的环境。禁用路径验证可提高在具有大量表空间文件的系统上的启动时间。警告
在移动表空间文件后以禁用表空间路径验证启动服务器可能导致未定义行为。
欲了解更多信息,请参阅 第 17.6.3.7 节,“禁用表空间路径验证”。
-
innodb_versionInnoDB版本号。在 MySQL 8.0 中,InnoDB的单独版本编号不适用,此值与服务器的version编号相同。` -
innodb_write_io_threads| 命令行格式 |--innodb-write-io-threads=#` |系统变量 innodb_write_io_threads范围 全局 动态 否 SET_VAR提示适用否 类型 整数 默认值 4最小值 1最大值 64InnoDB写操作的 I/O 线程数。默认值为 4。读线程的对应值是innodb_read_io_threads。更多信息,请参见第 17.8.5 节,“配置后台 InnoDB I/O 线程数”。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。注意
在 Linux 系统上,使用默认设置运行多个 MySQL 服务器(通常超过 12 个),
innodb_read_io_threads,innodb_write_io_threads,以及 Linuxaio-max-nr设置可能超出系统限制。理想情况下,增加aio-max-nr设置;作为解决方法,您可以减少一个或两个 MySQL 变量的设置。考虑到
sync_binlog的价值,它控制着二进制日志与磁盘的同步。有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。