可以通过在服务器启动时命名系统变量来启用它们(如果它们的值为 true 或 false),或者使用
--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
的值。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[={OFF|ON}]
系统变量 innodb_buffer_pool_debug
作用域 全局 动态 否 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用此选项允许在缓冲池小于 1GB 时使用多个缓冲池实例,忽略对
innodb_buffer_pool_instances
设置的 1GB 最小缓冲池大小限制。innodb_buffer_pool_debug
选项仅在使用WITH_DEBUG
CMake 选项编译调试支持时可用。 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=文件名
系统变量 innodb_buffer_pool_filename
作用域 全局 动态 是 SET_VAR
提示适用否 类型 文件名 默认值 ib_buffer_pool
指定包含由
innodb_buffer_pool_dump_at_shutdown
或innodb_buffer_pool_dump_now
生成的表空间 ID 和页面 ID 列表的文件的名称。表空间 ID 和页面 ID 以以下格式保存:空间, 页面 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
变量,并且要禁用此选项,操作系统必须支持madvise()
的MADV_DONTDUMP
非 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
缓冲池 被划分的区域数量。对于缓冲池位于数 GB 范围内的系统,将缓冲池划分为单独的实例可以提高并发性,方法是减少不同线程读取和写入缓存页面时的争用。存储在缓冲池中或从缓冲池中读取的每个页面都会使用哈希函数随机分配给其中一个缓冲池实例。每个缓冲池都管理自己的空闲列表、刷新列表、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 字节(128MB)。最大值取决于 CPU 架构;32 位系统上的最大值为 4294967295 (232-1),64 位系统上的最大值为 18446744073709551615 (264-1)。在 32 位系统上,CPU 架构和操作系统可能会施加低于所述最大值的实际最大大小。当缓冲池的大小大于 1GB 时,将innodb_buffer_pool_instances
设置为大于 1 的值可以提高繁忙服务器上的可伸缩性。较大的缓冲池需要较少的磁盘 I/O 才能多次访问相同的表数据。在专用数据库服务器上,可以将缓冲池大小设置为机器物理内存大小的 80%。配置缓冲池大小时,请注意以下潜在问题,并准备好在必要时缩减缓冲池的大小。
对物理内存的争用会导致操作系统中的页面调度。
InnoDB
会为缓冲区和控制结构保留额外的内存,因此总分配空间大约比指定的缓冲池大小大 10%。缓冲池的地址空间必须是连续的,这在 DLL 加载到特定地址的 Windows 系统上可能是一个问题。
初始化缓冲池的时间与其大小大致成正比。在具有大型缓冲池的实例上,初始化时间可能很长。要缩短初始化时间,可以在服务器关闭时保存缓冲池状态并在服务器启动时恢复它。请参阅第 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=值
系统变量 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=文件名
系统变量 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]]
文件大小以千字节、兆字节或千兆字节为单位指定,方法是在大小值后附加
K
、M
或G
。如果以千字节为单位指定数据文件大小,请以 1024 的倍数进行指定。否则,KB 值将四舍五入到最接近的兆字节 (MB) 边界。文件大小总和必须至少略大于 12MB。有关其他配置信息,请参阅 系统表空间数据文件配置。有关调整大小的说明,请参阅 调整系统表空间的大小。
-
命令行格式 --innodb-data-home-dir=目录名
系统变量 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
会弄脏指定的页面。仅当使用WITH_DEBUG
CMake 选项编译调试支持时,innodb_fil_make_page_dirty_debug
选项才可用。-
命令行格式 --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 操作时可能获得的更高性能之间的平衡。您可以通过更改默认值来获得更好的性能,但这样您可能会在崩溃中丢失事务。
完全符合 ACID 需要默认设置 1。日志在每次事务提交时写入并刷新到磁盘。
如果设置为 0,日志将每秒写入并刷新到磁盘一次。在崩溃中可能会丢失日志尚未刷新的事务。
如果设置为 2,则在每次事务提交后写入日志,并每秒将日志刷新到磁盘一次。在崩溃中可能会丢失日志尚未刷新的事务。
对于设置 0 和 2,不能 100% 保证每秒刷新一次。由于 DDL 更改和其他导致日志独立于
innodb_flush_log_at_trx_commit
设置而刷新的内部InnoDB
活动,刷新可能会更频繁地发生,有时由于调度问题而刷新频率会降低。如果每秒刷新一次日志,则在崩溃中最多可能会丢失一秒的事务。如果日志刷新频率高于或低于每秒一次,则可能丢失的事务数量也会相应变化。日志刷新频率由
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=值
系统变量 innodb_flush_method
作用域 全局 动态 否 SET_VAR
提示适用否 类型 字符串 默认值(Unix) 如果支持,则为 O_DIRECT,否则为 fsync
默认值(Windows) 无缓冲
有效值(Unix) fsync
O_DSYNC
littlesync
nosync
O_DIRECT
O_DIRECT_NO_FSYNC
有效值(Windows) 无缓冲
正常
定义用于将数据刷新到
InnoDB
数据文件和日志文件的方法,这会影响 I/O 吞吐量。在类 Unix 系统上,如果支持
O_DIRECT
,则默认值为O_DIRECT
,否则默认为fsync
。在 Windows 上,默认值为unbuffered
。类 Unix 系统的
innodb_flush_method
选项包括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
变量会导致在 检查点 发生的 I/O 活动突发期间忽略innodb_io_capacity
和innodb_io_capacity_max
设置。要遵循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=数据库名称/表名称
系统变量 innodb_ft_server_stopword_table
作用域 全局 动态 是 SET_VAR
提示适用否 类型 字符串 默认值 NULL
此选项用于为所有
InnoDB
表指定您自己的InnoDB
FULLTEXT
索引停用词列表。要为特定的InnoDB
表配置您自己的停用词列表,请使用innodb_ft_user_stopword_table
。将
innodb_ft_server_stopword_table
设置为包含停用词列表的表的名称,格式为
。数据库名称
/表名称
在配置
innodb_ft_server_stopword_table
之前,停用词表必须存在。innodb_ft_enable_stopword
必须启用,并且必须在创建FULLTEXT
索引之前配置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
索引中文本的线程数。 -
命令行格式 --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
作用域 全局,会话 动态 是 SET_VAR
提示适用否 类型 字符串 默认值 NULL
此选项用于在特定表上指定您自己的
InnoDB
FULLTEXT
索引停用词列表。要为所有InnoDB
表配置您自己的停用词列表,请使用innodb_ft_server_stopword_table
。将
innodb_ft_user_stopword_table
设置为包含停用词列表的表的名称,格式为
。数据库名称
/表名称
在配置
innodb_ft_user_stopword_table
之前,停用词表必须存在。innodb_ft_enable_stopword
必须启用,并且必须在创建FULLTEXT
索引之前配置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
最大值(64 位平台,8.4.0) 2**64-1
最大值 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
可以更积极地刷新,其每秒 I/O 操作数 (IOPS) 比innodb_io_capacity
变量定义的速率更高。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 节“死锁检测”。可以使用
SET GLOBAL
或SET SESSION
语句在运行时设置innodb_lock_wait_timeout
。更改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
部分中的日志序列号
(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
已被innodb_redo_log_capacity
取代;请参阅 第 17.6.5 节“重做日志”。日志组 中每个 日志文件 的大小(以字节为单位)。日志文件的总大小(
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_log_file_size
和innodb_log_files_in_group
已被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=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 核心的服务器上,两个 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 位平台,8.4.0) 2**64-1
最大值 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_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[={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
最大值(64 位平台,8.4.0) 2**64-1
最大值 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
定义所需的 purge 最大滞后时间。如果超过此值,则会对
INSERT
、UPDATE
和DELETE
操作施加延迟,以便留出时间让 purge 赶上来。默认值为 0,这意味着没有 purge 最大滞后时间,也没有延迟。有关更多信息,请参阅 第 17.8.9 节“Purge 配置”。
-
命令行格式 --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 节“Purge 配置”。
-
命令行格式 --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
选项可用,必须在支持 NUMA 的 Linux 系统上编译 MySQL。如果系统支持,则默认值为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
线程的优先级,以帮助页面刷新跟上当前的工作负载。以下InnoDB
启动消息指示了对setpriority()
的支持[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,则为 1;否则为 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。减小此值会增加清除线程释放回滚段的频率。
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 系统上,对
innodb_read_io_threads
、innodb_write_io_threads
和 Linuxaio-max-nr
设置使用默认设置运行多个 MySQL 服务器(通常超过 12 个)可能会超过系统限制。理想情况下,请增加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
定义一个乘数值,用于确定在线程等待获取互斥锁或读写锁时发生的spin-wait循环中的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=值
系统变量 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=
,其中模式
为模式
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
计算的统计信息)时要采样的索引 页 数。增加该值可以提高索引统计信息的准确性,从而可以改进 查询执行计划,但代价是执行InnoDB
表的ANALYZE TABLE
期间的 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
Monitor 的定期输出。还可以与innodb_status_output_locks
结合使用,以启用或禁用InnoDB
Lock Monitor 的定期输出。有关详细信息,请参阅 第 17.17.2 节“启用 InnoDB Monitor”。 -
命令行格式 --innodb-status-output-locks[={OFF|ON}]
系统变量 innodb_status_output_locks
作用域 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
启用或禁用
InnoDB
Lock Monitor。启用后,InnoDB
Lock Monitor 会在SHOW ENGINE INNODB STATUS
输出和打印到 MySQL 错误日志的定期输出中打印有关锁的附加信息。将InnoDB
Lock Monitor 的定期输出作为标准InnoDB
Monitor 输出的一部分进行打印。因此,必须启用标准InnoDB
Monitor,InnoDB
Lock Monitor 才能定期将数据打印到 MySQL 错误日志。有关详细信息,请参阅 第 17.17.2 节“启用 InnoDB Monitor”。 -
命令行格式 --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=文件名
系统变量 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=目录名
系统变量 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
部分中的InnoDB 内部的查询
和队列中的查询
计数器。有关信息,请参阅 第 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=目录名
系统变量 innodb_tmpdir
作用域 全局,会话 动态 是 SET_VAR
提示适用否 类型 目录名 默认值 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
会覆盖 MySQLtmpdir
设置,但仅适用于在线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=目录名
系统变量 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 服务器版本
相同。-
命令行格式 --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 系统上,对
innodb_read_io_threads
、innodb_write_io_threads
和 Linuxaio-max-nr
设置使用默认设置运行多个 MySQL 服务器(通常超过 12 个)可能会超过系统限制。理想情况下,请增加aio-max-nr
设置;作为一种解决方法,您可以减少其中一个或两个 MySQL 变量的设置。还要考虑
sync_binlog
的值,该值控制二进制日志与磁盘的同步。有关常规 I/O 调整建议,请参见“10.5.8 优化 InnoDB 磁盘 I/O”。