记录包含指向该记录的每个字段的指针。如果记录中字段的总长度小于128字节,则指针为1字节,否则为2字节。指针数组称为记录目录。指针所指向的区域是记录的数据部分。
在内部,固定长度字符串(例如CHAR(10))以固定长度格式存储。 VARCHAR 列中的尾随空格不会被截断。
大于768 字节的固定长度列被编码为可变长度列,并且可以存储在页外。例如,如果字符集的最大字节长度大于3,则CHAR(255) 列可以超过768 字节,utf8mb4 也可以。
SQL 中的NULL 值在记录目录中保存1 或2 个字节。当存储在可变长度列中时,SQL NULL 值不会保留记录的数据部分中的字节。对于固定长度列,列的固定长度存储在记录的数据部分中。为NULL 值保留固定空间允许将列动态更新为非NULL 值,而不会导致索引页碎片。
17.10 InnoDB 行格式
与REDUNDANT 行格式相比,COMPACT 行格式减少了大约20% 的行存储空间,但会增加某些操作的CPU 使用率。如果您的工作负载是典型的并且受到缓存命中率和磁盘速度的限制,则COMPACT 格式可能会更快。如果您的工作负载受到CPU 速度的限制,紧凑格式可能会很慢。
使用COMPACT 行格式的表将可变长度列值(类型为VARCHAR、VARBINARY、BLOB 和TEXT)的前768 字节存储在B 树节点的索引记录中,其余部分存储在溢出页中。大于768 字节的固定长度列被编码为可变长度列,并且可以存储在页外。例如,如果字符集的最大字节长度大于3,则CHAR(255) 列可以超过768 字节,utf8mb4 也可以。
如果列值等于或小于768 字节,则该值将完全存储在B 树节点中,因此不使用溢出页可能会节省I/O。虽然这对于相对较短的BLOB 列值效果很好,但它可以用数据而不是键值填充B 树节点,这可能会降低效率。对于具有许多BLOB 列的表,B 树节点填满并且包含的行太少,使得整个索引比行短或者当列值存储在页外时效率低下。
REDUNDANT 行格式
COMPACT行格式具有以下存储特征:
每个索引记录包含一个5 字节的标头,其后可能是可变长度的标头。标头用于链接连续的记录并用于行级锁定。
记录头的可变长度部分包含指示空列的位向量。如果索引中可为空的列数为*N*,则位向量占用CEILING(*N*/8) 个字节。 (例如,如果可以为空的列数在9 到16 之间,则位向量使用2 个字节。)空列除此向量中的位外不占用任何空间。标头的可变长度部分还包括可变长度列的长度。每个长度占用1 到2 个字节,具体取决于列的最大长度。如果索引中的所有列都不为NULL 并且具有固定长度,则记录头中没有可变长度部分。
对于每个非NULL 可变长度字段,记录头包含使用1 或2 个字节的列长度。仅当列的一部分存储在溢出页上或最大长度大于255 字节且实际长度大于127 字节时,才需要2 个字节。对于外部存储列,2字节长度表示内部存储部分的长度加上指向外部存储部分的20字节指针。内部部分为768字节,因此长度为768+20,20字节指针存储的是该列的实际长度。
记录标题后面是非空列的数据内容。
聚集索引中的记录包括所有用户定义的列。此外,还有一个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 也可以。
REDUNDANT 行格式存储特性
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 格式允许B 树节点具有短列,从而最大限度地减少给定行所需的溢出页数。
动态行格式支持最多3072 字节的索引键前缀。
使用DYNAMIC 行格式的表可以存储在系统表空间、每表表空间和通用表空间中。要将DYNAMIC 表保存到系统表空间,请使用禁用innodb_file_per_table 的常规CREATE TABLE 或ALTER TABLE 语句,或者在CREATE TABLE 或ALTER TABLE 中使用TABLESPACE [=] innodb_system 表选项。当使用TABLESPACE [=] innodb_system 表选项将DYNAMIC 表存储在通用表空间或系统表空间中时,innodb_file_per_table 变量不适用。
紧凑行格式
DYNAMIC 行格式是COMPACT 行格式的变体。存储特性请参见COMPACT行格式的存储特性。
紧凑行格式存储特性
COMPRESSED 行格式提供与DYNAMIC 行格式相同的存储功能,但增加了对表和索引的数据压缩的支持。
COMPRESSED 行格式使用与页外存储的DYNAMIC 行格式类似的内部细节,但由于表和索引数据被压缩并且将使用较小的页大小,因此具有额外的存储和性能考虑。对于COMPRESSED 行格式,KEY_BLOCK_SIZE 选项控制聚集索引中存储的列数据量以及溢出页上放置的数据量。有关COMPRESSED 行格式的更多信息,请参阅InnoDB 表和页面压缩。
COMPRESSED 行格式支持最多3072 字节的索引键前缀。
使用COMPRESSED 行格式的表可以在每表表空间或通用表空间中创建。系统表空间不支持COMPRESSED 行格式。要在表空间中存储每个表的COMPRESSED 表,必须启用innodb_file_per_table 变量。 innodb_file_per_table 变量不适用于通用表空间。尽管通用表空间支持所有行格式,但压缩表和未压缩表不能共存于同一个通用表空间中,因为物理页大小不同。有关更多信息,请参见第17.6.3.3 节“公用表空间”。
动态行格式
COMPRESSED 行格式是COMPACT 行格式的变体。存储特性请参见COMPACT行格式的存储特性。
DYNAMIC 行格式存储特性
InnoDB表的默认行格式由innodb_default_row_format变量定义,其默认值为DYNAMIC。如果未显式定义ROW_FORMAT 表选项或指定ROW_FORMAT=DEFAULT,则使用默认行格式。
可以使用CREATE TABLE 或ALTER TABLE 语句的ROW_FORMAT 表选项显式定义表的行格式。例如:
创建表t1 (c1 INT) ROW_FORMAT=动态;
显式定义的ROW_FORMAT 设置会覆盖默认行格式。指定ROW_FORMAT=DEFAULT 与使用隐式默认值相同。
innodb_default_row_format 变量可以动态设置。
mysql 设置全局innodb_default_row_format=动态;
有效的innodb_default_row_format 选项包括DYNAMIC、COMPACT 和REDUNDANT。系统表空间使用的COMPRESSED 行格式不能定义为默认格式。只能在CREATE TABLE 或ALTER TABLE 语句中显式定义。尝试将innodb_default_row_format 变量设置为COMPRESSED 会返回以下错误:
mysql 设置全局innodb_default_row_format=COMPRESSED;
错误1231 (42000): 变量“innodb_default_row_format”
无法设置为“COMPRESSED”值
如果未显式指定ROW_FORMAT 选项或使用ROW_FORMAT=DEFAULT,则新创建的表将使用innodb_default_row_format 变量定义的行格式。例如,以下CREATE TABLE 语句使用innodb_default_row_format 变量定义的行格式。
创建表t1 (c1 INT)。
创建表t2 (c1 INT) ROW_FORMAT=DEFAULT;
如果未显式指定ROW_FORMAT 选项或使用ROW_FORMAT=DEFAULT,则以静默方式重建表会将表的行格式更改为innodb_default_row_format 变量定义的格式。
表重建操作包括需要重建表的ALGORITHM=COPY 或ALGORITHM=INPLACE 的ALTER TABLE 操作。有关详细信息,请参阅在线DDL 操作。 OPTIMIZE TABLE 也是表重建操作。
以下示例显示了表重建操作,该操作以静默方式更改未显式定义行格式的表的行格式。
mysql 选择@@innodb_default_row_format;
+——————————–+
| @@innodb_default_row_format |
+——————————–+
| 动态|
+——————————–+
mysql 创建表t1 (c1 INT);
mysql SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE \’test/t1\’ \\G
************************** 1\\. 行****************** * **********
表_ID: 54
NAME: 测试/t1
标志: 33
N_COLS: 4
空间: 35
ROW_FORMAT: 动态
ZIP_PAGE_SIZE: 0
SPACE_TYPE: 单
mysql SET GLOBAL innodb_default_row_format=COMPACT;
mysql ALTER TABLE t1 添加列(c2 INT);
mysql SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE \’test/t1\’ \\G
************************** 1\\. 行****************** * **********
表_ID: 55
NAME: 测试/t1
标志: 1
N_COLS: 5
空间: 36
ROW_FORMAT: 紧凑型
ZIP_PAGE_SIZE: 0
SPACE_TYPE: 单
在将现有表的行格式从REDUNDANT 或COMPACT 更改为DYNAMIC 之前,请考虑以下潜在问题:
REDUNDANT 和COMPACT 行格式支持767 字节的最大索引键前缀长度,而DYNAMIC 和COMPRESSED 行格式支持3072 字节的索引键前缀长度。在复制环境中,如果innodb_default_row_format 变量在源上设置为DYNAMIC,在副本上设置为COMPACT,则以下DDL 语句将在源上成功,但: 在副本上将失败。
创建表t1 (c1 INT 主键, c2 VARCHAR(5000), KEY i1(c2(3070)));
有关相关信息,请参阅InnoDB 限制。
如果源服务器的innodb_default_row_format 设置与目标服务器的设置不同,则在导入没有显式定义行格式的表时会出现模式不匹配错误。有关更多信息,请参阅导入InnoDB 表。
压缩行格式
要检查表的行格式,请使用SHOW TABLE STATUS。
显示mysql test1\\G 的表状态
************************** 1\\. 行****************** * **********
姓名: t1
引擎: InnoDB
版本: 10
row_format: 动态
行: 0
平均线长度: 0
数据长度: 16384
最大数据长度: 0
索引长度: 16384
数据自由: 0
自动增量: 1
创建时间: 2016-09-14 16:29:38
update_time: 空
check_time: 空
排序规则: utf8mb4_0900_ai_ci
校验和: 空
创建选项:
评论:
或者,查询信息模式INNODB_TABLES 表。
mysql 选择名称,ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME=\’test1/t1\’;
+————+————+
| 姓名|
+————+————+
| 测试1/t1 |
+————+————+
压缩行格式存储特性
原文: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 活动。
如何重组表以优化查询性能。
定义表的行格式
原文:dev.mysql.com/doc/refman/8.0/en/innodb-disk-io.html
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 系统。
有关配置预读启发式的更多信息,请参阅配置InnoDB 缓冲池预取(预读)。
17.11 InnoDB 磁盘 I/O 和文件空间管理
InnoDB 使用一种新的文件刷新技术,称为双写缓冲。大多数情况下默认启用此功能(innodb_doublewrite=ON)。这提高了意外终止或断电后恢复的安全性,并通过减少fsync() 操作的需要来提高大多数Unix 系统的性能。
在将页面写入数据文件之前,InnoDB 首先将其写入称为双写缓冲区的存储区域。只有在双写缓冲区被写入并刷新后,InnoDB才会将页面写入数据文件中的适当位置。如果操作系统、存储子系统或意外的mysqld 进程在写入页面时终止(导致页面损坏情况),InnoDB 可以在恢复期间从双写缓冲区找到该页面的良好副本。
有关双写入缓冲区的更多信息,请参阅双写入缓冲区。
17.
11.2 文件空间管理
原文:dev.mysql.com/doc/refman/8.0/en/innodb-file-space.html
您在配置文件中使用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 检查点
原文:dev.mysql.com/doc/refman/8.0/en/innodb-checkpoints.html
使你的日志文件变得非常大可能会在检查点期间减少磁盘 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
原文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html
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 支持
操作InstantIn Place重建表允许并发 DML仅修改元数据添加列是*是否*是*是删除列是*是是是是重命名列是*是否是*是重新排序列否是是是否设置列默认值是是否是是更改列数据类型否否是否否扩展VARCHAR列大小否是否是是删除列默认值是是否是是更改自增值否是否是否*使列为NULL否是是*是否使列为NOT NULL否是*是*是否修改ENUM或SET列的定义是是否是是操作InstantIn 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 重新启动自增序列。
使列NULL
ALTER TABLE tbl_name MODIFY COLUMN *column_name* *data_type* NULL, ALGORITHM=INPLACE, LOCK=NONE;
在原地重建表。数据被大幅重新组织,使其成为昂贵的操作。
使列NOT NULL
ALTER TABLE *tbl_name* MODIFY COLUMN *column_name* *data_type* NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
在原地重建表格。操作需要STRICT_ALL_TABLES或STRICT_TRANS_TABLES SQL_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_FORMAT
ALTER TABLE *tbl_name* ROW_FORMAT = *row_format*, ALGORITHM=INPLACE, LOCK=NONE;
数据进行了大幅重组,这是一个昂贵的操作。
有关 ROW_FORMAT 选项的更多信息,请参见表选项。
更改 KEY_BLOCK_SIZE
ALTER 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=DEFAULTIMPORT PARTITION否否否仅允许 ALGORITHM=DEFAULT, LOCK=DEFAULTTRUNCATE 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索引隐式创建的InnoDB FULLTEXT索引表进行加密。有关相关信息,请参阅 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 启动选项和系统变量
原文:dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html
可以通过命名启用或使用–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*]
命令行格式–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 的InnoDB memcached插件(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指定实现InnoDB memcached插件的共享库。
有关更多信息,请参见第 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包含实现InnoDB memcached插件的共享库的目录路径。默认值为 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单位秒自动提交使用InnoDB memcached接口的空闲连接的频率,单位为秒。更多信息,请参见第 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使用此选项禁用 InnoDB memcached 执行 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 二进制日志 的 InnoDB memcached 插件。更多信息,请参见 启用 InnoDB memcached 二进制日志。
innodb_api_enable_mdl
命令行格式–innodb-api-enable-mdl[={OFF|ON}]���弃用8.0.22系统变量innodb_api_enable_mdl作用范围全局动态否SET_VAR 提示适用否类型布尔值默认值OFF锁定InnoDB memcached 插件使用的表,以防止通过 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_DEBUG CMake 选项编译时才可用 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_DEBUG CMake 选项编译调试支持时才可用。
innodb_checkpoint_disabled
命令行格式–innodb-checkpoint-disabled[={OFF|ON}]系统变量innodb_checkpoint_disabled范围全局动态是SET_VAR提示适用否类型布尔值默认值OFF这是一个仅供专家调试使用的调试选项。它禁用了检查点,以便有意的服务器退出始终会启动InnoDB恢复。通常在运行写入重做日志条目的 DML 操作之前,应该仅启用它一小段时间。此选项仅在使用WITH_DEBUG CMake 选项编译调试支持时才可用。
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_DEBUG CMake 选项编译调试支持时才可用。
有关更多信息,请参阅第 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_VAR Hint Applies否类型布尔值默认值OFF启用此调试选项可将 DDL 日志崩溃注入计数器重置为 1。此选项仅在使用WITH_DEBUG CMake 选项编译时才可用。
innodb_ddl_threads
命令行格式–innodb-ddl-threads=#引入版本8.0.27系统变量innodb_ddl_threads作用范围全局,会话动态是SET_VAR Hint 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_VAR Hint 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_DEBUG CMake 选项编译时,才能使用 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单位字节为 InnoDB FULLTEXT 搜索索引缓存分配的内存量(以字节为单位),在创建 InnoDB FULLTEXT 索引时,该缓存在内存中保存解析的文档。仅当达到 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指定在创建 InnoDB FULLTEXT 索引时,与之关联的一组停用词。如果设置了 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存储在 InnoDB FULLTEXT 索引中的单词的最大字符长度。设置此值的限制会减小索引的大小,从而加快查询速度,通过省略长关键词或不是真实单词且不太可能是搜索词的任意字母集合。
欲了解更多信息,请参阅 第 14.9.6 节,“调整 MySQL 全文搜索”。
innodb_ft_min_token_size
命令行格式–innodb-ft-min-token-size=#系统变量innodb_ft_min_token_size范围全局动态否SET_VAR 提示适用否类型整数默认值3最小值0最大值16存储在 InnoDB FULLTEXT 索引中的单词的最小长度。增加此值会减小索引的大小,从而加快查询速度,通过省略在搜索上下文中不太可能重要的常见单词,例如英语单词“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在每次对 InnoDB FULLTEXT 索引执行 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 表指定自己的 InnoDB FULLTEXT 索引停用词列表。要为特定的 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在构建搜索索引时,用于并行索引和标记InnoDB FULLTEXT索引中文本的线程数。
有关信息,请参见第 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此选项用于在特定表上指定自己的 InnoDB FULLTEXT 索引停用词列表。要为所有 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_DEBUG CMake 选项编译调试支持时才可用。
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_DEBUG CMake 选项编译时才可用。
innodb_log_checkpoint_now
命令行格式–innodb-log-checkpoint-now[={OFF|ON}]系统变量innodb_log_checkpoint_now范围全局动态是SET_VAR提示适用否类型布尔值默认值OFF启用此调试选项以强制InnoDB写入检查点。此选项仅在使用WITH_DEBUG CMake选项编译时才可用。
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_DEBUG CMake选项编译调试支持时才可用此选项。有关相关信息,请参见第 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 将跳过表数据的重新组织,而是处理InnoDB FULLTEXT索引中新添加、删除和更新的标记数据。更多信息,请参见优化 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_VAR Hint 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_VAR Hint 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提示适用否类型布尔值默认值关闭启用随机预读技术,优化InnoDB I/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_DEBUG CMake 选项编译支持调试时,才能使用 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[={OFFON}]`系统变量innodb_status_output范围全局动态是SET_VAR提示适用否类型布尔默认值OFF启用或禁用标准InnoDB监视器的定期输出。也与innodb_status_output_locks结合使用,以启用或禁用InnoDB锁监视器的定期输出。更多信息,请参见第 17.17.2 节,“启用 InnoDB 监视器”。
innodb_status_output_locks
命令行格式`–innodb-status-output-locks[={OFFON}]`系统变量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[={OFFON}]`系统变量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 Variableinnodb_sync_spin_loopsScopeGlobalDynamicYesSET_VAR Hint AppliesNoTypeIntegerDefault Value30Minimum Value0Maximum Value4294967295线程等待InnoDB互斥锁被释放的次数,超过后线程将被挂起。
innodb_sync_debug
| Command-Line Format | –innodb-sync-debug[={OFF|ON}]` |
System Variableinnodb_sync_debugScopeGlobalDynamicNoSET_VAR Hint AppliesNoTypeBooleanDefault ValueOFF启用InnoDB存储引擎的同步调试检查。此选项仅在使用WITH_DEBUG CMake选项编译时才可用。
innodb_table_locks
| Command-Line Format | –innodb-table-locks[={OFF|ON}]` |
System Variableinnodb_table_locksScopeGlobal, SessionDynamicYesSET_VAR Hint AppliesNoTypeBooleanDefault ValueON如果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:500M
autoextend 选项会在数据文件用尽空间时自动增加大小。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范围全局DynamicNoSET_VAR Hint 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_concurrencyScopeGlobal动态是SET_VAR Hint AppliesNo类型整数Default Value0最小值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_VAR Hint 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_VAR Hint 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_DEBUG CMake选项编译时才可用。
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_DEBUG CMake选项编译时才可用。
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 密集型系统的可伸缩性。
使用大量InnoDB I/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_version
InnoDB 版本号。在 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,以及 Linux aio-max-nr设置可能超出系统限制。理想情况下,增加aio-max-nr设置;作为解决方法,您可以减少一个或两个 MySQL 变量的设置。
考虑到sync_binlog的价值,它控制着二进制日志与磁盘的同步。
有关一般 I/O 调优建议,请参见第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。
#以上关于MySQL8 中文参考(七十二)的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92497.html