值为真或假的系统变量可以通过在启动时命名它们来启用,或者通过使用
--skip-
前缀来禁用。例如,要启用或禁用InnoDB
自适应哈希索引,您可以在命令行上使用--innodb-adaptive-hash-index
或--skip-innodb-adaptive-hash-index
,或者在选项文件中使用innodb_adaptive_hash_index
或skip_innodb_adaptive_hash_index
。某些变量描述引用了 “启用” 或 “禁用” 变量。这些变量可以使用
SET
语句通过将它们设置为ON
或1
来启用,或者通过将它们设置为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.23 InnoDB 选项和变量参考
InnoDB 命令选项
-
命令行格式 --innodb-status-file[={OFF|ON}]
类型 布尔值 默认值 OFF
启动选项
--innodb-status-file
控制着InnoDB
是否在数据目录中创建一个名为innodb_status.
的文件,并每 15 秒(大约)将pid
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 监控器”。
InnoDB 系统变量
-
命令行格式 --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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 10
最小值 0
最大值 70
定义低水位标记,表示启用 自适应刷新 时 重做日志 容量的百分比。有关更多信息,请参见 第 17.8.3.5 节,“配置缓冲池刷新”。
-
命令行格式 --innodb-adaptive-hash-index[={OFF|ON}]
系统变量 innodb_adaptive_hash_index
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
是否启用或禁用
InnoDB
自适应哈希索引。根据您的工作负载,动态启用或禁用 自适应哈希索引 以提高查询性能可能是可取的。由于自适应哈希索引可能不适合所有工作负载,因此请使用现实的工作负载进行启用和禁用它的基准测试。有关详细信息,请参见 第 17.5.3 节,“自适应哈希索引”。此变量默认情况下处于禁用状态。您可以使用
SET GLOBAL
语句修改此参数,无需重启服务器。在运行时更改设置需要足够的权限来设置全局系统变量。请参见 第 7.1.9.1 节,“系统变量权限”。您也可以在服务器启动时使用--innodb-adaptive-hash-index
来启用它。禁用自适应哈希索引会立即清空哈希表。当哈希表被清空时,正常操作可以继续,而执行使用哈希表访问的查询将直接访问索引 B 树。重新启用自适应哈希索引后,哈希表将在正常操作期间重新填充。
在 MySQL 8.4 之前,此选项默认情况下处于启用状态。
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
选项中指定的最大值。该值表示微秒数。此选项在繁忙的系统中可能很有用,其中InnoDB
线程数超过 16 个。(实际上,它对具有数百或数千个同时连接的 MySQL 系统最有效。)有关更多信息,请参见 第 17.8.4 节,“为 InnoDB 配置线程并发性”。
-
命令行格式 --innodb-autoextend-increment=#
系统变量 innodb_autoextend_increment
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 64
最小值 1
最大值 1000
单位 兆字节 扩展自扩展
InnoDB
系统表空间 文件大小时的增量大小(以兆字节为单位),当它变满时。默认值为 64。有关相关信息,请参见 系统表空间数据文件配置,以及 调整系统表空间大小。设置
innodb_autoextend_increment
不会影响 每个表一个文件 表空间文件或 通用表空间 文件。无论innodb_autoextend_increment
设置如何,这些文件都是自扩展的。初始扩展量很小,之后每次扩展的增量为 4MB。 -
命令行格式 --innodb-autoinc-lock-mode=#
系统变量 innodb_autoinc_lock_mode
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 2
有效值 0
1
2
用于生成 自动递增 值的 锁定模式。允许的值分别为 0、1 或 2,表示传统、连续或交错。
默认设置是 2(交错),与基于行的复制兼容。
有关每种锁定模式的特征,请参见 InnoDB AUTO_INCREMENT 锁定模式。
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
范围 全局 动态 否 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
的值。可以以 1MB(1048576 字节)为单位增加或减少innodb_buffer_pool_chunk_size
。以下条件适用于更改
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[={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
默认情况下都已启用。有关更多信息,请参见 第 17.8.3.6 节,“保存和还原缓冲池状态”。
-
命令行格式 --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
变量。有关更多信息,请参见 第 17.8.3.6 节,“保存和还原缓冲池状态”。
-
命令行格式 --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=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}]
系统变量 innodb_buffer_pool_in_core_file
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
禁用(默认)
innodb_buffer_pool_in_core_file
变量会通过排除InnoDB
缓冲池页面来减少核心文件的大小。要使用此变量,必须启用
core_file
变量,要禁用此选项,操作系统必须支持MADV_DONTDUMP
对madvise()
的非 POSIX 扩展,该扩展在 Linux 3.4 及更高版本中受支持。有关更多信息,请参见 第 17.8.3.7 节,“从核心文件中排除或包含缓冲池页面”。在支持
MADV_DONTDUMP
的系统上,默认情况下此选项处于禁用状态,该扩展通常仅在 Linux 中受支持,而不在 macOS 或 Windows 中受支持。在 MySQL 8.4 之前,此选项默认情况下处于启用状态。
-
命令行格式 --innodb-buffer-pool-instances=#
系统变量 innodb_buffer_pool_instances
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 参见描述
最小值 1
最大值 64
InnoDB
缓冲池 分成的区域数。对于缓冲池处于多个千兆字节范围内的系统,将缓冲池划分为单独的实例可以提高并发性,方法是减少不同线程读写缓存页面时的争用。存储在缓冲池中或从缓冲池读取的每个页面都使用哈希函数随机分配给一个缓冲池实例。每个缓冲池都管理自己的空闲列表、刷新列表、LRU 以及与缓冲池关联的所有其他数据结构,并受到其自身缓冲池 互斥锁 的保护。总缓冲池大小在所有缓冲池之间分配。为了获得最佳效率,请指定
innodb_buffer_pool_instances
和innodb_buffer_pool_size
的组合,以便每个缓冲池实例至少为 1GB。如果
innodb_buffer_pool_size
<= 1 GiB,则默认的innodb_buffer_pool_instances
值为 1。如果
innodb_buffer_pool_size
> 1 GiB,则默认的innodb_buffer_pool_instances
值为以下两个计算提示中的最小值,范围在 1-64 之内缓冲池提示:计算为 (
innodb_buffer_pool_size
/innodb_buffer_pool_chunk_size
) 的 1/2CPU 提示:计算为可用逻辑处理器的 1/4
有关相关信息,请参见 第 17.8.3.1 节,“配置 InnoDB 缓冲池大小”。
-
命令行格式 --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[={OFF|ON}]
系统变量 innodb_buffer_pool_load_now
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
立即通过加载数据页面 预热
InnoDB
缓冲池,无需等待服务器重启。这在基准测试期间将缓存内存恢复到已知状态或在运行报表或维护查询后使 MySQL 服务器准备好恢复正常工作负载时非常有用。启用
innodb_buffer_pool_load_now
会触发加载操作,但不会改变变量设置,变量始终保持OFF
或0
。要查看触发加载操作后的缓冲池加载进度,请查询Innodb_buffer_pool_load_status
变量。有关更多信息,请参见 第 17.8.3.6 节,“保存和还原缓冲池状态”。
-
命令行格式 --innodb-buffer-pool-size=#
系统变量 innodb_buffer_pool_size
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 134217728
最小值 5242880
最大值(64 位平台) 2**64-1
最大值(32 位平台) 2**32-1
单位 字节 缓冲池 的大小(以字节为单位),缓冲池是
InnoDB
缓存表和索引数据的内存区域。默认值为 134217728 字节(128 MB)。最大值取决于 CPU 架构;在 32 位系统上最大值为 4294967295(232-1),在 64 位系统上最大值为 18446744073709551615(264-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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 25
最小值 0
最大值 50
InnoDB
更改缓冲区 的最大大小,以 缓冲池 总大小的百分比表示。对于具有大量插入、更新和删除活动的 MySQL 服务器,您可以增加此值;对于用于报表的具有不变数据的 MySQL 服务器,您可以减小此值。有关更多信息,请参阅 第 17.5.2 节“更改缓冲区”。有关一般 I/O 调整建议,请参阅 第 10.5.8 节“优化 InnoDB 磁盘 I/O”。 -
命令行格式 --innodb-change-buffering=value
系统变量 innodb_change_buffering
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 none
有效值 none
inserts
deletes
changes
purges
all
是否执行
InnoDB
更改缓冲,这是一种优化,可以延迟对辅助索引的写入操作,以便可以顺序执行 I/O 操作。允许的值在以下表格中描述。值也可以用数字表示。表 17.24 innodb_change_buffering 允许的值
值 数值 描述 none
0
默认值。不缓冲任何操作。 inserts
1
缓冲插入操作。 deletes
2
缓冲删除标记操作;严格来说,是标记索引记录以便在清理操作期间删除的写入操作。 changes
3
缓冲插入操作和删除标记操作。 purges
4
缓冲在后台发生的物理删除操作。 all
5
缓冲插入操作、删除标记操作和清理操作。 在 MySQL 8.4 之前,默认值为
all
。有关更多信息,请参阅 第 17.5.2 节“更改缓冲区”。有关一般 I/O 调整建议,请参阅 第 10.5.8 节“优化 InnoDB 磁盘 I/O”。
-
命令行格式 --innodb-change-buffering-debug=#
系统变量 innodb_change_buffering_debug
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 2
为
InnoDB
更改缓冲设置调试标志。值为 1 会强制所有更改到更改缓冲区。值为 2 会在合并时导致意外退出。默认值为 0,表示未设置更改缓冲调试标志。此选项仅在使用WITH_DEBUG
CMake 选项编译调试支持时可用。 -
命令行格式 --innodb-checkpoint-disabled[={OFF|ON}]
系统变量 innodb_checkpoint_disabled
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
这是一个调试选项,仅供专家调试使用。它会禁用检查点,以便故意服务器退出始终会启动
InnoDB
恢复。它只应在短时间内启用,通常在运行会写入重做日志条目(在服务器退出后需要恢复)的 DML 操作之前启用。此选项仅在使用WITH_DEBUG
CMake 选项编译调试支持时可用。 -
命令行格式 --innodb-checksum-algorithm=value
系统变量 innodb_checksum_algorithm
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 crc32
有效值 crc32
strict_crc32
innodb
strict_innodb
none
strict_none
指定如何生成和验证存储在
InnoDB
表空间 磁盘块中的 校验和。innodb_checksum_algorithm
的默认值为crc32
。值
innodb
向后兼容早期版本的 MySQL。值crc32
使用的算法计算每个修改块的校验和的速度更快,并且检查每个磁盘读取的校验和的速度也更快。它一次扫描 64 位的块,比innodb
校验和算法(一次扫描 8 位的块)更快。值none
会在校验和字段中写入一个常数值,而不是根据块数据计算一个值。表空间中的块可以使用旧校验和值、新校验和值和无校验和值的混合,并在数据修改时逐步更新;一旦表空间中的块被修改为使用crc32
算法,早期版本的 MySQL 就无法读取相关的表。校验和算法的严格形式会在遇到表空间中有效的但与校验和值不匹配的值时报告错误。建议您只在新实例中使用严格设置,以首次设置表空间。严格设置稍微快一些,因为它们不需要在磁盘读取期间计算所有校验和值。
下表显示了
none
、innodb
和crc32
选项值及其严格对应值之间的差异。none
、innodb
和crc32
会将指定的校验和值类型写入每个数据块中,但出于兼容性考虑,在读取操作期间验证块时会接受其他校验和值。严格设置也会接受有效的校验和值,但会在遇到有效的与校验和值不匹配的值时打印错误消息。如果实例中的所有InnoDB
数据文件都在相同的innodb_checksum_algorithm
值下创建,则使用严格形式可以使验证更快。表 17.25 允许的 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[={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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 1000
可以同时 提交 的 线程 数量。值为 0(默认值)允许任意数量的 事务 同时提交。
在运行时,无法将
innodb_commit_concurrency
的值从零更改为非零,反之亦然。该值可以从一个非零值更改为另一个非零值。 -
命令行格式 --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
范围 全局 动态 是 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
范围 全局 动态 是 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=file_name
系统变量 innodb_data_file_path
范围 全局 动态 否 SET_VAR
提示适用否 类型 字符串 默认值 ibdata1:12M:autoextend
定义
InnoDB
系统表空间数据文件的名称、大小和属性。如果您未为innodb_data_file_path
指定值,则默认行为是创建一个名为ibdata1
的单个自动扩展数据文件,其大小略大于 12MB。数据文件规范的完整语法包括文件名、文件大小、
autoextend
属性和max
属性file_name:file_size[:autoextend[:max:max_file_size]]
文件大小以 KB、MB 或 GB 为单位指定,在大小值后附加
K
、M
或G
。如果以 KB 为单位指定数据文件大小,请以 1024 的倍数指定。否则,KB 值将四舍五入到最接近的 MB 边界。文件大小之和至少应略大于 12MB。有关其他配置信息,请参见 系统表空间数据文件配置。有关调整大小说明,请参见 调整系统表空间大小。
-
命令行格式 --innodb-data-home-dir=dir_name
系统变量 innodb_data_home_dir
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名称 InnoDB
系统表空间 数据文件的目录路径的公共部分。默认值为 MySQLdata
目录。该设置与innodb_data_file_path
设置连接在一起,除非该设置定义了绝对路径。为
innodb_data_home_dir
指定值时,需要在末尾加上斜杠。例如[mysqld] innodb_data_home_dir = /path/to/myibdata/
此设置不会影响 每个表一个文件 表空间的位置。
有关相关信息,请参见 第 17.8.1 节,“InnoDB 启动配置”。
-
命令行格式 --innodb-ddl-buffer-size=#
系统变量 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
提示适用否 类型 布尔值 默认值 OFF
启用此调试选项以将 DDL 日志崩溃注入计数器重置为 1。此选项仅在使用
WITH_DEBUG
CMake 选项编译调试支持时可用。-
命令行格式 --innodb-ddl-threads=#
系统变量 innodb_ddl_threads
范围 会话 动态 是 SET_VAR
提示适用否 类型 整数 默认值 4
最小值 1
最大值 64
定义索引创建的排序和构建阶段的并行线程的最大数量。适用于创建或重建辅助索引的在线 DDL 操作。有关相关信息,请参见 第 17.12.5 节,“配置在线 DDL 操作的并行线程” 和 第 17.12.4 节,“在线 DDL 内存管理”。
-
命令行格式 --innodb-deadlock-detect[={OFF|ON}]
系统变量 innodb_deadlock_detect
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
此选项用于禁用死锁检测。在高并发系统中,死锁检测会导致大量线程等待同一锁时出现速度变慢。有时,禁用死锁检测并依赖于
innodb_lock_wait_timeout
设置来回滚事务(当发生死锁时)可能更有效。有关相关信息,请参见第 17.7.5.2 节,“死锁检测”。
-
命令行格式 --innodb-dedicated-server[={OFF|ON}]
系统变量 innodb_dedicated_server
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
当
innodb_dedicated_server
启用时,InnoDB
会自动配置以下变量-
注意
innodb_log_file_size
和innodb_log_files_in_group
已弃用,并被innodb_redo_log_capacity
取代;请参见第 17.6.5 节,“重做日志”。 在 MySQL 8.4 之前,
innodb_flush_method
也会自动配置。
仅当 MySQL 实例驻留在可以使用所有可用系统资源的专用服务器上时,才考虑启用
innodb_dedicated_server
。如果 MySQL 实例与其他应用程序共享系统资源,则不建议启用innodb_dedicated_server
。有关更多信息,请参见第 17.8.12 节,“为专用 MySQL 服务器启用自动配置”。
-
命令行格式 --innodb-default-row-format=value
系统变量 innodb_default_row_format
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 DYNAMIC
有效值 REDUNDANT
COMPACT
DYNAMIC
innodb_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=dir_name
系统变量 innodb_directories
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名称 默认值 NULL
定义在启动时扫描以查找表空间文件目录。当服务器处于脱机状态时,此选项用于将表空间文件移动或还原到新位置。它还用于指定使用绝对路径创建的或位于数据目录之外的表空间文件的目录。
崩溃恢复期间的表空间发现依赖于
innodb_directories
设置来标识重做日志中引用的表空间。有关更多信息,请参见崩溃恢复期间的表空间发现。默认值为 NULL,但由
innodb_data_home_dir
、innodb_undo_directory
和datadir
定义的目录始终追加到innodb_directories
参数值,当InnoDB
在启动时构建要扫描的目录列表时。无论是否明确指定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=value
系统变量 innodb_doublewrite
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 ON
有效值 ON
OFF
DETECT_AND_RECOVER
DETECT_ONLY
innodb_doublewrite
变量控制双写缓冲。在大多数情况下,双写缓冲默认启用。在启动服务器时,可以将
innodb_doublewrite
设置为ON
或OFF
,分别启用或禁用双写缓冲。DETECT_AND_RECOVER
与ON
相同。使用此设置,除了双写缓冲已完全启用外,数据库页面内容还将写入双写缓冲,在恢复期间访问该缓冲,以修复不完整的页面写入。使用DETECT_ONLY
,仅元数据写入双写缓冲。数据库页面内容不会写入双写缓冲,恢复不会使用双写缓冲来修复不完整的页面写入。此轻量级设置旨在仅用于检测不完整的页面写入。MySQL 支持对
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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 256
此变量最初用于表示要批处理写入的双写页面的数量。此功能已由
innodb_doublewrite_pages
取代。有关更多信息,请参见第 17.6.4 节,“双写缓冲”。
-
命令行格式 --innodb-doublewrite-dir=dir_name
系统变量 innodb_doublewrite_dir
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名称 定义双写文件的目录。如果未指定目录,则双写文件将在
innodb_data_home_dir
目录中创建,该目录默认为未指定的数据目录。有关更多信息,请参见第 17.6.4 节,“双写缓冲”。
-
命令行格式 --innodb-doublewrite-files=#
系统变量 innodb_doublewrite_files
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 2
最小值 1
最大值 256
定义双写文件的数量。默认情况下,每个缓冲池实例会创建两个双写文件。
至少有两个双写文件。双写文件的最大数量是缓冲池实例数量的两倍。(缓冲池实例的数量由
innodb_buffer_pool_instances
变量控制。)有关更多信息,请参见第 17.6.4 节,“双写缓冲”。
-
命令行格式 --innodb-doublewrite-pages=#
系统变量 innodb_doublewrite_pages
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 128
最小值 1
最大值 512
定义每个线程的批处理写入的最大双写页面数量。如果未指定值,则
innodb_doublewrite_pages
默认为 128。在 MySQL 8.4 之前,默认值为
innodb_write_io_threads
值,默认值为 4。有关更多信息,请参见第 17.6.4 节,“双写缓冲”。
-
命令行格式 --innodb=extend-and-initialize[={OFF|ON}]
系统变量 innodb_extend_and_initialize
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
控制在 Linux 系统上如何为每个文件一个表和通用表空间分配空间。
启用后,
InnoDB
会将 NULL 写入新分配的页面。禁用后,将使用posix_fallocate()
调用分配空间,该调用会保留空间,但不会实际写入 NULL。有关更多信息,请参见第 17.6.3.8 节,“优化 Linux 上的表空间空间分配”。
-
命令行格式 --innodb-fast-shutdown=#
系统变量 innodb_fast_shutdown
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 1
有效值 0
1
2
InnoDB
关闭模式。如果值为 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
设置为指定页会使该页变脏。innodb_fil_make_page_dirty_debug
选项仅在使用WITH_DEBUG
CMake 选项编译了调试支持的情况下可用。-
命令行格式 --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 节,“系统表空间”。可以使用
SET GLOBAL
语句在运行时配置innodb_file_per_table
变量,在启动时在命令行上指定,或在选项文件中指定。运行时配置需要足够的权限来设置全局系统变量(请参见 第 7.1.9.1 节,“系统变量权限”),并立即影响所有连接的操作。当位于每表文件表空间中的表被截断或删除时,释放的空间将返回到操作系统。截断或删除位于系统表空间中的表仅释放系统表空间中的空间。系统表空间中的释放空间可以再次用于
InnoDB
数据,但不会返回到操作系统,因为系统表空间数据文件永远不会缩小。innodb_file_per-table
设置不会影响临时表的创建;临时表将在会话临时表空间中创建。请参见 第 17.6.3.5 节,“临时表空间”。 -
命令行格式 --innodb-fill-factor=#
系统变量 innodb_fill_factor
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 100
最小值 10
最大值 100
InnoDB
在创建或重建索引时执行批量加载。这种索引创建方法被称为 “排序索引构建”。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
范围 全局 动态 是 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
。
有关在最能抵御意外停止的副本上设置组合的信息,请参见 第 19.4.2 节,“处理副本的意外停止”。
警告许多操作系统和一些磁盘硬件会欺骗刷新到磁盘的操作。他们可能会告诉 mysqld 刷新已完成,即使实际上没有完成。在这种情况下,即使使用推荐的设置,也不能保证事务的持久性,最糟糕的情况下,断电会导致
InnoDB
数据损坏。在 SCSI 磁盘控制器或磁盘本身中使用带电池支持的磁盘缓存可以加快文件刷新速度,并使操作更安全。您还可以尝试在硬件缓存中禁用磁盘写入的缓存。-
命令行格式 --innodb-flush-method=value
系统变量 innodb_flush_method
范围 全局 动态 否 SET_VAR
提示适用否 类型 字符串 默认值(Unix) 如果支持 O_DIRECT,否则为 fsync
默认值(Windows) unbuffered
有效值(Unix) fsync
O_DSYNC
littlesync
nosync
O_DIRECT
O_DIRECT_NO_FSYNC
有效值(Windows) unbuffered
normal
定义用于将数据 刷新 到
InnoDB
数据文件 和 日志文件 的方法,这会影响 I/O 吞吐量。在类 Unix 系统上,默认值为
O_DIRECT
(如果支持),否则默认为fsync
。在 Windows 上,默认值为unbuffered
。innodb_flush_method
的类 Unix 系统选项包括fsync
或0
:InnoDB
使用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 在创建新文件、增加文件大小和关闭文件后会调用
fsync()
,以确保文件系统元数据更改已同步。在每次写入操作后,仍然会跳过fsync()
系统调用。如果重做日志文件和数据文件位于不同的存储设备上,并且在将数据文件写入从非电池支持的设备缓存中刷新之前发生了意外退出,则可能会丢失数据。如果您使用或打算对重做日志文件和数据文件使用不同的存储设备,并且您的数据文件位于具有非电池支持的缓存的设备上,请改用
O_DIRECT
。
在支持
fdatasync()
系统调用的平台上,innodb_use_fdatasync
变量允许使用fsync()
的innodb_flush_method
选项改用fdatasync()
。fdatasync()
系统调用不会刷新对文件元数据的更改,除非后续数据检索需要这样做,从而提供潜在的性能优势。Windows 系统的
innodb_flush_method
选项包括unbuffered
或0
:InnoDB
使用非缓冲 I/O。注意在 Windows 上使用 4K 扇区硬盘驱动器运行 MySQL 服务器时,不支持
unbuffered
。解决方法是使用innodb_flush_method=normal
。normal
或1
:InnoDB
使用缓冲 I/O。
每个设置如何影响性能取决于硬件配置和工作负载。对您的特定配置进行基准测试以确定使用哪个设置,或是否保留默认设置。检查
Innodb_data_fsyncs
状态变量以查看每个设置的fsync()
调用(或如果启用了innodb_use_fdatasync
,则为fdatasync()
调用)的总数。工作负载中读写操作的混合会影响设置的执行方式。例如,在具有硬件 RAID 控制器和电池支持的写入缓存的系统上,O_DIRECT
可以帮助避免InnoDB
缓冲池和操作系统文件系统缓存之间的双重缓冲。在某些系统上,InnoDB
数据和日志文件位于 SAN 上,对于主要包含SELECT
语句的读密集型工作负载,默认值或O_DSYNC
可能更快。始终使用反映您的生产环境的硬件和工作负载测试此参数。有关一般 I/O 调优建议,请参阅 第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。 -
命令行格式 --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[={OFF|ON}]
系统变量 innodb_flush_sync
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
innodb_flush_sync
变量默认启用,会导致innodb_io_capacity
和innodb_io_capacity_max
设置在 检查点 处发生的 I/O 活动突发期间被忽略。要遵守innodb_io_capacity
和innodb_io_capacity_max
定义的 I/O 速率,请禁用innodb_flush_sync
。有关配置
innodb_flush_sync
变量的信息,请参阅 第 17.8.7 节,“配置 InnoDB I/O 容量”。 -
命令行格式 --innodb-flushing-avg-loops=#
系统变量 innodb_flushing_avg_loops
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 30
最小值 1
最大值 1000
InnoDB
保持先前计算的刷新状态快照的迭代次数,控制 自适应刷新 对不断变化的 工作负载 的响应速度。增加值会使刷新操作的速率随着工作负载的变化而平稳且逐渐地改变。减小值会使自适应刷新快速调整以适应工作负载的变化,如果工作负载突然增加和减少,这会导致刷新活动的峰值。有关相关信息,请参阅 第 17.8.3.5 节,“配置缓冲池刷新”。
-
命令行格式 --innodb-force-load-corrupted[={OFF|ON}]
系统变量 innodb_force_load_corrupted
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
允许
InnoDB
在启动时加载标记为损坏的表。仅在故障排除期间使用,以恢复否则无法访问的数据。故障排除完成后,禁用此设置并重新启动服务器。 -
命令行格式 --innodb-force-recovery=#
系统变量 innodb_force_recovery
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 6
崩溃恢复 模式,通常仅在严重的故障排除情况下更改。可能的值从 0 到 6。有关这些值的含义以及有关
innodb_force_recovery
的重要信息,请参阅 第 17.20.3 节,“强制 InnoDB 恢复”。警告仅在紧急情况下将此变量设置为大于 0 的值,以便您可以启动
InnoDB
并转储您的表。作为安全措施,当innodb_force_recovery
大于 0 时,InnoDB
会阻止INSERT
、UPDATE
或DELETE
操作。innodb_force_recovery
设置为 4 或更大,将使InnoDB
进入只读模式。这些限制可能会导致复制管理命令以错误失败,因为复制将副本状态日志存储在
InnoDB
表中。 -
命令行格式 --innodb-fsync-threshold=#
系统变量 innodb_fsync_threshold
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 2**64-1
默认情况下,当
InnoDB
创建新的数据文件(例如新的日志文件或表空间文件)时,文件将在刷新到磁盘之前完全写入操作系统缓存,这会导致大量磁盘写入活动同时发生。要强制从操作系统缓存中进行较小、定期地刷新数据,可以使用innodb_fsync_threshold
变量定义一个阈值(以字节为单位)。当达到字节阈值时,操作系统缓存的内容将刷新到磁盘。默认值为 0,强制执行默认行为,即仅在文件完全写入缓存后才将数据刷新到磁盘。指定阈值以强制进行较小、定期地刷新在多个 MySQL 实例使用同一存储设备的情况下可能是有益的。例如,创建新的 MySQL 实例及其关联的数据文件会导致大量的磁盘写入活动突发,从而阻碍使用同一存储设备的其他 MySQL 实例的性能。配置阈值有助于避免此类写入活动突发。
-
系统变量 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 索引表”。
-
命令行格式 --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[={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[={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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 84
最小值 10
最大值 84
存储在
InnoDB
FULLTEXT
索引中的单词的最大字符长度。通过省略不属于真实单词且不太可能是搜索词的长关键字或任意字母组合来设置此值的限制可以减小索引的大小,从而通过省略长关键字或任意字母组合来加快查询速度。有关更多信息,请参阅 第 14.9.6 节,“微调 MySQL 全文搜索”。
-
命令行格式 --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
范围 全局 动态 是 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
范围 全局 动态 是 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
范围 全局 动态 否 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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 640000000
最小值 32000000
最大值 1600000000
单位 字节 为所有表的
InnoDB
全文搜索索引缓存分配的总内存(以字节为单位)。创建多个每个表都具有FULLTEXT
搜索索引的表可能会消耗大量可用内存。innodb_ft_total_cache_size
为所有全文搜索索引定义一个全局内存限制,以帮助避免过度消耗内存。如果索引操作达到全局限制,则会触发强制同步。有关更多信息,请参阅 InnoDB 全文索引缓存。
-
命令行格式 --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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 100
最小值 0
最大值 100
限制
InnoDB
空闲时的页面刷新。innodb_idle_flush_pct
值是innodb_io_capacity
设置的百分比,该设置定义了可用于InnoDB
的每秒 I/O 操作数。有关更多信息,请参阅 限制空闲期间的缓冲区刷新。 -
命令行格式 --innodb-io-capacity=#
系统变量 innodb_io_capacity
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 10000
最小值 100
最大值 2**32-1
innodb_io_capacity
变量定义了可用于InnoDB
后台任务(如从 缓冲池 刷新页面以及合并来自 更改缓冲区 的数据的每秒 I/O 操作数(IOPS)。有关配置
innodb_io_capacity
变量的信息,请参阅 第 17.8.7 节,“配置 InnoDB I/O 容量”。 -
命令行格式 --innodb-io-capacity-max=#
系统变量 innodb_io_capacity_max
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 2 * innodb_io_capacity
最小值 100
最大值 2**32-1
如果刷新活动落后,
InnoDB
可以更积极地刷新,以比innodb_io_capacity
变量定义的更高的每秒 I/O 操作数(IOPS)速率执行刷新。innodb_io_capacity_max
变量在这种情况下定义了InnoDB
后台任务执行的 IOPS 的最大数量。此选项不控制innodb_flush_sync
行为。默认值为
innodb_io_capacity
值的两倍。有关配置
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
范围 全局,会话 动态 是 SET_VAR
提示适用否 类型 整数 默认值 50
最小值 1
最大值 1073741824
单位 秒 InnoDB
事务 在放弃之前等待 行锁 的时间长度(以秒为单位)。默认值为 50 秒。尝试访问被另一个InnoDB
事务锁定的行的交易最多等待这么长时间才能获得对该行的写入访问权限,然后发出以下错误ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
发生锁等待超时时,当前语句将 回滚(而不是整个事务)。要使整个事务回滚,请使用
--innodb-rollback-on-timeout
选项启动服务器。另请参阅 第 17.20.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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 67108864
最小值 1048576
最大值 4294967295
用于
InnoDB
将数据写入磁盘日志文件的缓冲区大小(以字节为单位)。默认值为 64MB。较大的日志缓冲区 允许较大的事务运行,而无需在事务提交之前将日志写入磁盘。因此,如果您的事务更新、插入或删除了大量行,增大日志缓冲区的大小可以节省磁盘 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}]
系统变量 innodb_log_checkpoint_fuzzy_now
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用此调试选项以强制
InnoDB
写入模糊检查点。此选项仅在使用WITH_DEBUG
CMake选项编译了调试支持的情况下才可用。-
命令行格式 --innodb-log-checkpoint-now[={OFF|ON}]
系统变量 innodb_log_checkpoint_now
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用此调试选项以强制
InnoDB
写入检查点。此选项仅在使用WITH_DEBUG
CMake选项编译了调试支持的情况下才可用。 -
命令行格式 --innodb-log-checksums[={OFF|ON}]
系统变量 innodb_log_checksums
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
启用或禁用重做日志页面的校验和。
innodb_log_checksums=ON
启用重做日志页面CRC-32C
校验和算法。禁用innodb_log_checksums
时,将忽略重做日志页面校验和字段的内容。重做日志头页面和重做日志检查点页面的校验和永远不会被禁用。
-
命令行格式 --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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 50331648
最小值 4194304
最大值 512GB / innodb_log_files_in_group
单位 字节 每个日志文件在日志组中的大小(以字节为单位)。日志文件的大小总和(
innodb_log_file_size
*innodb_log_files_in_group
)不能超过略小于 512GB 的最大值。例如,一对 255 GB 日志文件接近限制,但不会超过限制。默认值为 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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 2
最小值 2
最大值 100
日志组中的日志文件数量。
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=dir_name
系统变量 innodb_log_group_home_dir
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名称 InnoDB
重做日志文件的目录路径。有关相关信息,请参见重做日志配置。
-
命令行格式 --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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 50
最小值 0
最大值 100
定义用户线程在等待刷新重做时不再旋转的 CPU 使用量的最大值。该值表示为所有 CPU 核心总处理能力的百分比。默认值为 50%。例如,两个 CPU 核心 100% 的使用量代表具有四个 CPU 核心的服务器上 50% 的总 CPU 处理能力。
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
最大值 2**32-1
单位 微秒 定义用户线程在等待刷新重做时不再旋转的平均日志刷新时间的最大值。默认值为 400 微秒。
有关相关信息,请参见第 10.5.4 节“优化 InnoDB 重做日志记录”。
-
命令行格式 --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
日志文件块大小的倍数 (2n)。最小值为InnoDB
日志文件块大小 (512)。指定最小值时不会发生预写。最大值等于innodb_page_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[={OFF|ON}]
系统变量 innodb_log_writer_threads
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
为将重做日志记录从日志缓冲区写入系统缓冲区以及将系统缓冲区刷新到重做日志文件启用专用日志写入线程。专用日志写入线程可以提高高并发系统的性能,但对于低并发系统,禁用专用日志写入线程可以提供更好的性能。
有关更多信息,请参见第 10.5.4 节,“优化 InnoDB 重做日志记录”。
-
命令行格式 --innodb-lru-scan-depth=#
系统变量 innodb_lru_scan_depth
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 1024
最小值 100
最大值 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
范围 全局 动态 是 SET_VAR
提示适用否 类型 数字 默认值 90
最小值 0
最大值 99.999
InnoDB
尝试从 缓冲池 刷新 数据,以使 脏页面 的百分比不超过此值。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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 4294967295
定义所需的最大清除延迟。如果超过此值,则会对
INSERT
、UPDATE
和DELETE
操作实施延迟,以留出时间让清除追赶上来。默认值为 0,这意味着没有最大清除延迟,也没有延迟。有关更多信息,请参见第 17.8.9 节,“清除配置”。
-
命令行格式 --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
范围 全局 动态 是 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={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.16 节,“SHOW ENGINE 语句”。 -
命令行格式 --innodb-monitor-enable={counter|module|pattern|all}
系统变量 innodb_monitor_enable
范围 全局 动态 是 SET_VAR
提示适用否 类型 字符串 此变量充当开关,启用
InnoDB
指标计数器。可以使用信息架构INNODB_METRICS
表查询计数器数据。有关使用信息,请参见第 17.15.6 节,“InnoDB INFORMATION_SCHEMA 指标表”。innodb_monitor_enable='latch'
启用SHOW ENGINE INNODB MUTEX
的统计信息收集。有关更多信息,请参见第 15.7.7.16 节,“SHOW ENGINE 语句”。 -
命令行格式 --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 指标表”。innodb_monitor_reset='latch'
重置SHOW ENGINE INNODB MUTEX
报告的统计信息。有关更多信息,请参见第 15.7.7.16 节,“SHOW ENGINE 语句”。 -
命令行格式 --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[={OFF|ON}]
系统变量 innodb_numa_interleave
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 ON
为
InnoDB
缓冲池的分配启用 NUMA 交错内存策略。启用innodb_numa_interleave
后,会为 mysqld 进程将 NUMA 内存策略设置为MPOL_INTERLEAVE
。分配InnoDB
缓冲池后,会将 NUMA 内存策略恢复为MPOL_DEFAULT
。为了使innodb_numa_interleave
选项可用,MySQL 必须在启用了 NUMA 的 Linux 系统上编译。如果系统支持,则默认值为ON
,否则默认值为OFF
。CMake 会根据当前平台是否支持
NUMA
设置WITH_NUMA
的默认值。有关更多信息,请参见第 2.8.7 节,“MySQL 源代码配置选项”。 -
命令行格式 --innodb-old-blocks-pct=#
系统变量 innodb_old_blocks_pct
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 37
最小值 5
最大值 95
指定用于旧块 子列表 的
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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 1000
最小值 0
最大值 2**32-1
单位 毫秒 非零值可以防止 缓冲池 被仅在短时间内引用的数据(例如,在 全表扫描 期间)填满。增加此值可以提供更多保护,防止全表扫描干扰缓存在缓冲池中的数据。
指定将插入旧 子列表 的块在第一次访问后必须停留多长时间(以毫秒为单位),然后才能移动到新的子列表。如果值为 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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 -1
(表示自动调整大小;请勿分配此字面值)最小值 10
最大值 2147483647
指定
InnoDB
可以在同一时间打开的文件的最大数量。最小值为 10。如果innodb_file_per_table
已禁用,则默认值为 300;否则,默认值为 300 或table_open_cache
设置,取较高者。可以使用
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
。只允许整数值。为了防止非 LRU 管理的文件占用整个
innodb_open_files
限制,非 LRU 管理的文件被限制为此限制的 90%,这将为 LRU 管理的文件保留 10% 的限制。 -
命令行格式 --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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 innodb_buffer_pool_instances
最小值 1
最大值 64
从缓冲池实例中刷新脏页到数据文件的页面清理线程数。页面清理线程执行刷新列表和 LRU 刷新。当存在多个页面清理线程时,每个缓冲池实例的缓冲池刷新任务将分派给空闲的页面清理线程。
innodb_page_cleaners
的默认值设置为与innodb_buffer_pool_instances
相同的值。如果指定的页面清理线程数超过缓冲池实例数,则innodb_page_cleaners
会自动设置为与innodb_buffer_pool_instances
相同的值。如果您的工作负载在将脏页从缓冲池实例刷新到数据文件时是写 I/O 绑定,并且您的系统硬件有可用容量,则增加页面清理线程数可能有助于提高写 I/O 吞吐量。
多线程页面清理支持扩展到关闭和恢复阶段。
在支持
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
范围 全局 动态 否 SET_VAR
提示适用否 类型 枚举 默认值 16384
有效值 4096
8192
16384
32768
65536
指定
InnoDB
表空间 的 页面大小。值可以以字节或千字节指定。例如,16 千字节页面大小值可以指定为 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
设置为至少 16MB(默认值为 64MB)。默认的 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
范围 会话 动态 是 SET_VAR
提示适用否 类型 整数 默认值 (可用逻辑处理器 / 8),最小值为 4
最小值 1
最大值 256
定义可用于并行聚簇索引读取的线程数。也支持对分区的并行扫描。并行读取线程可以提高
CHECK TABLE
的性能。InnoDB
在CHECK TABLE
操作期间两次读取聚簇索引。第二次读取可以并行进行。此功能不适用于辅助索引扫描。innodb_parallel_read_threads
会话变量必须设置为大于 1 的值才能进行并行聚簇索引读取。用于执行并行聚簇索引读取的实际线程数由innodb_parallel_read_threads
设置或要扫描的索引子树数量决定,以较小的值为准。在扫描期间读入缓冲池的页面将保留在缓冲池 LRU 列表的尾部,以便在需要空闲缓冲池页面时可以快速丢弃它们。并行读取线程的最大数量(256)是所有客户端连接的线程总数。如果达到线程限制,连接将回退到使用单个线程。默认值由系统上可用的逻辑处理器数量除以 8 计算得出,最小默认值为 4。
在 MySQL 8.4 之前,默认值始终为 4。
-
命令行格式 --innodb-print-all-deadlocks[={OFF|ON}]
系统变量 innodb_print_all_deadlocks
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用此选项时,有关
InnoDB
用户事务中所有死锁 的信息将记录在mysqld
错误日志 中。否则,您将仅看到有关最后一次死锁的信息,使用SHOW ENGINE INNODB STATUS
语句。偶尔发生的InnoDB
死锁并不一定是什么问题,因为InnoDB
会立即检测到这种情况并自动回滚其中一个事务。您可能会使用此选项来排查死锁发生的原因,如果应用程序没有适当的错误处理逻辑来检测回滚并重试其操作。大量死锁可能表明需要重新构建发出对多个表执行DML 或SELECT ... FOR UPDATE
语句的事务,以便每个事务以相同的顺序访问表,从而避免死锁情况。有关相关信息,请参阅第 17.7.5 节“InnoDB 中的死锁”。
-
命令行格式 --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
范围 全局 动态 是 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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 如果可用逻辑处理器数量 <= 16;否则为 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[={OFF|ON}]
系统变量 innodb_random_read_ahead
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
为优化
InnoDB
I/O 启用随机预读 技术。有关不同类型的预读请求的性能注意事项的详细信息,请参阅第 17.8.3.4 节“配置 InnoDB 缓冲池预取(预读)”。有关一般 I/O 调整建议,请参阅第 10.5.8 节“优化 InnoDB 磁盘 I/O”。
-
命令行格式 --innodb-read-ahead-threshold=#
系统变量 innodb_read_ahead_threshold
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 56
最小值 0
最大值 64
控制
InnoDB
用于将页面预取到缓冲池 中的线性预读 的敏感度。如果InnoDB
从区(64 个页面)中按顺序读取至少innodb_read_ahead_threshold
个页面,它会启动对整个后续区的异步读取。允许的值范围为 0 到 64。值为 0 表示禁用预读。对于默认值 56,InnoDB
必须从区中按顺序读取至少 56 个页面才能启动对后续区的异步读取。了解通过预读机制读取了多少页面,以及其中有多少页面从缓冲池中清除而从未被访问过,这在微调
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
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 (可用逻辑处理器 / 2),最小值为 4
最小值 1
最大值 64
InnoDB
中用于读取操作的 I/O 线程数。其用于写入线程的对应项是innodb_write_io_threads
。有关更多信息,请参阅第 17.8.5 节“配置后台 InnoDB I/O 线程数量”。有关一般 I/O 调整建议,请参阅第 10.5.8 节“优化 InnoDB 磁盘 I/O”。默认值为系统上可用的逻辑处理器数量除以 2,最小默认值为 4。在 MySQL 8.4 之前,默认值始终为 4。
注意在 Linux 系统上,运行多个 MySQL 服务器(通常超过 12 个)并使用
innodb_read_io_threads
、innodb_write_io_threads
和 Linuxaio-max-nr
设置的默认设置可能会超过系统限制。理想情况下,请增加aio-max-nr
设置;作为一种变通方法,您可以减少一个或两个 MySQL 变量的设置。 -
命令行格式 --innodb-read-only[={OFF|ON}]
系统变量 innodb_read_only
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
以只读模式启动
InnoDB
。用于在只读媒体上分发数据库应用程序或数据集。也可以在数据仓库中用于在多个实例之间共享同一个数据目录。有关更多信息,请参阅第 17.8.2 节“配置 InnoDB 进行只读操作”。启用
innodb_read_only
会阻止为所有存储引擎创建和删除表,而不仅仅是InnoDB
。对任何存储引擎的表创建和删除操作都会修改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
系统数据库中的其他表使用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
范围 全局 动态 是 SET_VAR
提示适用否 类型 字符串 默认值 NULL
定义可以创建重做日志存档文件的标记目录。可以在分号分隔的列表中定义多个标记目录。例如:
innodb_redo_log_archive_dirs='label1:/backups1;label2:/backups2'
标记可以是任何字符串,但不能包含冒号 (:),冒号 (:) 不允许使用。空标记也被允许,但冒号 (:) 仍然是必需的。
必须指定路径,并且该目录必须存在。路径可以包含冒号 (:),但不允许使用分号 (;)。
-
命令行格式 --innodb-redo-log-capacity=#
系统变量 innodb_redo_log_capacity
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 104857600
最小值 8388608
最大值 549755813888
单位 字节 定义重做日志文件所占用的磁盘空间量。
innodb_redo_log_capacity
优先于innodb_log_files_in_group
和innodb_log_file_size
变量,如果定义了innodb_redo_log_capacity
,则这两个变量将被忽略。如果未定义
innodb_redo_log_capacity
,并且也未定义innodb_log_file_size
或innodb_log_files_in_group
,则使用默认的innodb_redo_log_capacity
值。如果未定义
innodb_redo_log_capacity
,并且定义了innodb_log_file_size
和/或innodb_log_files_in_group
,则 InnoDB 重做日志容量将计算为 (innodb_log_files_in_group * innodb_log_file_size)。此计算不会修改未使用的innodb_redo_log_capacity
设置的值。服务器状态变量
Innodb_redo_log_capacity_resized
指示所有重做日志文件的总重做日志容量。如果启用了
innodb_dedicated_server
,则如果未明确定义innodb_redo_log_capacity
值,它将自动配置。有关更多信息,请参见 第 17.8.12 节,“启用专用 MySQL 服务器的自动配置”。有关更多信息,请参见 第 17.6.5 节,“重做日志”。
-
命令行格式 --innodb-redo-log-encrypt[={OFF|ON}]
系统变量 innodb_redo_log_encrypt
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
控制使用
InnoDB
静态数据加密功能 加密的表的重做日志数据的加密。默认情况下,重做日志数据的加密处于禁用状态。有关更多信息,请参见 重做日志加密。 -
命令行格式 --innodb-replication-delay=#
系统变量 innodb_replication_delay
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 4294967295
单位 毫秒 如果达到
innodb_thread_concurrency
,则副本服务器上的复制线程延迟(以毫秒为单位)。 -
命令行格式 --innodb-rollback-on-timeout[={OFF|ON}]
系统变量 innodb_rollback_on_timeout
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
默认情况下,
InnoDB
仅 回滚 事务超时时的最后一条语句。如果指定了--innodb-rollback-on-timeout
,则事务超时会导致InnoDB
中断并回滚整个事务。有关更多信息,请参见 第 17.20.5 节,“InnoDB 错误处理”。
-
命令行格式 --innodb-rollback-segments=#
系统变量 innodb_rollback_segments
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 128
最小值 1
最大值 128
innodb_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
范围 全局 动态 是 SET_VAR
提示适用否 类型 数字 默认值 12.5
最小值 0.03
最大值 40
定义作为空页面保留的表空间文件段页面的百分比。该设置适用于每个表文件和通用表空间。
innodb_segment_reserve_factor
的默认设置为 12.5%,这与以前 MySQL 版本中保留的页面百分比相同。有关更多信息,请参见 配置保留的文件段页面百分比。
-
命令行格式 --innodb-sort-buffer-size=#
系统变量 innodb_sort_buffer_size
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 1048576
最小值 65536
最大值 67108864
单位 字节 此变量定义在 在线 DDL 操作期间记录并发 DML 时临时日志文件扩展的量,以及临时日志文件读取缓冲区和写入缓冲区的大小。
有关更多信息,请参见 第 17.12.3 节,“在线 DDL 空间要求”。
-
命令行格式 --innodb-spin-wait-delay=#
系统变量 innodb_spin_wait_delay
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 6
最小值 0
最大值 1000
轮询 自旋 锁的最大延迟。此机制的底层实现因硬件和操作系统的组合而异,因此延迟不对应于固定时间间隔。
可以与
innodb_spin_wait_pause_multiplier
变量一起使用,以更好地控制自旋锁轮询延迟的持续时间。有关更多信息,请参见 第 17.8.8 节,“配置自旋锁轮询”。
innodb_spin_wait_pause_multiplier
命令行格式 --innodb-spin-wait-pause-multiplier=#
系统变量 innodb_spin_wait_pause_multiplier
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 50
最小值 0
最大值 100
定义一个乘数值,用于确定线程等待获取互斥锁或 rw 锁时发生的循环自旋等待中 PAUSE 指令的数量。
有关更多信息,请参见 第 17.8.8 节,“配置自旋锁轮询”。
-
命令行格式 --innodb-stats-auto-recalc[={OFF|ON}]
系统变量 innodb_stats_auto_recalc
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
导致
InnoDB
在表中的数据发生实质性更改后自动重新计算 持久统计信息。阈值是表中行的 10%。此设置适用于在启用innodb_stats_persistent
选项时创建的表。也可以通过在CREATE TABLE
或ALTER TABLE
语句中指定STATS_AUTO_RECALC=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=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[={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
)或访问 Information SchemaTABLES
或STATISTICS
表时更新非持久性 统计信息。(这些更新类似于对ANALYZE TABLE
的操作。)当禁用时,InnoDB
不会在这些操作期间更新统计信息。使设置保持禁用状态可以提高对包含大量表或索引的模式的访问速度。它还可以提高涉及InnoDB
表的查询的 执行计划 的稳定性。要更改设置,请发出语句
SET GLOBAL innodb_stats_on_metadata=
,其中mode
为mode
ON
或OFF
(或1
或0
)。更改设置需要具有设置全局系统变量的权限(请参阅 第 7.1.9.1 节“系统变量权限”),并立即影响所有连接的操作。 -
命令行格式 --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
访问的数据库页面数量,请参阅 第 17.8.10.3 节“估计 InnoDB 表的 ANALYZE TABLE 复杂度”。innodb_stats_persistent_sample_pages
仅在为表启用innodb_stats_persistent
时适用;当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 量。有关更多信息,请参阅 第 17.8.10.2 节“配置非持久性优化器统计信息参数”。注意为
innodb_stats_transient_sample_pages
设置较高的值可能会导致ANALYZE TABLE
执行时间过长。要估计ANALYZE TABLE
访问的数据库页面数量,请参阅 第 17.8.10.3 节“估计 InnoDB 表的 ANALYZE TABLE 复杂度”。innodb_stats_transient_sample_pages
仅在为表禁用innodb_stats_persistent
时适用;当innodb_stats_persistent
启用时,innodb_stats_persistent_sample_pages
则适用。取代了在 MySQL 8.0 中移除的innodb_stats_sample_pages
。有关更多信息,请参阅 第 17.8.10.2 节“配置非持久性优化器统计信息参数”。-
命令行格式 --innodb-status-output[={OFF|ON}]
系统变量 innodb_status_output
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用或禁用标准
InnoDB
监视器的定期输出。还与innodb_status_output_locks
结合使用来启用或禁用InnoDB
锁监视器的定期输出。有关更多信息,请参阅 第 17.17.2 节“启用 InnoDB 监视器”。 -
命令行格式 --innodb-status-output-locks[={OFF|ON}]
系统变量 innodb_status_output_locks
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用或禁用
InnoDB
锁监视器。启用时,InnoDB
锁监视器会在SHOW ENGINE INNODB STATUS
输出以及定期输出到 MySQL 错误日志中打印有关锁的附加信息。InnoDB
锁监视器的定期输出作为标准InnoDB
监视器输出的一部分打印。因此,必须启用标准InnoDB
监视器才能使InnoDB
锁监视器定期将数据打印到 MySQL 错误日志。有关更多信息,请参阅 第 17.17.2 节“启用 InnoDB 监视器”。 -
命令行格式 --innodb-strict-mode[={OFF|ON}]
系统变量 innodb_strict_mode
范围 全局,会话 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
当
innodb_strict_mode
启用时,InnoDB
会在检查无效或不兼容的表选项时返回错误,而不是警告。它会检查
KEY_BLOCK_SIZE
、ROW_FORMAT
、DATA DIRECTORY
、TEMPORARY
和TABLESPACE
选项是否彼此兼容,以及是否与其他设置兼容。innodb_strict_mode=ON
还会在创建或更改表时启用行大小检查,以防止由于记录过大而无法放入所选页面大小而导致INSERT
或UPDATE
失败。您可以在启动
mysqld
时在命令行中启用或禁用innodb_strict_mode
,或者在 MySQL 配置文件 中启用或禁用。您也可以在运行时使用语句SET [GLOBAL|SESSION] innodb_strict_mode=
启用或禁用mode
innodb_strict_mode
,其中
为mode
ON
或OFF
。更改GLOBAL
设置需要具有设置全局系统变量的权限(请参阅 第 7.1.9.1 节“系统变量权限”),并影响随后连接的所有客户端。任何客户端都可以更改innodb_strict_mode
的SESSION
设置,该设置仅影响该客户端。设置此系统变量的会话值是受限操作。会话用户必须具有设置受限会话变量的权限。请参阅 第 7.1.9.1 节“系统变量权限”。
-
命令行格式 --innodb-sync-array-size=#
系统变量 innodb_sync_array_size
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 1
最小值 1
最大值 1024
定义互斥锁/锁等待数组的大小。增加该值会分割用于协调线程的内部数据结构,以便在具有大量等待线程的工作负载中实现更高的并发性。此设置必须在 MySQL 实例启动时配置,之后无法更改。对于经常产生大量等待线程(通常大于 768 个)的工作负载,建议增加该值。
-
命令行格式 --innodb-sync-spin-loops=#
系统变量 innodb_sync_spin_loops
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 30
最小值 0
最大值 4294967295
线程在被挂起之前等待
InnoDB
互斥锁释放的次数。 -
命令行格式 --innodb-sync-debug[={OFF|ON}]
系统变量 innodb_sync_debug
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
为
InnoDB
存储引擎启用同步调试检查。此选项仅在使用WITH_DEBUG
CMake 选项编译调试支持时才可用。 -
命令行格式 --innodb-table-locks[={OFF|ON}]
系统变量 innodb_table_locks
范围 全局,会话 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
如果
autocommit = 0
,InnoDB
会遵守LOCK TABLES
;MySQL 不会从LOCK TABLES ... WRITE
返回,直到所有其他线程释放对该表的全部锁。innodb_table_locks
的默认值为 1,这意味着如果autocommit = 0
,LOCK TABLES
会导致 InnoDB 在内部锁定表。innodb_table_locks = 0
对使用LOCK TABLES ... WRITE
显式锁定的表没有影响。它会对通过LOCK TABLES ... WRITE
(例如,通过触发器)或LOCK TABLES ... READ
隐式锁定读写表的表产生影响。有关相关信息,请参见 第 17.7 节,“InnoDB 锁定和事务模型”。
-
命令行格式 --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
数据文件具有相同的名称。无法创建全局临时表空间数据文件或在创建时出错将被视为致命错误,并且服务器启动将被拒绝。文件大小以 KB、MB 或 GB 为单位指定,在大小值后追加
K
、M
或G
。文件大小的总和必须略大于 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=dir_name
系统变量 innodb_temp_tablespaces_dir
范围 全局 动态 否 SET_VAR
提示适用否 类型 目录名称 默认值 #innodb_temp
定义
InnoDB
在启动时创建会话临时表空间池的位置。默认位置是数据目录中的#innodb_temp
目录。允许使用完全限定路径或相对于数据目录的路径。会话临时表空间始终存储用户创建的临时表和优化器使用
InnoDB
创建的内部临时表。(以前,内部临时表的磁盘存储引擎由internal_tmp_disk_storage_engine
系统变量确定,该变量不再受支持。请参见 磁盘上的内部临时表的存储引擎。)有关更多信息,请参见 会话临时表空间。
-
命令行格式 --innodb-thread-concurrency=#
系统变量 innodb_thread_concurrency
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 1000
定义
InnoDB
内部允许的最大线程数。值为 0(默认值)被解释为无限并发(无限制)。此变量旨在用于高并发系统上的性能调优。InnoDB
尝试将InnoDB
内部线程数保持在小于或等于innodb_thread_concurrency
限制。等待锁的线程不会计入并发执行线程的数量。正确设置取决于工作负载和计算环境。如果您的 MySQL 实例与其他应用程序共享 CPU 资源,或者您的工作负载或并发用户数量不断增长,请考虑设置此变量。测试一系列值以确定提供最佳性能的设置。
innodb_thread_concurrency
是一个动态变量,允许在活动测试系统上尝试不同的设置。如果某个特定设置的性能很差,您可以快速将innodb_thread_concurrency
设置回 0。使用以下指南来帮助查找和维护适当的设置
如果工作负载的并发用户线程数量始终很小,并且不会影响性能,请将
innodb_thread_concurrency=0
(无限制)设置为。如果您的工作负载始终很重或偶尔出现峰值,请设置
innodb_thread_concurrency
值,并进行调整,直到找到提供最佳性能的线程数量。例如,假设您的系统通常有 40 到 50 个用户,但有时用户数量会增加到 60、70 或更多。通过测试,您发现性能在限制为 80 个并发用户时仍然基本稳定。在这种情况下,请将innodb_thread_concurrency
设置为 80。如果您不希望
InnoDB
为用户线程使用超过一定数量的虚拟 CPU(例如 20 个虚拟 CPU),请将innodb_thread_concurrency
设置为此数字(或者可能更低,具体取决于性能测试)。如果您的目标是将 MySQL 与其他应用程序隔离开来,请考虑将mysqld
进程专门绑定到虚拟 CPU。但是请注意,如果mysqld
进程没有始终处于繁忙状态,则独占绑定会导致硬件使用效率低下。在这种情况下,您可以将mysqld
进程绑定到虚拟 CPU,但允许其他应用程序使用部分或全部虚拟 CPU。注意从操作系统的角度来看,使用资源管理解决方案来管理应用程序之间 CPU 时间的共享方式可能比绑定
mysqld
进程更可取。例如,您可以将 90% 的虚拟 CPU 时间分配给给定应用程序,而其他关键进程 没有 运行,并在其他关键进程 正在 运行时将该值缩减到 40%。在某些情况下,最佳的
innodb_thread_concurrency
设置可能小于虚拟 CPU 的数量。过高的
innodb_thread_concurrency
值会导致系统内部和资源争用增加,从而导致性能下降。定期监控和分析您的系统。工作负载、用户数量或计算环境的变化可能需要您调整
innodb_thread_concurrency
设置。
值为 0 会禁用
SHOW ENGINE INNODB STATUS
输出的ROW OPERATIONS
部分中的queries inside InnoDB
和queries in queue
计数器。有关相关信息,请参见 第 17.8.4 节,“为 InnoDB 配置线程并发性”。
-
命令行格式 --innodb-thread-sleep-delay=#
系统变量 innodb_thread_sleep_delay
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 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=dir_name
系统变量 innodb_tmpdir
范围 全局,会话 动态 是 SET_VAR
提示适用否 类型 目录名称 默认值 NULL
用于定义在线
ALTER TABLE
操作期间创建的临时排序文件的备用目录,这些操作会重建表。在线
ALTER TABLE
操作重建表时,还会在与原始表相同的目录中创建一个 中间 表文件。innodb_tmpdir
选项不适用于中间表文件。有效值是除 MySQL 数据目录路径之外的任何目录路径。如果值为 NULL(默认值),则临时文件将创建在 MySQL 临时目录中(在 Unix 上为
$TMPDIR
,在 Windows 上为%TEMP%
,或由--tmpdir
配置选项指定的目录)。如果指定了目录,则仅在使用SET
语句配置innodb_tmpdir
时检查目录是否存在以及权限。如果目录字符串中提供了符号链接,则将解析符号链接并将其存储为绝对路径。路径不应超过 512 字节。在线ALTER TABLE
操作如果innodb_tmpdir
设置为无效目录,则会报告错误。innodb_tmpdir
会覆盖 MySQL 的tmpdir
设置,但仅适用于在线ALTER TABLE
操作。配置
innodb_tmpdir
需要FILE
权限。引入
innodb_tmpdir
选项是为了帮助避免位于tmpfs
文件系统上的临时文件目录溢出。这种溢出可能是由于在线ALTER TABLE
操作重建表时创建的大型临时排序文件导致的。在复制环境中,仅当所有服务器具有相同的操作系统环境时,才考虑复制
innodb_tmpdir
设置。否则,复制innodb_tmpdir
设置可能会在运行在线ALTER TABLE
操作重建表时导致复制失败。如果服务器操作系统环境不同,建议您分别在每台服务器上配置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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 0
最小值 0
最大值 1024
设置一个调试标志,将
TRX_RSEG_N_SLOTS
限制为trx_rsegf_undo_find_free
函数的给定值,该函数用于查找撤消日志段的空闲槽位。此选项仅在使用WITH_DEBUG
CMake 选项编译了调试支持时才可用。 -
命令行格式 --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[={OFF|ON}]
系统变量 innodb_undo_log_encrypt
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
控制使用
InnoDB
静态数据加密功能 加密的表的撤消日志数据的加密。仅适用于位于单独的 撤消表空间 中的撤消日志。请参见 第 17.6.3.4 节,“撤消表空间”。不支持对位于系统表空间中的撤消日志数据进行加密。有关更多信息,请参见 撤消日志加密。 -
命令行格式 --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
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 2
最小值 2
最大值 127
定义
InnoDB
使用的 撤消表空间 数量。默认值和最小值为 2。注意innodb_undo_tablespaces
变量已弃用;设置它无效。您应该预计它将在未来的 MySQL 版本中被删除。有关更多信息,请参见 第 17.6.3.4 节,“撤消表空间”。
-
命令行格式 --innodb-use-fdatasync[={OFF|ON}]
系统变量 innodb_use_fdatasync
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
在支持
fdatasync()
系统调用的平台上,启用innodb_use_fdatasync
允许使用fdatasync()
代替fsync()
系统调用进行操作系统刷新。fdatasync()
调用不会刷新对文件元数据的更改,除非后续数据检索需要这些更改,从而提供潜在的性能优势。一组
innodb_flush_method
设置(例如fsync
、O_DSYNC
和O_DIRECT
)使用fsync()
系统调用。innodb_use_fdatasync
变量在使用这些设置时适用。在 MySQL 8.4 之前,此选项默认情况下处于禁用状态。
-
命令行格式 --innodb-use-native-aio[={OFF|ON}]
系统变量 innodb_use_native_aio
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 ON
指定是否使用 异步 I/O 子系统。此变量在服务器运行时无法更改。通常,您不需要配置此选项,因为它默认情况下处于启用状态。
此功能提高了高度 I/O 密集型系统的可扩展性,这些系统通常在
SHOW ENGINE INNODB STATUS
输出中显示许多挂起的读/写操作。使用大量
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}]
系统变量 innodb_validate_tablespace_paths
范围 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 ON
控制表空间文件路径验证。在启动时,
InnoDB
会将已知表空间文件的路径与存储在数据字典中的表空间文件路径进行验证,以防表空间文件已移动到其他位置。innodb_validate_tablespace_paths
变量允许禁用表空间路径验证。此功能适用于表空间文件不会移动的环境。禁用路径验证可以提高具有大量表空间文件的系统的启动时间。警告在移动表空间文件后,使用禁用表空间路径验证启动服务器会导致未定义的行为。
有关更多信息,请参见 第 17.6.3.7 节,“禁用表空间路径验证”。
InnoDB
版本号。这是一个遗留变量,其值与 MySQL 服务器的version
相同。-
命令行格式 --innodb-write-io-threads=#
系统变量 innodb_write_io_threads
范围 全局 动态 否 SET_VAR
提示适用否 类型 整数 默认值 4
最小值 1
最大值 64
InnoDB
中写入操作的 I/O 线程数。默认值为 4。其读取线程的对应项为innodb_read_io_threads
。有关更多信息,请参见 第 17.8.5 节,“配置后台 InnoDB I/O 线程的数量”。有关一般 I/O 调整建议,请参见 第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。注意在 Linux 系统上,运行多个 MySQL 服务器(通常超过 12 个)并使用
innodb_read_io_threads
、innodb_write_io_threads
和 Linuxaio-max-nr
设置的默认设置可能会超过系统限制。理想情况下,请增加aio-max-nr
设置;作为一种变通方法,您可以减少一个或两个 MySQL 变量的设置。还要考虑
sync_binlog
的值,它控制将二进制日志同步到磁盘。有关常规 I/O 调整建议,请参见 第 10.5.8 节,“优化 InnoDB 磁盘 I/O”。