17.14 InnoDB 启动选项和系统变量
-
可以通过名称启用或禁用布尔类型的系统变量,或者使用
--skip-
前缀来禁用它们。例如,可以使用--innodb-adaptive-hash-index
或--skip-innodb-adaptive-hash-index
在命令行上启用或禁用InnoDB自适应哈希索引,或者在选项文件中使用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_名
=值
的形式指定。var_名
=值
-
许多系统变量可以在运行时更改(请参阅第7.1.9.2节,“动态系统变量”)。
-
关于
GLOBAL
和SESSION
变量作用域修饰符的信息,请参阅SET
语句文档。 -
某些选项控制
InnoDB
数据文件的位置和布局。第17.8.1节,“InnoDB 启动配置”解释了如何使用这些选项。 -
一些选项,可能您最初不需要使用,但可以根据机器容量和数据库工作负载来调整
InnoDB
性能特征。 -
关于指定选项和系统变量的更多信息,请参阅第6.2.2节,“指定程序选项”。
表17.23 InnoDB 选项和变量参考
-
Command-Line Format --innodb-status-file[={OFF|ON}]
Type Boolean Default Value OFF
启动选项
--innodb-status-file
控制是否创建名为innodb_status_
的文件,并将pid
SHOW ENGINE INNODB STATUS
输出写入其中,每隔约15秒。默认情况下,不创建
innodb_status_
文件。要创建该文件,请使用pid
--innodb-status-file
选项启动mysqld。InnoDB
在正常关闭服务器时删除该文件。如果发生非正常关闭,可能需要手动删除状态文件。选项
--innodb-status-file
旨为临时使用,因为SHOW ENGINE INNODB STATUS
输出生成可能影响性能,并且innodb_status_
文件可能会随时间增长而变得很大。pid
相关信息,请见第17.17.2节,“启用InnoDB监控”。
-
Command-Line Format --innodb-adaptive-flushing[={OFF|ON}]
System Variable innodb_adaptive_flushing
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
指定是否动态调整
InnoDB
缓冲池中的脏页flush率,根据工作负载进行调整。动态调整flush率的目的是避免I/O活动的burst。这项设置默认启用。请参阅第17.8.3.5节,“配置缓冲池flushing”获取更多信息。对于一般I/O优化建议,请参阅第10.5.8节,“优化InnoDB磁盘I/O”。 -
Command-Line Format --innodb-adaptive-flushing-lwm=#
System Variable innodb_adaptive_flushing_lwm
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 10
Minimum Value 0
Maximum Value 70
定义了redo日志容量百分比的低水位标记,表示adaptive flushing启用时的redo日志容量百分比。更多信息,请参见第17.8.3.5节,“配置缓冲池刷新”。
-
Command-Line Format --innodb-adaptive-hash-index[={OFF|ON}]
System Variable innodb_adaptive_hash_index
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
是否启用或禁用InnoDB的adaptive hash index。根据您的工作负载,您可能需要动态地启用或禁用adaptive hash indexing以提高查询性能。由于adaptive hash index可能对所有工作负载都不是有用的,因此使用实际工作负载进行benchmark,既启用又禁用adaptive hash indexing。详细信息请见第17.5.3节,“Adaptive Hash Index”。
这个变量默认禁用。您可以使用
SET GLOBAL
语句在不重新启动服务器的情况下修改该参数。更改设置需要具有足够权限以设置全局系统变量。请参阅第7.1.9.1节,“系统变量权限”。您也可以在服务器启动时使用--innodb-adaptive-hash-index
来启用它。禁用自适应哈希索引将立即清空哈希表。正常操作可以继续进行,而哈希表正在被清空时,执行使用哈希表访问索引B-树的查询将直接访问索引B-树。当自适应哈希索引重新启用时,哈希表将在正常操作中被重建。
在MySQL 8.4之前,这个选项默认启用。
-
innodb_adaptive_hash_index_parts
Command-Line Format --innodb-adaptive-hash-index-parts=#
System Variable innodb_adaptive_hash_index_parts
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 数字 Default Value 8
Minimum Value 1
Maximum Value 512
将自适应哈希索引搜索系统分区。每个索引都绑定到一个特定的分区,每个分区由单独的锁保护。
默认情况下,自适应哈希索引搜索系统被分为8个部分。最大设置值是512。
有关相关信息,请参见第17.5.3节,“Adaptive Hash Index”。
-
innodb_adaptive_max_sleep_delay
Command-Line Format --innodb-adaptive-max-sleep-delay=#
System Variable innodb_adaptive_max_sleep_delay
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 150000
Minimum Value 0
Maximum Value 1000000
Unit 微秒 允许InnoDB自动调整
innodb_thread_sleep_delay
的值,以适应当前工作负载。任何非零值都启用了动态调整innodb_thread_sleep_delay
的值,直到指定在innodb_adaptive_max_sleep_delay
选项中的最大值。该值表示微秒。这一选项对繁忙系统非常有用,特别是MySQL系统具有数百或数千个同时连接的线程。更多信息,请见第17.8.4节,“InnoDB线程并发配置”。
-
Command-Line Format --innodb-autoextend-increment=#
System Variable innodb_autoextend_increment
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 64
Minimum Value 1
Maximum Value 1000
Unit 兆字节 当自动扩展的InnoDB系统表空间文件满时,扩展大小(以兆字节为单位)。默认值为64。相关信息,请见系统表空间数据文件配置和调整系统表空间。
innodb_autoextend_increment
设置不影响文件表空间或通用表空间文件。这些文件无论innodb_autoextend_increment
设置如何,都将自动扩展。初始扩展是小的量,随后扩展将以4MB为增量。 -
Command-Line Format --innodb-autoinc-lock-mode=#
System Variable innodb_autoinc_lock_mode
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 2
Valid Values 0
1
2
用于生成自增值的锁定模式。允许的值是0、1或2,分别对应传统、连续或交错锁定。
默认设置为2(交错),以兼容行基于复制。
每种锁定模式的特性,请参见InnoDB AUTO_INCREMENT 锁定模式。
-
innodb_background_drop_list_empty
Command-Line Format --innodb-background-drop-list-empty[={OFF|ON}]
System Variable innodb_background_drop_list_empty
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用
innodb_background_drop_list_empty
调试选项可以避免测试用例失败,延迟表创建直到背景删除列表为空。例如,如果测试用例A将表t1
添加到背景删除列表,然后测试用例B等待背景删除列表为空后再创建表t1
。 -
Command-Line Format --innodb-buffer-pool-chunk-size=#
System Variable innodb_buffer_pool_chunk_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 134217728
Minimum Value 1048576
Maximum Value innodb_缓冲池大小 / innodb_缓冲池实例数
Unit 字节 innodb_缓冲池块大小
定义了InnoDB
缓冲池 resize 操作的块大小。为了避免在 resize 操作中复制所有缓冲池页面,操作将以“块”方式进行。默认情况下,
innodb_缓冲池块大小
是 128MB(134217728 字节)。块中包含的页面数取决于innodb_page_size
的值。innodb_缓冲池块大小
可以增加或减少,单位为 1MB(1048576 字节)。以下条件适用于更改
innodb_缓冲池块大小
值:-
如果
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
的倍数。调整发生在缓冲池初始化时。
Important在更改
innodb_buffer_pool_chunk_size
时,需要注意,因为这将自动增加缓冲池的大小。在更改innodb_buffer_pool_chunk_size
之前,计算其对innodb_buffer_pool_size
的影响,以确保结果缓冲池大小是可接受的。为了避免潜在性能问题,chunks 的数量(
innodb_buffer_pool_size
/innodb_buffer_pool_chunk_size
) shouldn't exceed 1000。变量
innodb_buffer_pool_size
是动态的,这允许在服务器在线时调整缓冲池大小。然而,缓冲池大小必须等于或是innodb_buffer_pool_chunk_size
*innodb_buffer_pool_instances
的倍数,并且更改这两个变量设置需要重新启动服务器。请查看第17.8.3.1节,“配置InnoDB缓冲池大小”以获取更多信息。
-
-
Command-Line Format --innodb-buffer-池调试[={OFF|ON}]
System Variable innodb_buffer_池调试
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用该选项允许在缓冲池大小小于1GB时创建多个缓冲池实例,忽略
innodb_buffer_pool_instances
的最小缓冲池大小限制。innodb_buffer_池调试
选项仅在使用WITH_DEBUG
CMake 选项编译时可用。 -
Command-Line Format --innodb-缓冲池dump_at_shutdown[={OFF|ON}]
System Variable innodb_缓冲池dump_at_shutdown
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
指定在 MySQL 服务器关闭时记录
InnoDB
缓冲池中的页面,以缩短下一次启动的 暖启动 过程。通常与innodb_buffer_pool_load_at_startup
结合使用。innodb_buffer_pool_dump_pct
选项定义最近最多使用的缓冲池页面百分比。both
innodb_buffer_pool_dump_at_shutdown
和innodb_buffer_pool_load_at_startup
都默认启用。更多信息,请见第17.8.3.6节,“保存和恢复缓冲池状态”。
-
Command-Line Format --innodb-buffer-pool-dump-now[={OFF|ON}]
System Variable innodb_buffer_pool_dump_now
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
立即将
InnoDB
缓冲池中的页面记录到缓冲池缓冲池中。通常与innodb_buffer_pool_load_now
组合使用。启用
innodb_buffer_pool_dump_now
将触发记录操作,但不会改变变量设置,该变量始终保持OFF
或0
。要查看缓冲池dump状态后触发dump,请查询Innodb_buffer_pool_dump_status
变量。启用
innodb_buffer_pool_dump_now
将触发dump操作,但不会改变变量设置,该变量始终保持OFF
或0
。要查看缓冲池dump状态后触发dump,请查询Innodb_buffer_pool_dump_status
变量。更多信息请见第17.8.3.6节,“保存和恢复缓冲池状态”。
-
Command-Line Format --innodb-buffer-pool-dump-pct=#
System Variable innodb_buffer_pool_dump_pct
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 25
Minimum Value 1
Maximum Value 100
指定最近使用的页面百分比,以便读取和dump缓冲池。范围为1到100。默认值为25。例如,如果有4个缓冲池,每个缓冲池有100页,并且
innodb_buffer_pool_dump_pct
设置为25,则从每个缓冲池中dump最近使用的25页。 -
Command-Line Format --innodb-buffer-pool-filename=file_name
System Variable innodb_buffer_pool_filename
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 文件名 Default Value ib_buffer_pool
指定存储空间ID和页面ID的文件名称,该文件由
innodb_buffer_pool_dump_at_shutdown
或innodb_buffer_pool_dump_now
生成。存储空间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
Command-Line Format --innodb-buffer-pool-in-core-file[={OFF|ON}]
System Variable innodb_buffer_pool_in_core_file
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type 布尔值 Default Value OFF
禁用(默认)
innodb_buffer_pool_in_core_file
变量可以减少核心文件的大小,排除InnoDB缓冲池页面。要使用该变量,必须启用
core_file
变量,并且禁用该选项的操作系统必须支持MADV_DONTDUMP
非 POSIX 扩展到madvise()
,Linux 3.4 及更高版本支持。更多信息,请见第17.8.3.7节,“排除或包括缓冲池页面从核心文件”。默认情况下在支持
MADV_DONTDUMP
的系统上禁用该选项,这通常只限于 Linux,而不是 macOS 或 Windows。在 MySQL 8.4 之前,该选项默认启用。
-
Command-Line Format --innodb-buffer-pool-instances=#
System Variable innodb_buffer_pool_instances
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value see description
Minimum Value 1
Maximum Value 64
InnoDB 缓冲池被分割成的区域数。对于具有多个GB缓冲池的系统,分割缓冲池可以提高并发性,通过减少不同线程读取和写入到缓存页面的竞争。每个缓存页面都将被随机地分配给一个缓冲池实例中,使用哈希函数。每个缓冲池管理自己的免费列表、刷新列表、LRUs和所有与缓冲池相关的数据结构,并且被保护着自己的缓冲池锁定。
总的缓冲池大小将被分配给所有缓冲池。为了获得最佳效率,请指定
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/2为计算 -
CPU提示:以可用逻辑处理器的1/4为计算
有关相关信息,请参见第17.8.3.1节,“配置InnoDB缓冲池大小”。
-
-
Command-Line Format --innodb-buffer-pool-load-abort[={OFF|ON}]
System Variable innodb_buffer_pool_load_abort
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
中断恢复InnoDB
innodb_buffer_pool_load_at_startup
或innodb_buffer_pool_load_now
触发的缓冲池内容恢复过程。启用
innodb_buffer_pool_load_abort
将触发中断操作,但不会改变变量设置,这个变量始终保持在OFF
或0
。要查看缓冲池加载状态后触发的中断操作,请查询Innodb_buffer_pool_load_status
变量。更多信息请见第17.8.3.6节,“保存和恢复缓冲池状态”。
-
innodb_buffer_pool_load_at_startup
Command-Line Format --innodb-buffer-pool-load-at-startup[={OFF|ON}]
System Variable innodb_buffer_pool_load_at_startup
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value 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节,“保存和恢复缓冲池状态”。
-
Command-Line Format --innodb-buffer-pool-load-now[={OFF|ON}]
System Variable innodb_buffer_pool_load_now
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
立即暖启动 InnoDB 缓冲池,加载数据页而不等待服务器重启。可以在性能测试或恢复 MySQL 服务器到正常工作负载时使用。
启用
innodb_buffer_pool_load_now
触发加载操作,但不会改变变量设置,该变量始终保持OFF
或0
。要查看缓冲池加载进度,请查询Innodb_buffer_pool_load_status
变量。更多信息请见第17.8.3.6节,“保存和恢复缓冲池状态”。
-
Command-Line Format --innodb-buffer-pool-size=#
System Variable innodb_buffer_pool_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 134217728
Minimum Value 5242880
Maximum Value (64-bit platforms) 2**64-1
Maximum Value (32-bit platforms) 2**32-1
Unit 字节 缓冲池的大小(以字节为单位),是缓冲池的内存区域,用于
InnoDB
缓存表和索引数据。默认值为134217728字节(128MB)。最大值取决于CPU架构;在32位系统中,最大值为4294967295(2^32-1),在64位系统中,最大值为18446744073709551615(2^64-1)。在32位系统中,CPU架构和操作系统可能会对实际最大大小施加限制。缓冲池的大小大于1GB时,设置innodb_buffer_pool_instances
到一个值大于1可以提高忙碌服务器的可扩展性。更大的缓冲池需要更少的磁盘I/O来访问同一表数据多次。在专门的数据库服务器上,您可能将缓冲池大小设置为机器的物理内存大小的80%。在配置缓冲池大小时,请注意以下潜在问题,并准备缩小缓冲池大小如果必要。
-
操作系统中的物理内存竞争可能会导致paging。
-
InnoDB
保留了用于缓冲和控制结构的额外内存,因此实际分配空间大约是指定的缓冲池大小的10%以上。 -
缓冲池的地址空间必须连续,这在Windows系统中可能会遇到问题,因为DLLs需要加载到特定的地址上。
-
初始化缓冲池的时间大致与其大小成正比。在具有大缓冲池的实例中,初始化时间可能会很长。为了减少初始化期限,您可以在服务器关闭时保存缓冲池状态,并在服务器启动时恢复它。请参阅第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
报告在线缓冲池resize操作的状态。请参阅第17.8.3.1节,“配置 InnoDB 缓冲池大小”获取更多信息。如果
innodb_dedicated_server
启用,innodb_buffer_pool_size
值将自动配置,如果未明确定义。请参阅第17.8.12节,“启用专用的 MySQL 服务器自动配置”获取更多信息。 -
-
Command-Line Format --innodb-change-buffer-max-size=#
System Variable innodb_change_buffer_max_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 25
Minimum Value 0
Maximum Value 50
InnoDB 变更缓冲区的最大大小,作为总buffer池大小的百分比。您可能会为具有大量插入、更新和删除活动的 MySQL 服务器增加这个值,或者为用于报告的 MySQL 服务器减少该值。更多信息,请见第17.5.2节,“变更缓冲区”。对于一般I/O优化建议,请见第10.5.8节,“Optimizing InnoDB Disk I/O”。
-
Command-Line Format --innodb-change-buffering=value
System Variable innodb_change_buffering
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value none
Valid Values none
inserts
deletes
changes
purges
all
是否InnoDB执行更改缓冲,这是一个优化技术,它将延迟写操作到次要索引,以便在I/O操作可以顺序进行。允许的值在以下表格中描述。值也可以以数字形式指定。
表17.24:InnoDB更改缓冲允许值
Value Numeric Value Description none
0
默认值。不要缓冲任何操作。 inserts
1
缓冲插入操作。 deletes
2
缓冲删除标记操作;严格来说,是在purge操作中将索引记录标记为后续删除的写操作。 changes
3
缓冲插入和删除标记操作。 purges
4
缓冲背景中发生的物理删除操作。 all
5
缓冲插入、删除标记操作和purge操作。
在MySQL 8.4之前,默认值是
all
。更多信息,请见第17.5.2节,“Change Buffer”。关于一般I/O调整建议,请见第10.5.8节,“Optimizing InnoDB Disk I/O”。
-
Command-Line Format --innodb-change-buffering-debug=#
System Variable innodb_change_buffering_debug
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 2
设置InnoDB更改缓冲的调试标志。值为1强制所有更改到更改缓冲中。值为2导致在合并时出现意外退出。默认值为0表示更改缓冲调试标志未设置。这项选项仅在使用
WITH_DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-checkpoint-disabled[={OFF|ON}]
System Variable innodb_checkpoint_disabled
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
这是一个专门用于高级调试的选项。它禁用检查点,以便在服务器退出时始终触发
InnoDB
恢复。应该只在短时间内启用该选项,通常是在运行写入redo日志条目的DML操作之前。这一选项仅在使用WITH_ DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-checksum-algorithm=value
System Variable innodb_checksum_algorithm
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Enumeration Default Value crc32
Valid Values 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值
Value Generated checksum (when writing) Permitted checksums (when reading) 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
如果遇到有效但不匹配的校验和,会打印错误信息。 -
Command-Line Format --innodb-cmp-per-index-enabled[={OFF|ON}]
System Variable innodb_cmp_per_index_enabled
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用信息_schema中的
INNODB_ CMP_PER_INDEX
表中的每个索引压缩相关统计信息。由于这些统计信息可能会很耗时,仅在开发、测试或副本实例中启用该选项,以便在InnoDB
压缩表的性能调整过程中进行。更多信息,请见第28.4.8节,“The INFORMATION_SCHEMA INNODB_CMP_PER_INDEX and INNODB_CMP_PER_INDEX_RESET Tables”和第17.9.1.4节,“Monitoring InnoDB Table Compression at Runtime”。
-
Command-Line Format --innodb-commit-concurrency=#
System Variable innodb_commit_concurrency
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 1000
可以同时提交的线程数量。默认值为0,允许任意数量的事务同时提交。
innodb_commit_concurrency
的值不能在运行时从0更改为非零或反之。可以将该值从一个非零值更改为另一个非零值。 -
Command-Line Format --innodb-compress-debug=value
System Variable innodb_compress_debug
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value none
Valid Values none
zlib
lz4
lz4hc
使用指定的压缩算法对所有表进行压缩,不需要为每个表定义
COMPRESSION
属性。这选项仅在使用WITH_DEBUG
CMake选项编译debug支持时可用。 -
innodb_compression_failure_threshold_pct
Command-Line Format --innodb-compression-failure-threshold-pct=#
System Variable innodb_compression_failure_threshold_pct
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 5
Minimum Value 0
Maximum Value 100
定义了表的压缩失败率阈值,作为百分比,当MySQL开始在压缩页面中添加填充以避免昂贵的压缩失败。当达到这个阈值时,MySQL开始在每个新的压缩页面中留下动态调整的额外空闲空间,以至于指定的页面大小百分比由
innodb_ compression_pad_pct_max
控制。值为零将禁用监控压缩效率和动态调整填充量的机制。 -
Command-Line Format --innodb-compression-level=#
System Variable innodb_ compression_level
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 6
Minimum Value 0
Maximum Value 9
指定用于
InnoDB
压缩表和索引的 zlib 压缩级别。更高的值可以将更多数据存储在存储设备上,但是在压缩过程中需要更多 CPU 资源。较低的值可以减少 CPU 资源使用,当存储空间不是关键因素或您期望数据不太可压缩时。 -
innodb_compression_pad_pct_max
Command-Line Format --innodb-compression-pad-pct-max=#
System Variable innodb_compression_pad_pct_max
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 50
Minimum Value 0
Maximum Value 75
指定每个压缩页面中可以保留的最大百分比空闲空间,以便在更新压缩表或索引时,重新组织数据和修改日志。只适用于当
innodb_compression_failure_threshold_pct
设置为非零值,并且压缩失败率超过阈值时。更多信息,请见第17.9.1.6节,“OLTP工作负载中的压缩”。
-
Command-Line Format --innodb-concurrency-tickets=#
System Variable innodb_concurrency_tickets
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 5000
Minimum Value 1
Maximum Value 4294967295
确定可以同时进入
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
报告显示了当前事务在队列中的剩余票数。这一数据也可以从信息_schemaINNODB_TRX
表的TRX_CONCURRENCY_TICKETS
列中获得。更多信息,请见第17.8.4节,“InnoDB线程并发配置”。
-
Command-Line Format --innodb-数据-文件-路径=file_name
System Variable innodb_数据_文件_路径
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 字符串 Default Value ibdata1:12M:autoextend
定义了
InnoDB
系统表空间数据文件的名称、大小和属性。如果未指定innodb_数据_文件_路径
的值,缺省行为是创建一个自动扩展的数据文件,大小略大于 12MB,名称为ibdata1
。数据文件指定语法包括文件名、文件大小、
autoextend
属性和max
属性:file_name:file_size[:autoextend[:max:max_file_size]]
文件大小以千字节、兆字节或吉字节为单位,通过在大小值后添加
K
、M
或G
来指定。如果指定数据文件大小,以千字节为单位,请使用1024的倍数。否则,KB 值将被舍入到最近的兆字节(MB)边界。文件大小之和必须至少略大于 12MB。为了获取更多配置信息,请查看System Tablespace Data File Configuration。对于调整大小的指南,请查看Resizing the System Tablespace.
-
Command-Line Format --innodb-data-home-dir=dir_name
System Variable innodb_data_home_dir
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type 目录名称 InnoDB 系统表空间数据文件的公共目录路径部分。默认值是 MySQL 的
data
目录。设置将与innodb_data_file_path
设置concatenate,除非该设置使用绝对路径。指定
innodb_data_home_dir
值时需要添加尾部斜杠。例如:[mysqld] innodb_data_home_dir = /path/to/myibdata/
这个设置不影响file-per-table 表空间的位置。
相关信息,请参见第17.8.1节,“InnoDB启动配置”。
-
Command-Line Format --innodb-ddl-buffer-size=#
System Variable innodb_ddl_buffer_size
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 1048576
Minimum Value 65536
Maximum Value 4294967295
Unit 字节 定义DDL操作的最大缓冲区大小。默认设置为1048576字节(约1MB)。适用于在线DDL操作,创建或重建次要索引。请参见第17.12.4节,“在线DDL内存管理”。每个DDL线程的最大缓冲区大小是最大缓冲区大小除以DDL线程数(
innodb_ddl_buffer_size
/innodb_ddl_threads
)。 -
innodb_ddl_log_crash_reset_debug
Command-Line Format --innodb-ddl-log-crash-reset-debug[={OFF|ON}]
System Variable innodb_ddl_log_crash_reset_debug
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用调试选项以重置 DDL 日志崩溃注入计数器到 1。该选项仅在使用
WITH_ DEBUG
CMake 选项编译 debugging 支持时可用。 -
Command-Line Format --innodb-ddl-threads=#
System Variable innodb_ddl_threads
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 4
Minimum Value 1
Maximum Value 64
定义索引创建过程中的并行线程的最大数量。适用于在线 DDL 操作,创建或重建次要索引。有关相关信息,请参阅第 17.12.5 节,“Configuring Parallel Threads for Online DDL Operations”和第 17.12.4 节,“Online DDL Memory Management”。
-
Command-Line Format --innodb-deadlock-detect[={OFF|ON}]
System Variable innodb_deadlock_detect
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
该选项用于禁用死锁检测。在高并发系统中,死锁检测可能会导致线程等待锁定的 slowdown。有时,它可能更有效地禁用死锁检测,并依靠innodb_lock_wait_timeout设置来 rollback事务当出现死锁时。
有关相关信息,请参见第17.7.5.2节,“Deadlock Detection”。
-
Command-Line Format --innodb-dedicated-server[={OFF|ON}]
System Variable innodb_dedicated_server
Scope Global Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
当
innodb_dedicated_server
启用时,InnoDB
将自动配置以下变量:-
Note
innodb_log_file_size
和innodb_log_files_in_group
已弃用,且被innodb_redo_log_capacity
所取代;请参阅第17.6.5节,“Redo Log”。 -
在MySQL 8.4之前,
innodb_flush_method
也将自动配置。
只有在 MySQL 实例驻留在专用服务器上,可以使用所有可用的系统资源时,才考虑启用
innodb_dedicated_server
。启用innodb_dedicated_server
不建议在 MySQL 实例与其他应用程序共享系统资源时。更多信息,请参阅第17.8.12节,“Enabling Automatic Configuration for a Dedicated MySQL Server”。
-
Command-Line Format --innodb-default-row-format=value
System Variable Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Enumeration Default Value DYNAMIC
Valid Values 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
设置是什么。 -
Command-Line Format --innodb_directories=dir_name
System Variable innodb_directories
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 目录名称 Default Value NULL
在启动时扫描的目录列表,用于移动或恢复表空间文件到新位置,而服务器处于离线状态。此外,也用于指定使用绝对路径或位于数据目录外的表空间文件所在目录。
崩溃恢复期间表空间发现依赖于
innodb_directories
设置来识别redo日志中引用的表空间。更多信息,请见崩溃恢复期间表空间发现。默认值为NULL,但由
innodb_data_home_dir
、innodb_undo_directory
和datadir
定义的目录总是被追加到innodb_directories
参数值中,当InnoDB在启动时构建要扫描的目录列表时。这些目录无论是否指定了innodb_directories
设置,都将被追加。innodb_directories
可以在启动命令或MySQL选项文件中指定。因为否则一些命令解释器将认为分号(;
)是一个特殊字符,故需要使用引号来 surround参数值(例如,Unix shells将其视为命令终止符)。启动命令:
mysqld --innodb-directories="directory_path_1;directory_path_2"
MySQL选项文件:
[mysqld] innodb_directories="directory_path_1;directory_path_2"
不能使用通配表达式指定目录。
innodb_directories
扫描也会遍历指定目录的子目录。重复的目录和子目录将从要扫描的目录列表中被 discard。更多信息,请见第17.6.3.6节,“在服务器离线时移动表空间文件”。
-
innodb_disable_sort_file_cache
Command-Line Format --innodb-disable-sort-file-cache[={OFF|ON}]
System Variable innodb_disable_sort_file_cache
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
禁用操作系统文件系统缓存对 merge-sort 临时文件的使用。效果是打开这些文件时使用等效的
O_DIRECT
。 -
Command-Line Format --innodb-doublewrite=value
System Variable innodb_doublewrite
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举值 Default Value ON
Valid Values 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节,“Doublewrite Buffer”。
-
Command-Line Format --innodb-doublewrite-batch-size=#
System Variable innodb_doublewrite_batch_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 256
定义批量写入双写页的数量。
更多信息,请参见第17.6.4节,“Doublewrite Buffer”。
-
Command-Line Format --innodb-doublewrite-dir=dir_name
System Variable innodb_doublewrite_dir
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 目录名称 定义双写文件的目录。如果未指定目录,双写文件将在
innodb_data_home_dir
目录下创建,该目录默认为数据目录如果未指定。更多信息,请参见第17.6.4节,“Doublewrite Buffer”。
-
Command-Line Format --innodb-doublewrite-files=#
System Variable innodb_doublewrite_files
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 2
Minimum Value 1
Maximum Value 256
定义了双写文件的数量。默认情况下,每个缓冲池实例创建两个双写文件。
最少有两个双写文件。最大双写文件数是缓冲池实例的两倍。(缓冲池实例的数量由
innodb_ buffer_pool_instances
变量控制。)更多信息,请见第17.6.4节,“Doublewrite Buffer”。
-
Command-Line Format --innodb-doublewrite-pages=#
System Variable innodb_doublewrite_pages
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 128
Minimum Value 1
Maximum Value 512
定义了每个线程的批量写入双写页面的最大数量。如果未指定值,
innodb_doublewrite_pages
将默认为128。在MySQL 8.4之前,默认值是
innodb_write_io_threads
的值,该值默认为4。更多信息,请见第17.6.4节,“Doublewrite Buffer”.
-
Command-Line Format --innodb=extend-and-initialize[={OFF|ON}]
System Variable innodb_extend_and_initialize
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
控制Linux系统上文件表空间和一般表空间的空间分配。
启用时,
InnoDB
将写入新分配页面中的NULL值。禁用时,使用posix_fallocate()
调用来分配空间,这些调用预留空间而不实际写入NULL值。更多信息,请见第17.6.3.8节,“Linux上表空间空间分配优化”.
-
Command-Line Format --innodb-fast-shutdown=#
System Variable innodb_fast_shutdown
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 1
Valid Values 0
1
2
InnoDB 关机模式。值为 0 时,InnoDB 会进行慢关机,完整地清理和合并缓冲区,然后关机。如果值为 1(默认),InnoDB 将在关机时跳过这些操作,这被称为快速关机。如果值为 2,InnoDB 将将日志刷新并关机,如 MySQL 崩溃一样;没有丢失已提交事务,但崩溃恢复操作会使下一个启动时间更长。
慢关机可能需要分钟或小时,以处理大量缓冲数据。在升级或降级 MySQL 主要版本前,使用慢关机技术,以确保所有数据文件都准备好了,以便升级过程更新文件格式。
在紧急情况下,如数据 corruption risk 高时,可以使用
innodb_fast_shutdown=2
,以获取最快的关机方式。 -
innodb_fil_make_page_dirty_debug
Command-Line Format --innodb-fil-make-page-dirty-debug=#
System Variable innodb_fil_make_page_dirty_debug
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 0
Minimum Value 0
Maximum Value 2**32-1
默认情况下,设置
innodb_fil_make_page_dirty_debug
将立即使表空间的第一页脏。 如果innodb_saved_page_number_debug
设置为非默认值,设置innodb_fil_make_page_dirty_debug
将使指定的页面脏。innodb_fil_make_page_dirty_debug
选项仅在使用WITH_DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-文件-每-表[={OFF|ON}]
System Variable innodb_文件-每-表
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
当
innodb_文件-每-表
启用时,表默认创建在文件-每-表空间中。当禁用时,表默认创建在系统表空间中。关于文件-每-表空间的信息,请见第17.6.3.2节,“文件-每-表空间”。关于InnoDB系统表空间的信息,请见第17.6.3.1节,“系统表空间”。变量
innodb_文件-每-表
可以在运行时使用SET GLOBAL
语句配置指定在命令行启动或选项文件中指定。运行时配置需要具有足够的权限来设置全局系统变量(见第7.1.9.1节,“系统变量权限”),并且立即影响所有连接的操作。当一个文件表空间中的表被截断或删除时,释放的空间将返回给操作系统。截断或删除一个位于系统表空间中的表只会释放系统表空间中的空间。系统表空间中的释放空间可以用于
InnoDB
数据,但不会返回给操作系统,因为系统表空间的数据文件从不缩小。innodb_file_per-table
设置不影响临时表的创建;临时表是在会话临时表空间中创建的。请参阅第17.6.3.5节,“Temporary Tablespaces”。 -
Command-Line Format --innodb-fill-factor=#
System Variable innodb_fill_factor
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 100
Minimum Value 10
Maximum Value 100
InnoDB
在创建或重建索引时执行 bulk load,这种索引创建方法称为““sorted index build””。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 节,“排序索引构建”。
-
Command-Line Format --innodb-flush-log-at-timeout=#
System Variable innodb_flush_log_at_timeout
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 1
Minimum Value 1
Maximum Value 2700
Unit 秒 每隔
N
秒写入和刷新日志。innodb_flush_log_at_timeout
允许将flush的超时期限增加,以减少flush操作并避免影响二进制日志组提交性能。innodb_flush_log_at_timeout
的默认设置是每秒一次。 -
innodb_flush_log_at_trx_commit
Command-Line Format --innodb-flush-log-at-trx-commit=#
System Variable innodb_flush_log_at_trx_commit
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value 1
Valid Values 0
1
2
控制事务提交操作之间的严格ACID一致性和更高性能之间的平衡。您可以通过改变默认值来获得更好的性能,但这可能会在崩溃时丢失事务。
-
默认设置为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
设置如何。事务将完全应用或完全擦除。
在使用事务的复制设置中,为了确保持久性和一致性:
-
如果启用了二进制日志,请将
sync_binlog=1
。 -
总是将
innodb_flush_log_at_trx_commit=1
设置为1。
关于复制服务器在意外中断时最具韧性的设置组合,请参阅第19.4.2节,“处理复制服务器的意外中断”。
Caution许多操作系统和一些磁盘硬件会欺骗flush-到磁盘操作。它们可能会告诉mysqld flush已经完成,即使实际上没有。在这种情况下,事务的可靠性甚至不能保证,在最坏的情况下,电源故障可能会损害
InnoDB
数据。使用SCSI磁盘控制器或磁盘本身的电池缓存可以加速文件flush操作,并使其更加安全。你也可以尝试禁用硬件缓存中的磁盘写入缓存。 -
-
Command-Line Format --innodb-flush-method=value
System Variable innodb_flush_method
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 字符串 Default Value (Unix) O_DIRECT如果支持,否则fsync
Default Value (Windows) unbuffered
Valid Values (Unix) fsync
O_DSYNC
littlesync
nosync
O_DIRECT
O_DIRECT_NO_FSYNC
Valid Values (Windows) unbuffered
normal
定义了在 Innodb 数据文件和日志文件中刷新数据的方法,可以影响 I/O 通过率。
在 Unix-类系统上,缺省值是
O_DIRECT
如果支持否则默认为fsync
。在 Windows 上,缺省值是unbuffered
。Unix-类系统上的 Innodb 刷新方法选项包括:
-
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
在flush I/O 过程中使用O_DIRECT
,但在每个写操作后跳过fsync()
系统调用。MySQL 在创建新文件、增加文件大小和关闭文件时调用
fsync()
,以确保文件系统元数据更改同步。仍然跳过每个写操作后的fsync()
系统调用。在不同存储设备上存储redo日志文件和数据文件可能会导致数据丢失,如果在设备缓存中没有电池备份,突然退出前数据文件写入未被刷新。如果您使用或计划使用不同的存储设备来存储redo日志文件和数据文件,并且您的数据文件位于一个不带电池的缓存设备上,请使用
O_DIRECT
。
在支持
fdatasync()
系统调用平台上,innodb_use_fdatasync
变量允许使用fsync()
的innodb_flush_method
选项来使用fdatasync()
。一个fdatasync()
系统调用除非必要,否则不会将更改写入文件元数据,从而提供潜在的性能优势。Windows系统上的
innodb_flush_method
选项包括:-
unbuffered
或0
:InnoDB
使用非缓冲I/O。Note在Windows上运行MySQL服务器在4K扇区硬盘驱动器上不受支持。解决方案是使用
innodb_flush_method=normal
。 -
normal
或1
:InnoDB
使用缓冲I/O。
每个设置对性能的影响取决于硬件配置和工作负载。为确定哪个设置使用或是否保持默认设置,请对您的特定配置进行基准测试。查看
Innodb_data_fsyncs
状态变量,以了解每个设置的总fsync()
(或fdatasync()
如果innodb_use_fdatasync
启用)调用次数。您的工作负载中读写操作的混合可以影响设置的性能。例如,在具有硬件RAID控制器和电池备份写缓存的系统上,O_DIRECT
可以帮助避免InnoDB
缓冲池和操作系统文件系统缓存之间的双缓冲。在某些系统中,如果InnoDB
数据和日志文件位于SAN上,缺省值或O_DSYNC
可能对读密集型工作负载(主要由SELECT
语句组成)更快。总是使用反映生产环境的硬件和工作负载来测试这个参数。对于一般I/O优化建议,请见第10.5.8节,“Optimizing InnoDB Disk I/O”。 -
-
Command-Line Format --innodb-flush-neighbors=#
System Variable innodb_flush_neighbors
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value 0
Valid Values 0
1
2
指定是否在将刷新 InnoDB 缓冲池中的一页时,也将同一个extent中的其他脏页刷新。
-
设置为 0 禁用
innodb_flush_neighbors
。同一个extent中的脏页不被刷新。 -
设置为 1 则刷新同一个extent中的连续脏页。
-
设置为 2 则刷新同一个extent中的脏页。
在传统的HDD存储设备上存储表数据时,flush这些邻近页面在一个操作中可以减少I/O开销(主要是磁盘寻道操作),相比于在不同的时间flush单个页面。对于存储在SSD上的表数据,寻道时间不是一个重要因素,可以将这个选项设置为0以spread out写操作。有关相关信息,请见第17.8.3.5节,“配置缓冲池flushing”。
-
-
Command-Line Format --innodb-flush-sync[={OFF|ON}]
System Variable innodb_flush_sync
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
默认情况下启用的
innodb_flush_sync
变量会在检查点期间忽略innodb_io_capacity
和innodb_io_capacity_max
设置,以便在I/O活动的高峰期保持一定的I/O速率。要遵守由innodb_io_capacity
和innodb_io_capacity_max
定义的I/O速率,禁用innodb_flush_sync
.关于配置
innodb_flush_sync
变量的信息,请参见第17.8.7节,“配置InnoDB I/O容量”. -
Command-Line Format --innodb-flushing-avg-loops=#
System Variable innodb_flushing_avg_loops
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 30
Minimum Value 1
Maximum Value 1000
InnoDB 对flushing状态的快照保留迭代次数,控制自适应刷新对工作负载的响应速度。增加该值使flush操作的速率变化平滑地随着工作负载的变化,而减少该值使自适应刷新快速地调整工作负载变化,可以导致突然增加和减少工作负载时的刷新活动峰值。
相关信息,请参见第17.8.3.5节,“缓冲池刷新配置”。
-
Command-Line Format --innodb-force-load-corrupted[={OFF|ON}]
System Variable innodb_force_load_corrupted
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
允许InnoDB在启动时加载标记为损坏的表。仅在故障排除期间使用,以恢复无法访问的数据。当故障排除完成后,禁用该设置并重新启动服务器。
-
Command-Line Format --innodb-分插=#
System Variable innodb_分插
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 6
崩溃恢复模式,通常只在严重的故障排除情况下更改。可能的值从0到6。关于innodb_分插的含义和重要信息,请参见
17.20.3,"Forcing InnoDB Recovery" .Warning只有在紧急情况下将该变量设置为大于 0 的值,以便可以启动
InnoDB
并dump表格。出于安全考虑,InnoDB
在innodb_force_recovery
大于 0 时禁止INSERT
、UPDATE
和DELETE
操作。设置innodb_force_recovery
为 4 或更大将InnoDB
置于只读模式。这些限制可能会导致复制管理命令失败,因为复制存储副本状态日志在
InnoDB
表中。 -
Command-Line Format --innodb-fsync-threshold=#
System Variable innodb_fsync_threshold
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 0
Minimum Value 0
Maximum Value 2**64-1
默认情况下,当
InnoDB
创建一个新的数据文件,例如新日志文件或表空间文件时,该文件将完全写入操作系统缓存,然后才被刷新到磁盘,这可能会导致一次大量的磁盘写活动。为了强制小型、定期地刷新操作系统缓存中的数据,可以使用innodb_ fsync_threshold
变量来定义一个字节阈值。当达到字节阈值时,操作系统缓存中的内容将被刷新到磁盘。默认值为0,强制使用默认行为,即在文件完全写入缓存后才刷新数据到磁盘。指定一个阈值以强制小型、定期的刷新可能对多个MySQL实例共享同一存储设备的情况非常有益处。例如,创建一个新的MySQL实例及其关联的数据文件可能会导致大量的磁盘写活动,影响其他使用相同存储设备的MySQL实例的性能。配置阈值可以避免这种写活动的峰值。
-
System Variable innodb_ft_aux_table
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type String 指定了一个
InnoDB
表的完全限定名,该表包含一个FULLTEXT
索引。这变量旨在诊断用途且只能在运行时设置。例如:SET GLOBAL innodb_ft_aux_table = 'test/t1';
设置该变量到格式为
的名称后,db_名
/table_名
INFORMATION_SCHEMA
表中的INNODB_FT_INDEX_TABLE
、INNODB_FT_INDEX_CACHE
、INNODB_FT_CONFIG
、INNODB_FT_DELETED
和INNODB_FT_BEING_DELETED
将显示指定表的搜索索引信息。更多信息,请见第17.15.4节,“InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables”。
-
Command-Line Format --innodb-ft-cache-size=#
System Variable innodb_ft_cache_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 8000000
Minimum Value 1600000
Maximum Value 80000000
Unit 字节 为 InnoDB FULLTEXT 搜索索引缓存分配的内存大小,单位为字节。该缓存用于在创建 InnoDB FULLTEXT 索引时将文档解析到内存中。索引插入和更新操作直到达到
innodb_ft_cache_size
大小限制才被写入磁盘。innodb_ft_cache_size
可以在表级别设置缓存大小。要为所有表设置全局限制,请查看innodb_ft_total_cache_size
。更多信息请见InnoDB Full-Text Index Cache。
-
Command-Line Format --innodb-ft-enable-diag-print[={OFF|ON}]
System Variable innodb_ft_enable_diag_print
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value 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
-
-
Command-Line Format --innodb-ft-enable-stopword[={OFF|ON}]
System Variable innodb_ft_enable_stopword
Scope Global, Session Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value ON
指定在创建时将一组停用词与 InnoDB FULLTEXT 索引相关联。如果设置了
innodb_ft_user_stopword_table
选项,则停用词来自该表。否则,如果设置了innodb_ft_server_stopword_table
选项,则停用词来自该表。否则,将使用默认的停用词集。更多信息,请见第14.9.4节,“全文停止词”.
-
Command-Line Format --innodb-ft-max-token-size=#
System Variable innodb_ft_max_token_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 84
Minimum Value 10
Maximum Value 84
InnoDB全文索引中存储单词的最大字符长度。设置此值的限制可以减少索引大小,从而加速查询,通过省略长关键字或任意集合的字母序列,这些字母序列不是实际单词也 unlikely 是搜索术语。
-
Command-Line Format --innodb-ft-min-token-size=#
System Variable innodb_ft_min_token_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 3
Minimum Value 0
Maximum Value 16
InnoDB 全文索引中存储单词的最小长度。增加该值可以减少索引大小,从而加速查询,通过省略不太可能在搜索上下文中的常见单词,如英语单词“a”和“to”。对于使用CJK(中文、日语、韩语)字符集的内容,请指定值为1。
更多信息请参阅第14.9.6节,“MySQL全文搜索 fine-tuning”。
-
Command-Line Format --innodb-ft-num-word-optimize=#
System Variable innodb_ft_num_word_optimize
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 2000
Minimum Value 1000
Maximum Value 10000
每次对InnoDB FULLTEXT索引执行
OPTIMIZE TABLE
操作时要处理的单词数量。由于对包含全文搜索索引的表进行批量插入或更新操作可能需要大量索引维护以 incorporate所有更改,您可能会执行一系列OPTIMIZE TABLE
语句,每个语句从上一个语句的结尾继续。 -
Command-Line Format --innodb-ft-result-cache-limit=#
System Variable innodb_ft_result_cache_limit
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 2000000000
Minimum Value 1000000
Maximum Value 2**32-1
Unit 字节 InnoDB全文搜索查询结果缓存限制(以字节为单位),每个全文搜索查询或每个线程。中间和最终的InnoDB全文搜索查询结果在内存中处理。使用
innodb_ft_result_cache_limit
将全文搜索查询结果缓存大小限制,以避免在处理非常大的InnoDB全文搜索查询结果(例如数百万或数千万行)时的内存过高消耗。内存按需分配,当处理全文搜索查询时。如果达到结果缓存大小限制,会返回错误,指示查询超出了允许的最大内存。所有平台类型和位大小的
innodb_ft_result_cache_limit
的最大值为2^32-1。 -
innodb_ft_server_stopword_table
Command-Line Format --innodb-ft-server-stopword-table=db_name/table_name
System Variable innodb_ft_server_stopword_table
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 Default Value NULL
使用该选项可以为所有
InnoDB
表指定自定义的FULLTEXT
索引停用词列表。要为特定的InnoDB
表配置自定义停用词列表,请使用innodb_ft_user_stopword_table
。将
innodb_ft_server_stopword_table
设置为包含停用词列表的表名,格式为
。db_name
/table_name
停用词表必须在配置
innodb_ft_server_stopword_table
之前存在。innodb_ft_enable_stopword
必须启用,并且innodb_ft_server_stopword_table
选项必须配置,以便创建FULLTEXT
索引。停用词表必须是
InnoDB
表,包含一个名为value
的单个VARCHAR
列。更多信息,请见第14.9.4节,“Full-Text Stopwords”。
-
Command-Line Format --innodb-ft-sort-pll-degree=#
System Variable innodb_ft_sort_pll_degree
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 2
Minimum Value 1
Maximum Value 16
在构建搜索索引时,用于并行索引和 tokenize 文本的线程数量。
相关信息,请参见第17.6.2.4节,“InnoDB Full-Text Indexes”和
innodb_sort_buffer_size
。 -
Command-Line Format --innodb-ft-total-cache-size=#
System Variable innodb_ft_total_cache_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 640000000
Minimum Value 32000000
Maximum Value 1600000000
Unit 字节 所有表的InnoDB全文搜索索引缓存总内存大小,单位为字节。创建多个表,每个表都具有
FULLTEXT
搜索索引,可以消耗大量可用内存。innodb_ft_total_cache_size
定义了所有全文搜索索引的全球内存限制,以避免过高的内存消耗。如果索引操作达到全球限制,会触发强制同步。更多信息,请见InnoDB Full-Text Index Cache。
-
Command-Line Format --innodb-ft-user-stopword-table=db_name/table_name
System Variable innodb_ft_user_stopword_table
Scope Global, Session Dynamic Yes SET_VAR
Hint AppliesNo Type String Default Value NULL
该选项用于指定特定表的InnoDB FULLTEXT索引停用词列表。要为所有InnoDB表配置自定义停用词列表,请使用
innodb_ft_server_stopword_table
。将
innodb_ft_user_stopword_table
设置为包含停用词列表的表名,格式为
。db_name
/table_name
停用词表必须在配置
innodb_ft_user_stopword_table
之前存在。innodb_ft_enable_stopword
必须启用,并且innodb_ft_user_stopword_table
必须配置,才能创建FULLTEXT
索引。停用词表必须是
InnoDB
表,包含一个名为value
的单个VARCHAR
列。更多信息,请见第14.9.4节,“Full-Text Stopwords”。
-
Command-Line Format --innodb-idle-flush-pct=#
System Variable innodb_idle_flush_pct
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 100
Minimum Value 0
Maximum Value 100
当
InnoDB
空闲时,限制页面刷新。值为innodb_idle_flush_pct
的百分比,定义了InnoDB
可以执行的 I/O 操作数(每秒)innodb_io_capacity
。更多信息,请参见空闲期间限制缓冲刷新。 -
Command-Line Format --innodb-io-capacity=#
System Variable innodb_io_capacity
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 10000
Minimum Value 100
Maximum Value (64-bit platforms) 2**64-1
Maximum Value (32-bit platforms) 2**32-1
变量
innodb_io_capacity
定义了InnoDB
背景任务(如页面刷新和更改缓冲区)每秒可执行的 I/O 操作数(IOPS)。关于配置
innodb_io_capacity
变量的信息,请参阅第17.8.7节,“配置InnoDB I/O Capacity”. -
Command-Line Format --innodb-io-capacity-max=#
System Variable innodb_io_capacity_max
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 2 * innodb_io_capacity
Minimum Value 100
Maximum Value 2**32-1
如果flush活动落后,
InnoDB
可以更积极地Flush,高于由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节,“Configuring InnoDB I/O Capacity”。 -
innodb_limit_optimistic_insert_debug
Command-Line Format --innodb-limit-optimistic-insert-debug=#
System Variable innodb_limit_optimistic_insert_debug
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 2**32-1
限制每个B-树页的记录数。默认值为0,表示不对记录数进行限制。这项选项仅在使用
WITH_DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-lock-wait-timeout=#
System Variable innodb_lock_wait_timeout
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 50
Minimum Value 1
Maximum Value 1073741824
Unit 秒 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节,“Deadlock Detection”。innodb_lock_wait_timeout
可以在运行时使用SET GLOBAL
或SET SESSION
语句设置。更改GLOBAL
设置需要具有足够的权限来设置全局系统变量(见第7.1.9.1节,“系统变量权限”),对所有连接的客户端产生影响。任何客户端都可以更改SESSION
设置为innodb_lock_wait_timeout
,只对该客户端产生影响。 -
Command-Line Format --innodb-log-buffer-size=#
System Variable innodb_log_buffer_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 67108864
Minimum Value 1048576
Maximum Value 4294967295
InnoDB 在磁盘上写入日志文件时使用的缓冲区大小,以字节为单位。默认值为 64MB。一个大的日志缓冲区使得可以在事务提交前不需要将日志写入磁盘,从而支持大型事务的运行。如果您有更新、插入或删除许多行的事务,可以将日志缓冲区设置更大,以减少磁盘 I/O。有关相关信息,请参阅内存配置和第10.5.4节,“优化 InnoDB redo 记录”。对于一般的 I/O 调整建议,请参阅第10.5.8节,“优化 InnoDB 磁盘 I/O”。
-
innodb_log_checkpoint_fuzzy_now
Command-Line Format --innodb-log-checkpoint-fuzzy-now[={OFF|ON}]
System Variable innodb_log_checkpoint_fuzzy_now
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用这个调试选项强制
InnoDB
写入模糊检查点。这选项仅在使用WITH_ DEBUG
CMake选项编译调试支持时可用。 -
Command-Line Format --innodb-log-checkpoint-now[={OFF|ON}]
System Variable innodb_log_checkpoint_now
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用这个调试选项强制
InnoDB
写入检查点。这选项仅在使用WITH_ DEBUG
CMake选项编译调试支持时可用。 -
Command-Line Format --innodb-log-checksums[={OFF|ON}]
System Variable innodb_log_checksums
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
启用或禁用redo日志页的校验和。
innodb_log_checksums=ON
启用了 redo 日志页的CRC-32C
检查和算法。当innodb_log_checksums
被禁用时,redo 日志页的检查和字段内容将被忽略。redo 日志头页和 redo 日志检查点页上的 checksums 从不被禁用。
-
Command-Line Format --innodb-log-compressed-pages[={OFF|ON}]
System Variable innodb_log_compressed_pages
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value ON
指定是否将 re-压缩的 页 的图像写入到 redo 日志。re-压缩可能会在对压缩数据进行更改时发生。
innodb_log_compressed_pages
默认启用,以防止在恢复过程中使用不同版本的zlib
压缩算法可能引起的损坏。如果您确定zlib
版本不会更改,可以禁用innodb_log_compressed_pages
以减少对修改压缩数据的工作负载的redo日志生成。要测量启用或禁用
innodb_log_compressed_pages
的影响,比较在相同工作负载下redo日志生成的结果。可用的选项包括观察SHOW ENGINE INNODB STATUS
输出中的Log sequence number
(LSN)在LOG部分,或者监控Innodb_os_log_written
状态以获取redo日志文件写入的字节数。相关信息,请见第17.9.1.6节,“OLTP工作负载的压缩”。
-
Command-Line Format --innodb-log-file-size=#
Deprecated 是 System Variable innodb_日志文件大小
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 50331648
Minimum Value 4194304
Maximum Value 512GB / innodb_日志文件组
Unit 字节 Noteinnodb_日志文件大小
和innodb_log_files_in_group
已经被innodb_redo_log_capacity
所取代;请参阅第17.6.5节,“redo日志”。每个日志文件在日志组中的字节大小。日志文件的总大小(
innodb_log_file_size
*innodb_log_files_in_group
)不能超过512GB的最大值。例如,255 GB的日志文件对(pair)接近限制但不超过它。默认值为48MB。通常,日志文件的总大小应该足够大,以平滑工作负载活动的峰值和谷值,这意味着可以处理超过一个小时的写入活动。值越大,缓冲池中的检查点刷新活动就需要更少,减少了磁盘I/O。较大的日志文件也会使崩溃恢复速度变慢。
最小的
innodb_log_file_size
是4MB。有关相关信息,请参阅Redo Log Configuration。对于一般I/O优化建议,请参阅第10.5.8节,“Optimizing InnoDB Disk I/ O”。
如果
innodb_dedicated_server
启用,innodb_log_file_size
值将自动配置,如果未明确定义。更多信息,请参阅第17.8.12节,“Enabling Automatic Configuration for a Dedicated MySQL Server”。 -
Command-Line Format --innodb-log-files-in-group=#
Deprecated 是 System Variable innodb_log_files_in_group
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 2
Minimum Value 2
Maximum Value 100
Noteinnodb_log_file_size
和innodb_log_files_in_group
已经被innodb_redo_log_capacity
所取代;请参阅第17.6.5节,“redo日志”。log文件组中的日志文件数量。
InnoDB
将文件写入循环方式。默认值(和推荐值)是2。文件的位置由innodb_log_group_home_dir
指定。日志文件的总大小(innodb_log_file_size
*innodb_log_files_in_group
)可以达到512GB。相关信息,请参阅redo日志配置。
如果启用了
innodb_dedicated_server
,则innodb_log_files_in_group
将自动配置,如果未明确定义。更多信息,请见第17.8.12节,“Enabling Automatic Configuration for a Dedicated MySQL Server”。 -
Command-Line Format --innodb-log-group-home-dir=dir_name
System Variable innodb_log_group_home_dir
Scope Global Dynamic 否 SET_VAR
Hint Applies否 Type 目录名称 InnoDB redo log 文件的目录路径。
相关信息,请见Redo Log Configuration。
-
Command-Line Format --innodb-log-spin-cpu-abs-lwm=#
System Variable innodb_log_spin_cpu_abs_lwm
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 80
Minimum Value 0
Maximum Value 4294967295
定义了在等待flush redo时,用户线程不再spin的最小CPU使用率。该值以CPU核心使用率的总和表示。例如,默认值80是单个CPU核心的80%。在多核处理器系统上,一值为150表示100%使用一个CPU核心加50%使用第二个CPU核心。
有关相关信息,请参见第10.5.4节,“InnoDB redo日志优化”。
-
Command-Line Format --innodb-log-spin-cpu-pct-hwm=#
System Variable innodb_log_spin_cpu_pct_hwm
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 50
Minimum Value 0
Maximum Value 100
定义了在等待flush redo时,用户线程不再spin的最大CPU使用率。该值以所有CPU核心总处理能力的百分比表示。默认值为50%。例如,在服务器上有四个CPU核心的情况下,两个CPU核心的100%使用是服务器的50%处理能力。
innodb_log_spin_cpu_pct_hwm
变量尊重处理器亲和性。例如,如果服务器有48个核心,但mysqld进程被固定到四个CPU核心上,其他44个CPU核心将被忽略。
有关相关信息,请参阅第10.5.4节,“优化InnoDB redo日志”。
-
innodb_log_wait_for_flush_spin_hwm
Command-Line Format --innodb-log-wait-for-flush-spin-hwm=#
System Variable innodb_log_wait_for_flush_spin_hwm
Scope 全局
Dynamic 是
SET_VAR
Hint Applies否
Type 整数
Default Value 400
Minimum Value 0
Maximum Value (64-bit platforms) 2**64-1
Maximum Value (32-bit platforms) 2**32-1
Unit 微秒
定义了在等待flush redo时用户线程不再旋转的最大平均日志刷新时间。默认值为400微秒。
有关相关信息,请参阅第10.5.4节,“优化InnoDB redo日志”。
-
Command-Line Format --innodb-log-write-ahead-size=#
System Variable innodb_log_write_ahead_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 8192
Minimum Value 512(日志文件块大小)
Maximum Value 等于innodb_page_size
Unit 字节 定义redo日志的写前置块大小,以字节为单位。为了避免“读-写”,将
innodb_log_write_ahead_size
设置与操作系统或文件系统缓存块大小相匹配。默认设置为8192字节。读-写发生在redo日志块未完全缓存在操作系统或文件系统中,因为write-ahead块大小与操作系统或文件系统缓存块大小不匹配时。有效的值为
innodb_log_write_ahead_size
的倍数(2n),其中n是InnoDB日志文件块大小的指数。最小值为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
设置太低,相对于操作系统或文件系统缓存块大小可能会导致“read-on-write”。如果将值设置太高可能会对日志文件写入的fsync性能产生轻微影响,因为多个块同时被写入。有关相关信息,请参见第10.5.4节,“优化InnoDB redo日志”。
-
Command-Line Format --innodb-log-writer-threads[={OFF|ON}]
System Variable innodb_log_writer_threads
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value ON
启用专门的日志写入线程,用于将redo日志记录从日志缓冲区写入到系统缓冲区,并将系统缓冲区刷新到redo日志文件中。专门的日志写入线程可以在高并发系统中提高性能,但是在低并发系统中禁用专门的日志写入线程可以提供更好的性能。
更多信息,请见第10.5.4节,“InnoDB redo日志优化”。
-
Command-Line Format --innodb-lru-scan-depth=#
System Variable innodb_lru_scan_depth
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 1024
Minimum Value 100
Maximum Value (64-bit platforms) 2**64-1
Maximum Value (32-bit platforms) 2**32-1
影响InnoDB缓冲池
flush
操作算法和启发式的参数。主要对性能专家调整I/O密集型工作负载感兴趣。它指定每个缓冲池实例中,页清洁线程在LRU页面列表中扫描的深度,以查找需要flush
的脏页。这是一个背景操作,每秒执行一次。通常情况下,小于默认值的设置是合适的。远远高于必要的值可能会影响性能。如果您有空闲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”。
-
Command-Line Format --innodb-max-dirty-pages-pct=#
System Variable innodb_max_dirty_pages_pct
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 数字 Default Value 90
Minimum Value 0
Maximum Value 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
Command-Line Format --innodb-max-dirty-pages-pct-lwm=#
System Variable innodb_max_dirty_pages_pct_lwm
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 数字 Default Value 10
Minimum Value 0
Maximum Value 99.999
定义了一个低水位标记,表示dirty页面百分比的下限,当达到该值时启用预刷新以控制dirty页面比例。设置为0将完全禁用预刷新行为。配置的值应该总是小于
innodb_max_dirty_pages_pct
的值。更多信息,请见第17.8.3.5节,“配置缓冲池刷新”。 -
Command-Line Format --innodb-max-purge-lag=#
System Variable innodb_max_purge_lag
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 4294967295
定义了期望的最大purge延迟。如果这个值超过,则对
INSERT
、UPDATE
和DELETE
操作施加延迟,以便purge可以追上。默认值为0,这意味着没有最大purge延迟且不施加延迟。更多信息,请见第17.8.9节,“purge 配置”。
-
Command-Line Format --innodb-max-purge-lag-delay=#
System Variable innodb_max_purge_lag_delay
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 10000000
Unit 微秒 指定了在
innodb_max_purge_lag
阈值超过时的最大延迟微秒数。指定的innodb_max_purge_lag_delay
值是由innodb_max_purge_lag
公式计算的延迟期限的上限。更多信息,请见第17.8.9节,“Purge Configuration”。
-
Command-Line Format --innodb-max-undo-log-size=#
System Variable innodb_max_undo_log_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 1073741824
Minimum Value 10485760
Maximum Value 2**64-1
Unit 字节 定义了undo表空间的阈值大小。如果undo表空间超过阈值,它可以在
innodb_undo_log_truncate
启用时被标记为截断。默认值是1024 MiB(1073741824字节)。更多信息,请见Truncating Undo Tablespaces。
-
innodb_merge_threshold_set_all_debug
Command-Line Format --innodb-merge-threshold-set-all-debug=#
System Variable innodb_merge_threshold_set_all_debug
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 50
Minimum Value 1
Maximum Value 50
定义了一个覆盖当前
MERGE_THRESHOLD
设置的索引页面满页百分比值,为所有当前在字典缓存中的索引设置。只有在使用WITH_DEBUG
CMake选项编译debug支持时可用。有关相关信息,请参见第17.8.11节,“Configuring the Merge Threshold for Index Pages”。 -
Command-Line Format --innodb-monitor-disable={counter|module|pattern|all}
System Variable innodb_monitor_disable
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 该变量作为开关,禁用
InnoDB
metrics counters。计数器数据可以使用信息_schema中的INNODB_METRICS
表查询。关于使用信息,请见第17.15.6节,“InnoDB INFORMATION_SCHEMA Metrics Table”。innodb_monitor_disable='latch'
禁用SHOW ENGINE INNODB MUTEX
的统计信息收集。关于更多信息,请见第15.7.7.16节,“SHOW ENGINE Statement”。 -
Command-Line Format --innodb-monitor-enable={counter|module|pattern|all}
System Variable innodb_monitor_enable
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 这个变量作为开关,启用InnoDB 度量计数器。计数器数据可以使用信息_schema中的
INNODB_METRICS
表查询。关于使用信息,请见第17.15.6节,“InnoDB INFORMATION_SCHEMA Metrics Table”。innodb_ monitor_enable='latch'
启用SHOW ENGINE INNODB MUTEX
的统计信息收集。关于更多信息,请见第15.7.7.16节,“SHOW ENGINE Statement”。 -
innodb_ monitor_reset
Command-Line Format --innodb-monitor-reset={counter|module|pattern|all}
System Variable innodb_ monitor_reset
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Enumeration Default Value NULL
Valid Values counter
module
pattern
all
该变量作为开关,重置
InnoDB
的度量计数器的计数值为零。度量数据可以使用信息_schema中的INNODB_METRICS
表查询。关于使用信息,请见第17.15.6节,“InnoDB INFORMATION_SCHEMA Metrics Table”.innodb_monitor_reset='latch'
重置SHOW ENGINE INNODB MUTEX
报告的统计信息。关于更多信息,请见第15.7.7.16节,“SHOW ENGINE Statement”. -
Command-Line Format --innodb-monitor-reset-all={counter|module|pattern|all}
System Variable innodb_monitor_reset_all
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 枚举 Default Value NULL
Valid Values counter
module
pattern
all
这个变量作为开关,重置所有值(最小、最大等)对于
InnoDB
计数器。计数器数据可以使用信息_schema中的INNODB_METRICS
表查询。关于使用信息,请见第17.15.6节,“InnoDB INFORMATION_SCHEMA Metrics Table”。 -
Command-Line Format --innodb-numa-interleave[={OFF|ON}]
System Variable innodb_numa_interleave
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
启用 NUMA 交错内存策略对 InnoDB 缓冲池的分配。当
innodb_numa_interleave
启用时,NUMA 内存策略将被设置为MPOL_INTERLEAVE
对 mysqld 进程。在分配 InnoDB 缓冲池后,NUMA 内存策略将被设置回MPOL_DEFAULT
。为了使innodb_numa_interleave
选项可用,MySQL 必须在支持 NUMA 的 Linux 系统上编译。如果系统支持,默认值为ON
,否则默认为OFF
。CMake根据当前平台是否支持NUMA来设置默认
WITH_NUMA
值。更多信息,请见第2.8.7节,“MySQL Source-Configuration Options”. -
Command-Line Format --innodb-old-blocks-pct=#
System Variable innodb_old_blocks_pct
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 37
Minimum Value 5
Maximum Value 95
指定InnoDB缓冲池中旧块子列表的近似百分比。值的范围是5到95。默认值为37(即池的3/8)。通常与
innodb_old_blocks_time
一起使用。更多信息,请见第17.8.3.3节,“使缓冲池扫描抵抗”。关于缓冲池管理、LRU算法和驱逐策略,请见第17.5.1节,“缓冲池”
-
Command-Line Format --innodb-old-blocks-time=#
System Variable innodb_old_blocks_time
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 1000
Minimum Value 0
Maximum Value 2**32-1
Unit 毫秒 非零值可以防止缓冲池被填充由仅在短期内引用数据的数据,例如在全表扫描期间。增加这个值可以提供更多保护,以免全表扫描干扰缓冲池中的数据。
指定在毫秒中一个块插入到旧子列表后,它必须留在那里直到其第一次访问后至少经过多少毫秒才能被移动到新子列表。如果值为0,块插入到旧子列表并且立即在首次访问时移动到新子列表,不管访问发生的时间点。如果值大于0,块将留在旧子列表中直到至少发生了该多个毫秒的访问。例如,值为1000使块留在旧子列表中1秒后才能被移到新子列表。
默认值是1000。
这个变量通常与
innodb_old_blocks_pct
一起使用。更多信息,请见第17.8.3.3节,“使缓冲池扫描抵抗”。关于缓冲池管理、LRU算法和驱逐策略,请见第17.5.1节,“缓冲池” -
innodb_online_alter_log_max_size
Command-Line Format --innodb-online-alter-log-max-size=#
System Variable innodb_online_alter_log_max_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 134217728
Minimum Value 65536
Maximum Value 2**64-1
Unit 字节 指定了在在线 DDL操作中用于
InnoDB
表的临时日志文件大小上限。对于每个被创建或更改的索引,存在一个这样的日志文件。在DDL操作期间,该日志文件存储了在表中插入、更新或删除的数据。临时日志文件会根据innodb_sort_buffer_size
的值扩展,直到达到由innodb_online_alter_log_max_size
指定的最大大小。如果临时日志文件超过上限大小,ALTER TABLE
操作将失败,并且所有未提交的并发 DML 操作将回滚。因此,对于这个选项的较大值允许更多的 DML 在在线 DDL 操作期间发生,但也会延长DDL 操作结束时表锁定的时间,以便应用日志中的数据。 -
Command-Line Format --innodb-open-files=#
System Variable innodb_open_files
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value -1
(表示自动调整;不要将这个字面值分配给该变量)Minimum Value 10
Maximum Value 2147483647
指定
InnoDB
可以同时打开的文件最大数量。最小值为 10。如果innodb_file_per_table
被禁用,缺省值为 300;否则,缺省值为 300 或table_open_cache
设置的值,取高者。可以在运行时使用
SELECT innodb_set_open_files_limit(
语句设置N
)innodb_open_files
限制,例如:mysql> SELECT innodb_set_open_files_limit(1000);
该语句执行一个存储过程,该过程将设置新的限制。如果过程成功,它将返回新设置的限制值;否则,将返回失败信息。
不能使用
SET
语句设置innodb_open_files
。要在运行时设置innodb_open_files
,请使用上述描述的语句。将
innodb_open_files=default
设置不支持。只允许整数值。为了防止非LRU管理文件占用整个
innodb_open_files
限制,非LRU管理文件被限制为该限制的90%,以留出10%用于LRU管理文件。 -
Command-Line Format --innodb-optimize-fulltext-only[={OFF|ON}]
System Variable innodb_optimize_fulltext_only
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
修改
OPTIMIZE TABLE
对InnoDB表的操作方式。旨在临时启用,以便在执行InnoDB表的维护操作时启用。默认情况下,
OPTIMIZE TABLE
对表的聚簇索引进行重组。启用该选项时,OPTIMIZE TABLE
将跳过表数据的重组,而是处理InnoDB 全文索引中的新添加、删除和更新token数据。更多信息,请参见Optimizing InnoDB Full-Text Indexes. -
Command-Line Format --innodb-page-cleaners=#
System Variable innodb_page_cleaners
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value innodb_buffer_pool_instances
Minimum Value 1
Maximum Value 64
buffer pool 实例中脏页的数量 cleaner线程。Page cleaner线程执行 flush 列表和 LRU 刷新。当有多个 page cleaner 线程时,buffer pool 刷盘任务将被分配给空闲 page cleaner 线程。
innodb_page_cleaners
的默认值设置为innodb_buffer_pool_instances
的同一个值。如果指定的 page cleaner 线程数量超过 buffer pool 实例数量,则innodb_page_cleaners
将被自动设置为innodb_buffer_pool_instances
的同一个值。如果您的工作负载在从 buffer pool 实例中刷新脏页到数据文件时是写-IO bound的,并且系统硬件有可用容量,增加 page cleaner 线程数量可能会提高写-IO 通过率。
多线程 Page cleaner 支持扩展到关闭和恢复阶段。
在 Linux 平台上,如果支持,并且 mysqld 执行用户被授权,可以使用
setpriority()
系统调用将 page cleaner 线程设置为高优先级,以帮助页面刷新保持与当前工作负载的同步。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
来实现相同的结果。例如,创建一个名为override.conf
的文件,并将其添加到/etc/systemd/system/mysqld.service.d/override.conf
中:[Service] LimitNICE=-20
在创建或更改
override.conf
后,重新加载systemd配置,然后告诉systemd重启MySQL服务:systemctl daemon-reload systemctl restart mysqld # RPM platforms systemctl restart mysql # Debian platforms
要了解更多关于使用本地systemd配置文件的信息,请参阅Configuring systemd for MySQL。
授权mysqld执行用户后,使用cat命令验证
Nice
限制的配置值:$> cat /proc/mysqld_pid/limits | grep nice Max nice priority 18446744073709551596 18446744073709551596
-
Command-Line Format --innodb-page-size=#
System Variable innodb_page_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 枚举 Default Value 16384
Valid Values 4096
8192
16384
32768
65536
指定了页面大小的值,以便在表空间中使用InnoDB。可以以字节或千字节为单位指定值。例如,可以将16KB的页面大小指定为16384、16KB或16k。
innodb_page_size
只能在MySQL实例初始化之前配置,并且不能在实例启动后更改。如果没有指定值,实例将使用默认页面大小。请参阅第17.8.1节,“InnoDB Startup Configuration”。对于32KB和64KB的页面大小,行长的最大值约为16000字节。
ROW_FORMAT=COMPRESSED
在innodb_page_size
设置为32KB或64KB时不受支持。对于innodb_page_size=32KB
,extent大小为2MB。对于innodb_page_size=64KB
,extent大小为4MB。在使用32KB或64KB页面大小时,innodb_log_buffer_size
应该设置为至少16MB(默认值为64MB)。默认的16KB页面大小或更大适合广泛的工作负载,特别是涉及表扫描和DML操作的bulk更新查询。较小的页面大小可能对OLTP工作负载更有效,这些工作负载涉及许多小写入,where contention可以是问题,当单个页面包含许多行。较小的页面也可能对SSD存储设备更有效,这些设备通常使用小块大小。将InnoDB页面大小保持与存储设备块大小相近可以最小化写入磁盘的未改变数据量。
第一个系统表空间数据文件(
ibdata1
)的最小文件大小取决于innodb_page_size
的值。请查看innodb_data_file_path
选项描述以获取更多信息。使用特定的
InnoDB
页面大小的MySQL实例不能使用来自不同页面大小的实例的数据文件或日志文件。关于一般I/O调整建议,请查看第10.5.8节,“Optimizing InnoDB Disk I/ O”。
-
Command-Line Format --innodb-parallel-read-threads=#
System Variable innodb_parallel_read_threads
Scope Session Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value (可用逻辑处理器 / 8),最小4 Minimum Value 1
Maximum Value 256
定义了并行.clustered索引读取的线程数。支持对分区进行并行扫描。并行读取线程可以提高
CHECK TABLE
性能。InnoDB
在执行CHECK TABLE
操作时,读取clustered索引两次。第二次读取可以并行进行。这一特性不适用于secondary索引扫描。innodb_parallel_read_threads
会话变量必须设置为大于1的值,以便并行clustered索引读取发生。实际用于并行clustered索引读取的线程数由innodb_parallel_read_threads
设置或要扫描的索引子树数量,取决于较小者。扫描过程中读入缓冲池中的页面被保持在缓冲池LRU列表的尾部,以便在需要释放缓冲池页面时快速丢弃它们。并行读取线程的最大数量(256)是所有客户端连接的总线程数。如果达到线程限制,连接将回退到使用单个线程。默认值是系统可用逻辑处理器数量除以8,以最小值4为准。
在MySQL 8.4之前,默认值始终为4。
-
Command-Line Format --innodb-print-all-deadlocks[={OFF|ON}]
System Variable innodb_print_all_deadlocks
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
当启用此选项时,InnoDB用户事务中的所有死锁信息将记录在mysqld错误日志中。否则,您只能看到最后一个死锁的信息,使用SHOW ENGINE INNODB STATUS语句。偶尔的InnoDB死锁不是问题,因为InnoDB立即检测到条件并自动回滚事务之一。你可能会使用此选项来 troubleshoot为什么死锁正在发生,如果应用程序没有适当的错误处理逻辑来检测回滚并重试操作。大量死锁可能表明需要重新结构访问多个表的交易,以便每个事务都访问表的相同顺序,从而避免死锁条件。
有关相关信息,请见第17.7.5节,“InnoDB中的死锁”。
-
Command-Line Format --innodb-print-ddl-logs[={OFF|ON}]
System Variable innodb_print_ddl_logs
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用该选项将导致 MySQL 将 DDL 日志写入到
stderr
。更多信息,请见查看DDL日志。 -
Command-Line Format --innodb-purge-batch-size=#
System Variable innodb_purge_batch_size
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 300
Minimum Value 1
Maximum Value 5000
定义了undo日志页面的批处理大小,从历史列表中purge解析和处理。多线程purge配置下,协调purge线程将
innodb_purge_batch_size
除以innodb_purge_threads
,并将每个purge线程分配的页面数。变量innodb_purge_batch_size
也定义了purge在undo日志中释放的页面数,每128次迭代。选项
innodb_purge_batch_size
旨在与innodb_purge_threads
设置一起进行高级性能调整。大多数用户不需要更改innodb_purge_batch_size
的默认值。相关信息,请见第17.8.9节,“purge配置”。
-
Command-Line Format --innodb-purge-threads=#
System Variable innodb_purge_threads
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 1 if available logical processors <= 16; otherwise 4
Minimum Value 1
Maximum Value 32
InnoDB 回滚操作的背景线程数量。增加该值可以在系统中执行多个表的DML操作时提高效率。
相关信息,请参见第17.8.9节,“Purge Configuration”。
-
innodb_purge_rseg_truncate_frequency
Command-Line Format --innodb-purge-rseg-truncate-frequency=#
System Variable innodb_purge_rseg_truncate_frequency
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 128
Minimum Value 1
Maximum Value 128
定义purge系统在每次调用时释放回滚段的频率,以undo表空间的次数为单位。通常,purge系统每128次调用释放回滚段。默认值是128。减少该值可以增加purge线程释放回滚段的频率。
innodb_purge_rseg_truncate_frequency
是与innodb_undo_log_truncate
一起使用的。更多信息,请见Truncating Undo Tablespaces. -
Command-Line Format --innodb-random-read-ahead[={OFF|ON}]
System Variable innodb_random_read_ahead
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value OFF
启用随机read-ahead技术,以优化InnoDB I/ O。
关于不同类型的读取请求性能考虑,请见Section 17.8.3.4, “Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)”。关于一般 I/ O调整建议,请见Section 10.5.8, “Optimizing InnoDB Disk I/O”.
-
Command-Line Format --innodb-read-ahead-threshold=#
System Variable innodb_read_ahead_threshold
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 56
Minimum Value 0
Maximum Value 64
控制InnoDB对线性读前的敏感度,该读前用于将页面prefetch到缓冲池中。如果InnoDB从一个extent(64页)顺序读取至少
innodb_read_ahead_threshold
页,它将启动异步读取整个下一个extent的操作。允许的值范围为0到64。值为0将禁用读前。对于默认值56,InnoDB必须顺序读取至少56页从extent中,以便启动对下一个extent的异步读取。了解读取机制中读取的页面数量,以及这些页面从缓冲池中被驱逐而未被访问的数量,可以在调整
innodb_read_ahead_threshold
设置时非常有用。SHOW ENGINE INNODB STATUS
输出显示了Innodb_buffer_pool_read_ahead
和Innodb_buffer_pool_read_ahead_evicted
全局状态变量的计数信息,这些变量报告了读取机制请求将页面引入缓冲池的数量,以及这些页面从缓冲池中被驱逐而未被访问的数量,分别。状态变量报告自最后一次服务器重启以来全球值。SHOW ENGINE INNODB STATUS
还显示了读取机制页面的读取率和未被访问的驱逐率。每秒平均值基于自SHOW ENGINE INNODB STATUS
最后一次调用以来收集的统计信息,并在SHOW ENGINE INNODB STATUS
输出的缓冲池和内存部分中显示。更多信息,请见第17.8.3.4节,“InnoDB 缓冲池预取配置(读前)”。对于一般I/O调整建议,请见第10.5.8节,“Optimizing InnoDB Disk I/O”。
-
Command-Line Format --innodb-读-io-线程=#
System Variable innodb_读_io_线程
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value (系统可用逻辑处理器 / 2),最小值为4
Minimum Value 1
Maximum Value 64
InnoDB 中的读操作I/O线程数量。与写线程对应的是
innodb_写_io_线程
。更多信息,请见第17.8.5节,“配置背景InnoDB I/O线程数量”。对于一般I/O调整建议,请见第10.5.8节,“Optimizing InnoDB Disk I/O”。默认值是系统可用逻辑处理器的数量除以2,且最小值为4。在MySQL 8.4之前,默认值总是为4。
Note在Linux系统上,运行多个MySQL服务器(通常超过12)时,使用默认设置的
innodb_read_io_threads
、innodb_write_io_threads
和Linuxaio-max-nr设置可能会超过系统限制。理想情况下,增加aio-max-nr设置;作为解决方案,您可能需要减少MySQL变量之一或两个的设置。 -
Command-Line Format --innodb-read-only[={OFF|ON}]
System Variable innodb_read_only
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
将InnoDB设置为只读模式。用于分布式数据库应用程序或数据集的只读媒体。也可以在数据仓库中使用,以共享同一个数据目录之间多个实例。更多信息,请参见第17.8.2节,“配置InnoDB为只读操作”。
启用
innodb_read_only
将阻止所有存储引擎创建和删除表,而不仅限于InnoDB
。对于任何存储引擎的表创建和drop操作,会修改数据字典表在mysql
系统数据库中,但是这些表使用InnoDB
存储引擎且无法在启用innodb_read_only
时进行修改。同样适用于其他需要修改数据字典表的表操作的原则,例如:-
如果启用了
innodb_read_only
系统变量,ANALYZE TABLE
可能会失败,因为它无法更新数据字典中的统计表,这些表使用InnoDB
。即使操作更新了表本身(例如,如果是MyISAM
表),也可能出现失败。在获取更新的分布统计信息时,设置information_schema_stats_expiry=0
。 -
ALTER 表
失败,因为它更新了存储引擎的指定,这个指定被存储在数据字典中。tbl_名称
ENGINE=引擎名称
此外,
mysql
系统数据库中的其他表使用InnoDB
存储引擎。将这些表设置为只读结果是对它们进行修改操作的限制示例:-
插件管理语句
INSTALL 插件
和UNINSTALL 插件
失败,因为mysql.插件
系统表使用InnoDB
。
-
-
Command-Line Format --innodb-redo-log-archive-dirs
System Variable innodb_redo_log_archive_dirs
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type String Default Value NULL
定义了redo日志归档文件可以创建的标记目录。您可以在分号 (;) 分隔的列表中定义多个标记目录。例如:
innodb_redo_log_archive_dirs='label1:/backups1;label2:/backups2'
标签可以是任何字符串,除了冒号 (:) 之外,冒号 (:) 不允许出现。空标签也允许,但是仍然需要冒号 (:)。
路径必须指定,并且目录必须存在。路径可以包含冒号 (:), 但是分号 (;) 不允许出现。
-
Command-Line Format --innodb-redo-log-capacity=#
System Variable innodb_redo_log_capacity
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 104857600
Minimum Value 8388608
Maximum Value 549755813888
Unit 字节 定义了redo日志文件占用的磁盘空间。
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 redo log capacity将被计算为(innodb_log_files_in_group * innodb_log_file_size)。这次计算不会修改未使用的innodb_redo_log_capacity
设置的值。服务器状态变量
Innodb_redo_log_capacity_resized
表示所有redo log文件的总redo log capacity。如果启用了
innodb_dedicated_server
,则innodb_redo_log_capacity
值将自动配置,如果未明确定义。更多信息,请见第17.8.12节,“Enabling Automatic Configuration for a Dedicated MySQL Server”。更多信息,请见第17.6.5节,“Redo Log”。
-
Command-Line Format --innodb-redo-log-encrypt[={OFF|ON}]
System Variable innodb_redo_log_encrypt
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value OFF
控制使用InnoDB数据在休眠状态加密特性对redo log数据进行加密。默认情况下,redo log数据的加密是禁用的。更多信息,请见Redo Log Encryption。
-
Command-Line Format --innodb-replication-delay=#
System Variable innodb_ replication_delay
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 4294967295
Unit 毫秒 如果
innodb_thread_concurrency
达到,则在副本服务器上延迟复制线程的毫秒数。 -
Command-Line Format --innodb-rollback-on-timeout[={OFF|ON}]
System Variable innodb_rollback_on_timeout
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
默认情况下,
InnoDB
在事务超时时只回滚最后一个语句。如果指定了--innodb-rollback-on-timeout
InnoDB
中止并回滚整个事务。 -
Command-Line Format --innodb-rollback-segments=#
System Variable innodb_rollback_segments
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 128
Minimum Value 1
Maximum Value 128
innodb_rollback_segments
定义了每个回滚表空间和全局临时表空间为事务生成undo记录所分配的 rollback segments 数量。每个回滚段支持的事务数量取决于 InnoDB 页大小和每个事务分配的undo日志数量。更多信息,请见第17.6.6节,“Undo Logs”。相关信息,请见第17.3节,“InnoDB Multi-Versioning”。关于undo表空间的信息,请见第17.6.3.4节,“Undo Tablespaces”。
-
innodb_saved_page_number_debug
Command-Line Format --innodb-saved-page-number-debug=#
System Variable innodb_saved_page_number_debug
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 2^32-1
保存页面号码。将
innodb_fil_make_page_dirty_debug
选项设置为脏页面,定义在innodb_saved_page_number_debug
的页面。只有在使用WITH_DEBUG
CMake选项编译debug支持时,innodb_saved_page_number_debug
选项才可用。 -
Command-Line Format --innodb-segment-reserve-factor=#
System Variable innodb_segment_reserve_factor
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 数字 Default Value 12.5
Minimum Value 0.03
Maximum Value 40
定义了表空间文件段页的空页百分比。该设置适用于每个表和通用表空间。
innodb_segment_reserve_factor
的默认设置为 12.5%,与之前的 MySQL 发布版本中保留的页面百分比相同。更多信息,请参见Configuring the Percentage of Reserved File Segment Pages。
-
Command-Line Format --innodb-sort-buffer-size=#
System Variable innodb_sort_buffer_size
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type Integer Default Value 1048576
Minimum Value 65536
Maximum Value 67108864
Unit bytes 该变量定义了在执行在线 DDL操作时,记录并发 DML 的临时日志文件的扩展大小,以及读取缓冲区和写入缓冲区的大小。
-
Command-Line Format --innodb-spin-wait-delay=#
System Variable innodb_spin_wait_delay
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 6
Minimum Value 0
Maximum Value 1000
最大 spin 锁之间的等待时间。该机制的低级实现因硬件和操作系统的组合而异,因此延迟不对应于固定的时间间隔。
可以与
innodb_spin_wait_pause_multiplier
变量结合使用,以获取更好的控制 spin-锁轮询延迟的能力。更多信息,请见第17.8.8节,“配置spin锁轮询”。
-
innodb_spin_wait_pause_multiplier
Command-Line Format --innodb-spin-wait-pause-multiplier=#
System Variable innodb_spin_wait_pause_multiplier
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type 整数 Default Value 50
Minimum Value 0
Maximum Value 100
定义了在等待获取互斥锁或读写锁时,spin-wait循环中PAUSE指令的数量倍数值。
更多信息,请参见第17.8.8节,“配置 spin 锁 轮询”。
-
Command-Line Format --innodb-stats-auto-recalc[={OFF|ON}]
System Variable innodb_stats_auto_recalc
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
使InnoDB自动重新计算持久统计,当表中的数据发生了substantially的变化。阈值是表中的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
Command-Line Format --innodb-stats-include-delete-marked[={OFF|ON}]
System Variable innodb_stats_include_delete_marked
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value 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节,“配置持久优化器统计信息参数”。
-
Command-Line Format --innodb-stats-method=value
System Variable innodb_stats_method
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Enumeration Default Value nulls_equal
Valid Values 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索引统计信息收集”。
-
Command-Line Format --innodb-stats-on-metadata[={OFF|ON}]
System Variable innodb_stats_on_metadata
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
这个选项仅在优化器统计信息配置为非持久时生效。优化器统计信息不会被 persisted 到磁盘中,当
innodb_stats_persistent
被禁用或在单个表创建或更改时使用STATS_PERSISTENT=0
。更多信息,请见第17.8.10.2节,“配置非持久优化器统计参数”。当
innodb_stats_on_metadata
启用时,InnoDB
在元数据语句,如SHOW TABLE STATUS
,或访问信息_schema中的TABLES
或STATISTICS
表时更新非持久的统计信息。(这些更新类似于ANALYZE TABLE
的操作。)当禁用时,InnoDB
在这些操作中不更新统计信息。将设置留空可以提高对包含大量表或索引的架构的访问速度,也可以提高执行计划的稳定性,对于涉及到InnoDB
表的查询。要更改设置,请执行语句
SET GLOBAL innodb_stats_on_metadata=
mode
是mode
ON
或OFF
(或1
或0
)。更改设置需要具有足够的权限来设置全局系统变量(见第7.1.9.1节,“系统变量权限”),并且立即影响所有连接的操作。 -
Command-Line Format --innodb-stats-persistent[={OFF|ON}]
System Variable innodb_stats_persistent
Scope 全局
Dynamic 是
SET_VAR
Hint Applies否
Type 布尔值
Default Value ON
指定是否将
InnoDB
索引统计信息持久化到磁盘上。否则,统计信息可能会频繁重新计算,这可能导致查询执行计划的变化。这一设置与每个表创建时一起存储。你可以在全局级别设置innodb_stats_persistent
,或者使用STATS_PERSISTENT
子句在CREATE TABLE
和ALTER TABLE
语句中 Override系统级别设置,配置单个表的持久统计信息。更多信息,请见第17.8.10.1节,“配置持久优化器统计参数”。
-
innodb_stats_persistent_sample_pages
Command-Line Format --innodb-stats-persistent-sample-pages=#
System Variable innodb_stats_persistent_sample_pages
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 20
Minimum Value 1
Maximum Value 18446744073709551615
当估算索引页面的卡drodal和其他统计信息,例如由
ANALYZE TABLE
计算的索引列统计信息时,可以指定该值。增加该值可以提高索引统计信息的准确性,从而改善查询执行计划,但是在执行ANALYZE TABLE
语句时增加了I/O操作的开销。对于更多信息,请见第17.8.10.1节,“persistent Optimizer Statistics Parameters”。Note将
innodb_stats_persistent_sample_pages
设置为高值可能会导致ANALYZE TABLE
执行时间过长。要估算数据库页面被ANALYZE TABLE
访问的数量,请见第17.8.10.3节,“Estimating ANALYZE TABLE Complexity for InnoDB Tables”。innodb_stats_persistent_sample_pages
只在表的innodb_stats_persistent
启用时生效;当innodb_stats_persistent
禁用时,innodb_stats_transient_sample_pages
生效。 -
innodb_stats_transient_sample_pages
Command-Line Format --innodb-stats-transient-sample-pages=#
System Variable innodb_stats_transient_sample_pages
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Integer Default Value 8
Minimum Value 1
Maximum Value 18446744073709551615
当估算索引页面的卡drodal和其他统计信息,例如由
ANALYZE TABLE
计算的索引列统计信息时,可以指定要采样多少个索引页面。默认值为8。增加该值可以提高索引统计信息的准确性,从而改善查询执行计划,但是在打开InnoDB表或重新计算统计信息时将增加I/O操作。更多信息,请见Section 17.8.10.2, “Configuring Non-Persistent Optimizer Statistics Parameters”
Note将
innodb_stats_transient_sample_pages
设置为高值可能会导致ANALYZE TABLE
执行时间过长。要估算ANALYZE TABLE
访问数据库页面的数量,请见Section 17.8.10.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”
innodb_stats_transient_sample_pages
只在表的innodb_stats_persistent
被禁用时生效;当innodb_stats_persistent
启用时,innodb_stats_persistent_sample_pages
生效แทน。取代了在 MySQL 8.0 中删除的innodb_stats_sample_pages
。更多信息,请见第17.8.10.2节,“Configuring Non-Persistent Optimizer Statistics Parameters”。 -
Command-Line Format --innodb-status-output[={OFF|ON}]
System Variable innodb_status_output
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value OFF
启用或禁用标准
InnoDB
监控的周期性输出。也可以与innodb_status_output_locks
结合使用,以启用或禁用InnoDB
锁监控的周期性输出。更多信息,请见第17.17.2节,“Enabling InnoDB Monitors”。 -
Command-Line Format --innodb-status-output-locks[={OFF|ON}]
System Variable innodb_status_output_locks
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用或禁用
InnoDB
锁监控。当启用时,InnoDB
锁监控将在SHOW ENGINE INNODB STATUS
输出和 MySQL 错误日志中的周期性输出中打印额外的锁定信息。InnoDB
锁监控的周期性输出将作为标准InnoDB
监控输出的一部分打印到 MySQL 错误日志中。因此,必须启用标准InnoDB
监控,以便InnoDB
锁监控可以周期性地将数据打印到 MySQL 错误日志中。更多信息,请见第17.17.2节,“Enabling InnoDB Monitors”。 -
Command-Line Format --innodb-strict-mode[={OFF|ON}]
System Variable innodb_strict_mode
Scope Global, Session Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value ON
当
innodb_strict_mode
启用时,InnoDB
在检查无效或不兼容的表选项时返回错误,而不是警告。它检查KEY_BLOCK_SIZE、ROW_FORMAT、DATA DIRECTORY、TEMPORARY和TABLESPACE选项是否相互兼容,并且与其他设置兼容。
innodb_strict_mode=ON
还启用了在创建或更改表时对行大小的检查,以防止INSERT或UPDATE操作因记录太大而失败,导致选择的页面大小无法存储该记录。您可以在启动
mysqld
时或在 MySQL 配置文件中启用或禁用innodb_strict_mode
。您还可以使用语句SET [GLOBAL|SESSION] innodb_strict_mode=
在运行时启用或禁用mode
innodb_strict_mode
,其中
是 eithermode
ON
或OFF
。更改GLOBAL
设置需要具有足够的权限以设置全局系统变量(见第7.1.9.1节,“系统变量权限”),对所有连接的客户端产生影响。任何客户端都可以更改innodb_strict_mode
的SESSION
设置,该设置仅对该客户端生效。设置会话值的系统变量是一个受限制的操作。会话用户必须具有足够的权限以设置受限制的会话变量。见第7.1.9.1节,“系统变量权限”。
-
Command-Line Format --innodb-sync-array-size=#
System Variable innodb_ sync_array_size
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 1
Minimum Value 1
Maximum Value 1024
定义了互斥锁/锁等待数组的大小。增加值将拆分内部用于协调线程的数据结构,以提高工作负载中大量等待线程的并发性。这设置在 MySQL 实例启动时配置,不能在实例运行后更改。在生产环境中,通常需要根据实际情况进行调整。
-
Command-Line Format --innodb-sync-spin-loops=#
System Variable innodb_sync_spin_loops
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 30
Minimum Value 0
Maximum Value 4294967295
线程等待 InnoDB 互斥锁被释放的次数,超过这个次数后线程将被挂起。
-
Command-Line Format --innodb-sync-debug[={OFF|ON}]
System Variable innodb_sync_debug
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
启用InnoDB存储引擎的同步调试检查。这选项仅在使用
WITH_ DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-table-locks[={OFF|ON}]
System Variable innodb_table_locks
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
如果
autocommit = 0
,InnoDB
会尊重LOCK TABLES
;MySQL直到所有其他线程释放了对该表的所有锁定后才会返回LOCK TABLES ... WRITE
。innodb_表锁定
的默认值是1,这意味着LOCK TABLES
会导致InnoDB对该表进行内部锁定,如果autocommit = 0
。innodb_表锁定 = 0
对使用LOCK TABLES ... WRITE
显式锁定的表无效。但是,对于通过触发器或LOCK TABLES ... READ
隐式锁定的表,它将生效。 -
Command-Line Format --innodb-temp-数据文件路径=file_name
System Variable innodb_temp_数据文件路径
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 字符串 Default Value ibtmp1:12M:autoextend
定义了全局临时表空间数据文件的相对路径、名称、大小和属性。全局临时表空间存储用户创建的临时表的回滚段。
如果未指定
innodb_temp_数据文件路径
的值,缺省行为是创建一个名为ibtmp1
的自动扩展数据文件,在innodb_data_home_dir
目录下。初始文件大小略大于12MB。全局临时表空间数据文件的语法包括文件名、文件大小和
autoextend
和max
属性:file_name:file_size[:autoextend[:max:max_file_size]]
全局临时表空间数据文件不能与其他
InnoDB
数据文件具有相同的名称。创建全局临时表空间数据文件失败或错误将被视为致命错误,服务器启动将被拒绝。文件大小以KB、MB或GB形式指定,通过在大小值后添加
K
、M
或G
来实现。文件大小之和必须略大于12MB。操作系统确定单个文件的大小限制。在支持大文件的操作系统上,文件大小可以超过4GB。对全局临时表空间数据文件使用原始磁盘分区不受支持。
只能在
innodb_temp_data_file_path
设置中指定的最后一个数据文件上使用autoextend
和max
属性。例如:[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
更多信息,请见全局临时表空间。
-
Command-Line Format --innodb-temp-tablespaces-dir=dir_name
System Variable innodb_temp_tablespaces_dir
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 目录名称 Default Value #innodb_temp
定义了
InnoDB
在启动时创建会话临时表空间池的位置。默认位置是数据目录中的#innodb_temp
目录。可以使用完全限定路径或相对数据目录的路径。会话临时表空间总是存储用户创建的临时表和优化器使用
InnoDB
创建的内部临时表。 (之前,内部临时表的磁盘存储引擎由internal_tmp_disk_storage_engine
系统变量确定,已经不再支持。请见磁盘内部临时表存储引擎。)更多信息,请见会话临时表空间。
-
Command-Line Format --innodb-thread-concurrency=#
System Variable innodb_thread_concurrency
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 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。Note从操作系统角度来看,使用资源管理解决方案来管理CPU时间的分配可能比绑定
mysqld
进程更好。例如,您可以将90%的虚拟CPU时间分配给某个应用程序,而在其他关键进程不运行时缩小该值到40%,当其他关键进程运行时恢复该值。 -
在一些情况下,最佳
innodb_thread_concurrency
设置可能小于虚拟CPU的数量。 -
如果
innodb_thread_concurrency
值太高,可以导致性能下降,因为系统内部和资源的竞争增加。 -
定期监控和分析系统。工作负载、用户数量或计算环境的变化可能需要调整
innodb_thread_concurrency
设置。
值为0将禁用
queries inside InnoDB
和queries in queue
计数器在SHOW ENGINE INNODB STATUS
输出的ROW OPERATIONS
部分。相关信息,请参见第17.8.4节,“InnoDB线程并发配置”。
-
-
Command-Line Format --innodb-thread-sleep-delay=#
System Variable innodb_thread_sleep_delay
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 10000
Minimum Value 0
Maximum Value 1000000
Unit 微秒 InnoDB线程睡眠前在队列中等待的时间,单位微秒。默认值为10000。值为0将禁用睡眠。你可以将
innodb_adaptive_max_sleep_delay
设置为你允许的最高值,并将innodb_thread_sleep_delay
自动调整,以便在系统轻载或近满负荷时使线程调度机制工作顺滑。更多信息,请见第17.8.4节,“InnoDB线程并发配置”。
-
Command-Line Format --innodb-tmpdir=dir_name
System Variable innodb_tmpdir
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 目录名称 Default Value NULL
用于定义在线
ALTER TABLE
操作重建表时创建的临时排序文件的Alternate目录。在线
ALTER TABLE
操作重建表时,也会在原始表目录中创建一个临时表文件。innodb_ tmpdir
选项不适用于临时表文件。有效的值是 MySQL 数据目录路径以外的任何目录路径。如果值为 NULL(默认),临时文件将被创建在 MySQL 临时目录 (
$TMPDIR
在 Unix 上,%TEMP%
在 Windows 上,或者由--tmpdir
配置选项指定的目录)。如果指定了目录,目录存在性和权限只在使用innodb_ tmpdir
配置语句时进行检查。如果提供了符号链接在目录字符串中,符号链接将被解析并存储为绝对路径。路径不应超过 512 字节。在线ALTER TABLE
操作如果innodb_ tmpdir
设置为无效目录,将报告错误。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
Command-Line Format --innodb-trx-purge-view-update-only-debug[={OFF|ON}]
System Variable innodb_trx_purge_view_update_only_debug
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value OFF
暂停删除标记记录的 purging,允许 purge 视图被更新。这选项人为地创建了 purge 视图可以被更新,但purges还没有执行的情况。这选项仅在使用
WITH_DEBUG
CMake 选项编译 debugging 支持时可用。 -
Command-Line Format --innodb-trx-rseg-n-slots-debug=#
System Variable innodb_trx_rseg_n_slots_debug
Scope Global Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 0
Minimum Value 0
Maximum Value 1024
设置一个调试标志,限制
TRX_ RSEG_N_SLOTS
的值为给定的值,以便在trx_rsegf_undo_find_free
函数中查找undo日志段中的空槽。这选项仅在使用WITH_DEBUG
CMake选项编译debug支持时可用。 -
Command-Line Format --innodb-undo-directory=dir_name
System Variable innodb_undo_directory
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type Directory name InnoDB 创建undo表空间的路径。通常用于将undo表空间置于不同的存储设备上。
没有默认值(它是NULL)。如果
innodb_undo_directory
变量未定义,undo表空间将在数据目录中创建。MySQL实例初始化时创建的默认undo表空间(
innodb_undo_001
和innodb_undo_002
)总是位于定义innodb_undo_directory
变量的目录中。使用
CREATE UNDO TABLESPACE
语法创建的undo tablespaces将在由innodb_undo_目录
变量定义的目录中创建,如果没有指定不同的路径。更多信息,请见第17.6.3.4节,“Undo Tablespaces”。
-
Command-Line Format --innodb-undo-log-encrypt[={OFF|ON}]
System Variable innodb_undo_log_encrypt
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo Type Boolean Default Value OFF
控制使用InnoDB数据在休眠状态加密特性对undo日志数据进行加密。仅适用于存储在单独的undo tablespaces中的undo日志数据。见第17.6.3.4节,“Undo Tablespaces”。对系统表空间中的undo日志数据不支持加密。更多信息,请见Undo Log Encryption。
-
Command-Line Format --innodb-undo-log-truncate[={OFF|ON}]
System Variable innodb_undo_log_truncate
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
启用时,undo 表空间超过由
innodb_max_undo_log_size
定义的阈值将被标记为截断。只能截断 undo 表空间,不支持截断系统表空间中的undo日志。为了截断,至少需要有两个undo 表空间。可以使用
innodb_purge_rseg_truncate_frequency
变量来加速截断undo 表空间。更多信息,请见截断Undo表空间。
-
Command-Line Format --innodb-undo-tablespaces=#
Deprecated 是 System Variable innodb_undo_tablespaces
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 整数 Default Value 2
Minimum Value 2
Maximum Value 127
定义了undo 表空间的数量,用于
InnoDB
。默认值和最小值为 2。Noteinnodb_undo_表空间
变量已弃用;设置它无效。你应该预期在未来 MySQL 发布中将其删除。更多信息,请见第17.6.3.4节,“Undo 表空间”。
-
Command-Line Format --innodb-用-fdatasync[={OFF|ON}]
System Variable innodb_用_fdatasync
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
在支持
fdatasync()
系统调用平台上,启用innodb_用_fdatasync
允许使用fdatasync()
而不是fsync()
系统调用来执行操作系统刷新。一个fdatasync()
调用不会将更改写入文件元数据,除非在后续数据检索时需要提供潜在的性能优势。innodb_flush_method
设置的子集,如fsync
、O_DSYNC
和O_DIRECT
,使用fsync()
系统调用。变量innodb_use_fdatasync
适用于使用这些设置时。在MySQL 8.4之前,这个选项默认禁用。
-
Command-Line Format --innodb-use-native-aio[={OFF|ON}]
System Variable innodb_use_native_aio
Scope 全局 Dynamic 否 SET_VAR
Hint Applies否 Type 布尔值 Default Value ON
指定是否使用异步I/O子系统。这变量不能在服务器运行时更改。通常,您不需要配置这个选项,因为它默认启用。
这特性可以提高高度I/O绑定的系统的可扩展性,这些系统通常在
SHOW ENGINE INNODB STATUS
输出中显示许多pending reads/writes。使用大量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文件系统和Linux内核不支持AIO的tmpfs组合。更多信息,请见第17.8.6节,“使用 Linux 上的异步 I/O”。
-
innodb_validate_tablespace_paths
Command-Line Format --innodb-validate-tablespace-paths[={OFF|ON}]
System Variable innodb_validate_tablespace_paths
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type Boolean Default Value ON
控制表空间文件路径验证。在启动时,
InnoDB
将已知的表空间文件路径与数据字典中存储的表空间文件路径进行比较,以便在表空间文件被移动到不同的位置时验证。变量innodb_validate_tablespace_paths
允许禁用表空间路径验证。这一特性旨在为环境提供,环境中不需要移动表空间文件。禁用路径验证可以提高系统启动时间,但是在系统中有大量表空间文件时。Warning在启用了表空间路径验证的服务器上移动表空间文件可能会导致未定义的行为。
-
InnoDB 版本号。这是一个遗留变量,值与 MySQL 服务器
version
相同。 -
Command-Line Format --innodb-write-io-threads=#
System Variable innodb_write_io_threads
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type Integer Default Value 4
Minimum Value 1
Maximum Value 64
InnoDB 写操作的I/O线程数量。默认值为4。与之对应的读线程数量是
innodb_read_io_threads
。更多信息,请参见第17.8.5节,“配置背景InnoDB I/O线程数量”。对于一般I/O调整建议,请参见第10.5.8节,“优化InnoDB磁盘I/O”。Note在 Linux 系统上,运行多个 MySQL 服务器(通常超过12个)时,使用默认设置的
innodb_read_io_threads
、innodb_write_io_threads
和 Linuxaio-max-nr
设置可能会超过系统限制。理想情况下,增加aio-max-nr
设置;作为 workaround,您可以减少 MySQL 变量之一或两个的设置。同时,考虑
sync_binlog
的值,该变量控制二进制日志与磁盘同步。对于一般I/O调整建议,请参见第10.5.8节,“优化InnoDB磁盘I/O”。