ITPub博客

首页 > 数据库 > > 14.14 InnoDB 启动选项和系统变量

14.14 InnoDB 启动选项和系统变量

作者:飘絮絮絮丶 时间:2020-05-11 14:29:02 0 删除 编辑

参考官方文档:
dev.mysql.com/doc/refma


启动选项可以在命令行或者配置文件中指定


下面只列出常见的变量:

  • --innodb-status-file

    控制InnoDB是否在MYSQL 数据目录创建一个名称为innodb_status.pid的文件。如果启用,InnoDB定期将SHOW ENGINE INNODB STATUS的输出写入此文件


    默认情况下,不会创建该文件。 要创建它,请使用--innodb-status-file = 1选项启动mysqld。 在正常关闭时会删除该文件。

  • innodb_autoextend_increment



系统表空间满之后,每次自动拓展的大小,默认值是64,最小为1,最大为1000.


innodb_autoextend_increment设置不会影响file-per表空间文件或常规表空间文件。 无论innodb_autoextend_increment设置如何,这些文件都是自动扩展的。 初始扩展是少量的,之后扩展以4MB的增量发生。

  • innodb_change_buffer_max_size

默认值为25,最小为0,最大为50


InnoDB更改缓冲区的最大大小,占缓冲池总大小的百分比。 您可以为具有大量插入,更新和删除活动的MySQL服务器增加此值,或者为具有用于报告的不变数据的MySQL服务器减少该值

  • innodb_deadlock_detect



默认是ON


此选项用于禁用死锁检测。 在高并发系统上,当许多线程等待同一个锁时,死锁检测会导致速度减慢。 有时,在发生死锁时,禁用死锁检测并依赖innodb_lock_wait_timeout设置进行事务回滚可能更有效。

  • innodb_disable_sort_file_cache

默认是OFF
为合并排序临时文件禁用操作系统文件系统缓存。 效果等价于O_DIRECT打开文件。


  • innodb_disable_resize_buffer_pool_debug

默认是ON


禁用InnoDB缓冲池的大小调整。 仅当使用WITH_DEBUG CMake选项编译调试支持时,此选项才可用。

  • innodb_doublewrite

默认是ON


启用(默认)时,InnoDB将所有数据存储两次,首先存储到doublewrite缓冲区,然后存储到实际的数据文件。 可以使用--skip-innodb_doublewrite关闭此变量,以获得基准或需要最高性能的情况,而不是关注数据完整性或可能的故障。


如果系统表空间数据文件(ibdata *文件)位于支持原子写入的Fusion-io设备上,则会自动禁用双写缓冲,并且Fusion-io原子写入将用于所有数据文件。 由于双写缓冲区设置是全局的,因此对于驻留在非Fusion-io硬件上的数据文件,也禁用双写缓冲。 此功能仅在Fusion-io硬件上受支持,仅在Linux上为Fusion-io NVMFS启用。 要充分利用此功能,建议使用innodb_flush_method设置O_DIRECT。

  • innodb_fast_shutdown



默认是1


InnoDB关机模式。 如果值为0,InnoDB会在关闭之前执行慢速关闭,完全清除和更改缓冲区合并。 如果值为1(默认值),InnoDB会在关闭时跳过这些操作,这一过程称为快速关闭。 如果该值为2,则InnoDB刷新其日志并冷关闭,就好像MySQL崩溃一样; 没有提交的事务丢失,但崩溃恢复操作使下一次启动需要更长的时间。




在仍然缓冲大量数据的极端情况下,缓慢关闭可能需要几分钟甚至几小时。 在升级或降级MySQL主要版本之前使用慢速关闭技术,以便在升级过程更新文件格式时完全准备好所有数据文件。


在紧急情况或故障排除情况下使用innodb_fast_shutdown = 2,以便在数据存在损坏风险之前以最快的速度关机。



  • innodb_fill_factor



默认值 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条目的外部页面。

  • innodb_flush_log_at_timeout

默认值为1 最小值为1,最大值是2700


每N秒写入并刷新日志。 innodb_flush_log_at_timeout允许增加刷新之间的超时时间,以减少刷新并避免影响二进制日志组提交的性能。 innodb_flush_log_at_timeout的默认设置是每秒一次。


  • innodb_flush_log_at_trx_commit

枚举类型,默认值是1,可以是0,1,2。


完全ACID合规性需要默认值1。 使用此值,InnoDB日志缓冲区的内容将在每次事务提交时写入日志文件,并将日志文件刷新到磁盘。


值为0时,InnoDB日志缓冲区的内容大约每秒写入日志文件一次,日志文件刷新到磁盘。 在事务提交时不会执行从日志缓冲区到日志文件的写入操作。 由于流程调度问题,不能保证每秒一次冲洗。 因为刷新到磁盘操作仅大约每秒发生一次,所以在任何mysqld进程崩溃的情况下,最多可能会丢失一秒的事务。


值为2时,InnoDB日志缓冲区的内容在每次事务提交后写入日志文件,日志文件大约每秒刷新一次到磁盘。 由于流程调度问题,每秒一次的flush不会100%保证每秒发生一次。 由于刷新到磁盘操作仅大约每秒发生一次,因此在操作系统崩溃或断电时可能会丢失最多一秒的事务。


--1和2的区别是 2不会强制刷磁盘,0和2 的区别是,0不会讲内存中的日志写到日志文件...所以安全级别 1>2>0


InnoDB日志刷新频率由innodb_flush_log_at_timeout控制,允许您将日志刷新频率设置为N秒(其中N为1 ... 2700,默认值为1)。 但是,任何mysqld进程崩溃都可以消除最多N秒的事务。


DDL更改和其他内部InnoDB活动刷新InnoDB日志,与innodb_flush_log_at_trx_commit设置无关。


无论innodb_flush_log_at_trx_commit设置如何,InnoDB崩溃恢复都能正常工作。 事务要么完全应用,要么完全清除。


对于将InnoDB与事务一起使用的复制设置的持久性和一致性:

  • 如果启用了二进制日志记录,请设置sync_binlog = 1。
  • 始终设置innodb_flush_log_at_trx_commit = 1。


  • innodb_flush_method

默认值是NULL


定义用于将数据刷新到InnoDB数据文件和日志文件的方法,这可能会影响I / O吞吐量。


如果在类Unix系统上将innodb_flush_method设置为NULL,则默认使用fsync选项。 如果在Windows上将innodb_flush_method设置为NULL,则默认使用async_unbuffered选项。


类Unix系统的innodb_flush_method选项包括:

  • fsync:InnoDB使用fsync()系统调用来刷新数据和日志文件。 fsync是默认设置。
  • O_DSYNC:InnoDB使用O_SYNC打开并刷新日志文件,使用fsync()刷新数据文件。 InnoDB没有直接使用O_DSYNC,因为在很多种Unix上都存在问题。
  • littlesync

此选项用于内部性能测试,目前不受支持。 使用风险由您自己承担。

  • nosync:

此选项用于内部性能测试,目前不受支持。 使用风险由您自己承担。

  • O_DIRECT:

InnoDB使用O_DIRECT(或Solaris上的directio())打开数据文件,并使用fsync()来刷新数据和日志文件。 某些GNU / Linux版本,FreeBSD和Solaris上提供了此选项。

  • O_DIRECT_NO_FSYNC

nnoDB在刷新I / O期间使用O_DIRECT,但之后跳过fsync()系统调用。 此设置适用于某些类型的文件系统,但不适用于其他类型。 例如,它不适合XFS。 如果您不确定您使用的文件系统是否需要fsync(),例如保留所有文件元数据,请改用O_DIRECT。



  • innodb_flush_neighbors



默认为1,可以设置为0,1,2


指定从InnoDB缓冲池刷新页面是否也刷新相同extent内的其他脏页。

  • 默认值1从缓冲池中刷新相同extent内的连续脏页。
  • 设置为0会关闭innodb_flush_neighbors,并且不会从缓冲池中刷新其他脏页。
  • 设置为2会从缓冲池中刷新相同extent的脏页。



当表数据存储在传统HDD存储设备上时,与在不同时间刷新各个页面相比,在一次操作中刷新这些相邻页面减少了I / O开销(主要用于磁盘搜索操作)。 对于存储在SSD上的表数据,查找时间不是一个重要因素,您可以关闭此设置以分散写入操作。


  • innodb_flush_sync

innodb_flush_sync参数(默认情况下是ON启用)会导致在检查点发生的I / O活动突发时忽略innodb_io_capacity设置。 要遵守innodb_io_capacity设置定义的InnoDB后台I / O活动限制,请禁用innodb_flush_sync。


  • innodb_force_load_corrupted

默认是OFF
允许InnoDB在启动时加载被标记为已损坏的表。 仅在故障排除期间使用,以恢复无法访问的数据。 完成故障排除后,请禁用此设置并重新启动服务器。


  • innodb_lock_wait_timeout

默认值是50,最小为1,最大为 1073741824






InnoDB事务等待行锁定,决定放弃之前的时间(以秒为单位)。 默认值为50秒。 尝试访问由另一个InnoDB事务锁定的行的事务,访问超时后会出现:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction






发生锁定等待超时时,将回滚当前语句(而不是整个事务)。 要使整个事务回滚,请使用--innodb_rollback_on_timeout选项启动服务器。




您可以为高度交互的应用程序或OLTP系统降低此值,以快速显示用户反馈或将更新放入队列以便稍后处理。 您可以为长时间运行的后端操作增加此值,例如等待其他大型插入或更新操作完成的数据仓库中。


innodb_lock_wait_timeout仅适用于InnoDB行锁。 InnoDB内部不会发生MySQL表锁定,并且此超时不适用于表锁定等待。




您可以为高度交互的应用程序或OLTP系统降低此值,以快速显示用户反馈或将更新放入队列以便稍后处理。 您可以为长时间运行的后端操作增加此值,例如等待其他大型插入或更新操作完成的数据仓库中的转换步骤。


innodb_lock_wait_timeout仅适用于InnoDB行锁。 InnoDB内部不会发生MySQL表锁定,并且此超时不适用于等待表锁定。




启用innodb_deadlock_detect时,锁定等待超时值不适用于死锁(默认值),因为InnoDB会立即检测到死锁并回滚其中一个死锁事务。 禁用innodb_deadlock_detect时,InnoDB会在发生死锁时依赖innodb_lock_wait_timeout进行事务回滚。 请参见第14.5.5.2节“死锁检测和回滚”。




innodb_lock_wait_timeout可以在运行时使用SET GLOBAL或SET SESSION语句设置。 更改GLOBAL设置需要SUPER权限,并影响随后连接的所有客户端的操作。 任何客户端都可以更改innodb_lock_wait_timeout的SESSION设置,该设置仅影响该客户端。




  • innodb_log_buffer_size



在大于5.7.6版本中,默认值是 16777216,最大值是 4294967295


InnoDB用于写入磁盘上日志文件的缓冲区大小(以字节为单位)。 通过引入32k和64k innodb_page_size值,默认值从8MB变为16MB。 大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将日志写入磁盘。 因此,如果您有更新,插入或删除许多行的事务,则使日志缓冲区更大可以节省磁盘I / O.




  • innodb_log_checksums



默认值为ON


启用或禁用重做日志页面的校验和。 innodb_log_checksums取代了innodb_log_checksum_algorithm。


innodb_log_checksums = ON启用重做日志页面的CRC-32C校验和算法。 禁用innodb_log_checksums时,将忽略重做日志页checksum字段的内容。


永远不会禁用重做日志header页和重做日志检查点页面上的校验和。




  • innodb_log_compressed_pages



默认是ON


指定是否将重新压缩的页面的images写入重做日志。 当对压缩数据进行更改时,可能会发生重新压缩。


默认情况下启用innodb_log_compressed_pages以防止在恢复期间使用不同版本的zlib压缩算法时可能发生的损坏。 如果您确定zlib版本不会更改,则可以禁用innodb_log_compressed_pages以减少修改压缩数据的工作负载的重做日志生成。




  • innodb_log_file_size



默认值: 50331648,最小值: 4194304
最大值为: 512GB / innodb_log_files_in_group


日志组中每个日志文件的大小(以字节为单位)。 日志文件(innodb_log_file_size * innodb_log_files_in_group)的总大小不能超过略小于512GB的最大值。 例如,一对255 GB的日志文件接近限制但不超过它。 默认值为48MB。


通常,日志文件的总大小应该足够大,以至于服务器可以消除工作负载活动中的高峰和低谷,这通常意味着有足够的重做日志空间来处理超过一小时的写入活动。 值越大,缓冲池中需要的检查点刷新活动越少,从而节省磁盘I / O. 较大的日志文件也会使崩溃恢复速度变慢,但MySQL 5.5及更高版本中恢复性能的改进使得日志文件大小不再是考虑因素。


在MySQL 5.7.11中,最小innodb_log_file_size值从1MB增加到4MB。




  • innodb_log_files_in_group



默认值是2,最小值是2,最大值是100


日志组中的日志文件数。 InnoDB以循环方式写入文件。 默认(和推荐)值为2.文件的位置由innodb_log_group_home_dir指定。 日志文件(innodb_log_file_size * innodb_log_files_in_group)的总大小最大可达512GB。




  • innodb_log_group_home_dir



InnoDB重做日志文件的目录路径,其编号由innodb_log_files_in_group指定。 如果未指定任何InnoDB日志变量,则缺省情况是在MySQL数据目录中创建名为ib_logfile0和ib_logfile1的两个文件。 日志文件大小由innodb_log_file_size系统变量给出。




  • innodb_log_write_ahead_size

默认值是8192,最小值为512,最大值等于innodb_page_size


定义重做日志的预写块大小(以字节为单位)。 要避免“read-on-write”,请设置innodb_log_write_ahead_size以匹配操作系统或文件系统缓存块大小。 默认设置为8192字节。 由于重做日志的预写块大小与操作系统或文件系统高速缓存块大小不匹配,重做日志块未完全高速缓存到操作系统或文件系统时,会发生 “read-on-write“。




innodb_log_write_ahead_size的有效值是InnoDB日志文件块大小(2的n次方)的倍数。 最小值是InnoDB日志文件块大小(512)。 指定最小值时不会发生预写。 最大值等于innodb_page_size值。 如果为innodb_log_write_ahead_size指定的值大于innodb_page_size值,则innodb_log_write_ahead_size设置将截断为innodb_page_size值。


将innodb_log_write_ahead_size值设置为与操作系统或文件系统高速缓存块大小相比过低的值会导致“read-on-write”。 由于一次写入多个块,因此将值设置得过高可能会对日志文件写入的fsync性能产生轻微影响。




  • innodb_max_dirty_pages_pct

InnoDB尝试从缓冲池中刷新数据,以便脏页的百分比不超过此值。 默认值为75。


最小值为0.最大值为99.99


innodb_max_dirty_pages_pct设置为刷新活动建立了目标。 它不会影响flushing的速率。




  • innodb_max_dirty_pages_pct_lwm

默认值是0,最小值是0,最大值是99.99


定义一个低水位标记,表示启用预flush以控制脏页面比率的脏页面百分比。 默认值0完全禁用预flush行为。


  • innodb_max_undo_log_size

默认值 1073741824,最小值10485760,最大值为(2的64次方-1)




定义undo表空间的阈值大小。 如果undo表空间超过阈值,则在启用innodb_undo_log_truncate时会将其标记为截断。 默认值为1073741824字节(1024 MiB)。




  • innodb_monitor_disable



命令行格式 --innodb-monitor-disable=[counter|module|pattern|all]


禁用InnoDB指标计数器。 可以使用INFORMATION_SCHEMA.INNODB_METRICS表查询计数器数据。


innodb_monitor_disable ='latch'禁用SHOW ENGINE INNODB MUTEX的统计信息收集。


--对应相反的参数为 innodb_monitor_enable






  • innodb_monitor_reset

将InnoDB指标计数器的计数值重置为零。 可以使用INFORMATION_SCHEMA.INNODB_METRICS表查询计数器数据。




  • innodb_monitor_reset_all



重置InnoDB指标计数器的所有值( minimum, maximum等)。 可以使用INFORMATION_SCHEMA.INNODB_METRICS表查询计数器数据。




  • innodb_old_blocks_pct



默认值是37,最小值是5,最大值是95


指定用于旧块子列表的InnoDB缓冲池的近似百分比。 值的范围是5到95.默认值是37(即池的3/8)。 通常与innodb_old_blocks_time结合使用。




  • innodb_old_blocks_time



默认值为 1000,最小值为0,最大值为2**32-1


非零值可防止缓冲池被仅在短时间内引用的数据填充,例如在全表扫描期间。 增加此值可提供更多保护,防止全表扫描干扰缓冲池中缓存的数据。


指定插入旧子列表的块在第一次访问后必须保留的长度(以毫秒为单位),然后才能将其移动到新的子列表中。 如果值为0,则无论插入访问后多久发生,插入旧子列表的块在第一次访问时立即移动到新子列表。 如果该值大于0,则块保留在旧子列表中,直到在第一次访问后至少n毫秒发生访问。 例如,值1000会导致块在第一次访问后保留在旧子列表中1秒钟,然后才有资格移动到新子列表。


此配置选项通常与innodb_old_blocks_pct结合使用。




  • innodb_online_alter_log_max_size



默认值是 134217728,最小值65535,最大值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



默认值是-1(表示自动调整; 不要分配此文字值),最小值是10,最大值是 4294967295


仅当您使用多个InnoDB表空间时,此配置选项才有意义。 它指定MySQL可以一次保持打开的最大.ibd文件数。 最小值为10.如果未启用innodb_file_per_table,则默认值为300,否则为300和table_open_cache中的较高值。


用于.ibd文件的文件描述符仅用于InnoDB表。 它们独立于--open-files-limit服务器选项指定的那些,并且不影响表缓存的操作。


  • innodb_print_all_deadlocks



默认是OFF


启用此选项后,有关InnoDB用户事务中所有死锁的信息将记录在mysqld错误日志中。 否则,您将使用SHOW ENGINE INNODB STATUS命令查看有关上次死锁的信息。 偶尔的InnoDB死锁不一定是个问题,因为InnoDB会立即检测到这种情况并自动回滚其中一个事务。 如果应用程序没有适当的错误处理逻辑来检测回滚并重试其操作,则可以使用此选项来解决发生死锁的原因。 大量死锁可能表明需要为多个表发出的DML或SELECT ... FOR UPDATE语句的事务进行重构,以便每个事务以相同的顺序访问表,从而避免死锁条件。

  • innodb_purge_batch_size



默认值300,最小值为1,最大值为5000


定义从历史列表中清除一批中的分析和进程的撤消日志页数。 在多线程清除配置中,协调器清除线程将innodb_purge_batch_size除以innodb_purge_threads,并将该页数分配给每个清除线程。 innodb_purge_batch_size选项还定义了通过撤undo日志每128次迭代后清除释放的undo日志页数。


innodb_purge_batch_size选项用于结合innodb_purge_threads设置进行高级性能调整。 大多数MySQL用户不需要从其默认值。

  • innodb_purge_threads



默认值4,最小值1,最大值32


专用于InnoDB清除操作的后台线程数。 最小值1表示清除操作始终由后台线程执行,而不是作为主线程的一部分。 在一个或多个后台线程中运行清除操作有助于减少InnoDB内部的争用,从而提高可伸缩性。 将值增加到大于1会创建许多单独的清除线程,这可以提高在多个表上执行DML操作的系统的效率。 最大值为32。

  • innodb_purge_rseg_truncate_frequency



默认值是128,最小值是1,最大值是128


定义清除系统根据调用清除次数释放回滚段的频率。 在释放其回滚段之前,不能截断undo表空间。 通常,清除系统每调用128次清除就会释放回滚段。 默认值为128.减小此值会增加清除线程释放回滚段的频率。


innodb_purge_rseg_truncate_frequency旨在与innodb_undo_log_truncate一起使用。


  • innodb_random_read_ahead



默认为OFF


启用随机预读技术以优化InnoDB I / O.

  • innodb_read_io_threads



默认值 4 ,最小值1,最大值64


InnoDB中读取操作的I / O线程数。 它的写线程对应物是innodb_write_io_threads。


注意:
在Linux系统上,运行多个MySQL服务器(通常超过12个),使用innodb_read_io_threads,innodb_write_io_threads和Linux aio-max-nr设置的默认设置可能超出系统限制。 理想情况下,增加aio-max-nr设置; 作为解决方法,您可以减少一个或两个MySQL配置选项的设置。


  • innodb_read_only

默认值OFF
以只读模式启动InnoDB。 用于在只读介质上的数据库应用程序或数据集。 也可以在数据仓库中用于在多个实例之间共享相同的数据目录。

  • innodb_replication_delay



默认值为0,最小值为0,最大值为 4294967295


如果达到innodb_thread_concurrency,则slave服务器上的复制线程以毫秒为单位延迟。


  • innodb_rollback_on_timeout



默认是OFF


默认情况下,InnoDB仅回滚事务超时的最后一个语句。 如果指定了--innodb_rollback_on_timeout,则事务超时会导致InnoDB中止并回滚整个事务。


注意:
如果开启事务语句是START TRANSACTION或BEGIN语句,则回滚不会取消该语句。 在发生COMMIT,ROLLBACK或导致隐式提交的某些SQL语句之前,其他SQL语句将成为事务的一部分。


  • innodb_rollback_segments

默认值128 ,最小值1, 最大值128




定义InnoDB使用的回滚段数。


一个回滚段始终分配给系统表空间,32个回滚段保留供临时表使用,并托管在临时表空间(ibtmp1)中。要为生成undo记录的数据修改事务分配其他回滚段,必须将innodb_rollback_segments设置为大于33的值。如果配置单独的undo表空间,则系统表空间中的回滚段将变为非活动状态。每个回滚段最多可支持1023个数据修改事务。


当innodb_rollback_segments设置为32或更小时,InnoDB将一个回滚段分配给系统表空间,将32分配给临时表空间(ibtmp1)。


当innodb_rollback_segments设置为大于32的值时,InnoDB将一个回滚段分配给系统表空间,将32分配给临时表空间(ibtmp1),并将其他回滚段分配给undo表空间(如果存在)。如果不存在undo表空间,则会为系统表空间分配其他回滚段。


虽然您可以增加或减少InnoDB使用的回滚段数,但系统中实际存在的回滚段数量永远不会减少。因此,您可以从此参数的低值开始并逐渐增加它,以避免分配不需要的回滚段。 innodb_rollback_segments默认值为128,这也是最大值。

  • innodb_spin_wait_delay



默认值是6,最小值是0 ,最大值是
在为spin lock 轮询之间的最大延时。 该机制的低级实现取决于硬件和操作系统的组合,因此延迟不对应于固定的时间间隔。


  • innodb_stats_auto_recalc

默认值 ON


导致InnoDB在表中的数据发生实质性更改后自动重新计算持久性统计信息。 阈值是表中行的10%。 此设置适用于启用innodb_stats_persistent选项时创建的表。 也可以通过在CREATE TABLE或ALTER TABLE语句中指定STATS_PERSISTENT = 1来配置自动统计信息重新计算。 生成统计信息的数据量由innodb_stats_persistent_sample_pages配置选项控制。


  • innodb_stats_include_delete_marked

默认值是OFF


默认情况下,InnoDB在计算统计信息时会读取未提交的数据。 对于从表中删除行的未提交事务,InnoDB会排除在计算行估计和索引统计信息时删除标记的记录,除READ UNCOMMITTED之外的事务隔离级别,这可能导致同时使用表上运行的其他事务的非最佳执行计划。 为了避免这种情况,可以启用innodb_stats_include_delete_marked以确保在计算持久优化器统计信息时InnoDB包含删除标记的记录。


启用innodb_stats_include_delete_marked时,ANALYZE TABLE会在重新计算统计信息时考虑删除标记的记录。


innodb_stats_include_delete_marked是一个影响所有InnoDB表的全局设置。 它仅适用于持久优化程序统计信息。


--innodb 默认隔离级别是 REPEATABLE READ

  • innodb_stats_method



默认值是 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值。


  • innodb_stats_on_metadata

默认值OFF


仅当优化程序统计信息配置为非持久性时,此选项才适用。 禁用innodb_stats_persistent或使用STATS_PERSISTENT = 0创建或更改单个表时,优化程序统计信息不会保留到磁盘。


启用innodb_stats_on_metadata时,InnoDB会在元数据语句(如SHOW TABLE STATUS)或访问INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.STATISTICS表时更新非持久性统计信息。 (这些更新与ANALYZE TABLE的更新类似。)禁用时,InnoDB不会在这些操作期间更新统计信息。 保留禁用的设置可以提高具有大量表或索引的模式的访问速度。 它还可以提高涉及InnoDB表的查询的执行计划的稳定性。


要更改设置,请发出语句SET GLOBAL innodb_stats_on_metadata = mode,其中mode为ON或OFF(或1或0)。 更改设置需要SUPER权限,并立即影响所有连接的操作。




  • innodb_stats_persistent



默认值是ON,有效值是 OFF,ON,0,1


指定InnoDB索引统计信息是否持久保存到磁盘。 否则,可能会频繁重新计算统计信息,这可能导致查询执行计划的变化。 创建表时,此设置与每个表一起存储。 您可以在创建表之前在全局级别设置innodb_stats_persistent,或使用CREATE TABLE和ALTER TABLE语句的STATS_PERSISTENT子句覆盖系统范围的设置,并为各个表配置持久统计信息。

  • innodb_stats_persistent_sample_pages



默认值20


估计索引列的基数和其他统计信息时要采样的索引页数,例如由ANALYZE TABLE计算的。 增加值可以提高索引统计的准确性,这可以改善查询执行计划,但代价是在InnoDB表的ANALYZE TABLE执行期间增加了I/O


注意:
为innodb_stats_persistent_sample_pages设置较高的值可能会导致ANALYZE TABLE执行时间过长。 要估计ANALYZE TABLE访问的数据库页数。


innodb_stats_persistent_sample_pages仅在为表启用innodb_stats_persistent时适用; 禁用innodb_stats_persistent时,innodb_stats_transient_sample_pages会被替代。

  • innodb_stats_transient_sample_pages



默认是 8


估计索引列的基数和其他统计信息时要采样的索引页数,例如由ANALYZE TABLE计算的那些。 默认值为8.增加该值可提高索引统计信息的准确性,这可以改进查询执行计划,但会在打开InnoDB表或重新计算统计信息时增加I / O.




注意:
为innodb_stats_transient_sample_pages设置较高的值可能会导致ANALYZE TABLE执行时间过长。




innodb_stats_transient_sample_pages仅在禁用表的innodb_stats_persistent时适用; 当启用innodb_stats_persistent时,会应用innodb_stats_persistent_sample_pages 取代innodb_stats_sample_pages。




  • innodb_status_output

默认值是OFF


启用或禁用标准InnoDB监视器的定期输出。 还与innodb_status_output_locks结合使用,以启用或禁用InnoDB锁定监视器的周期性输出。


  • innodb_status_output_locks



默认值是OFF


启用或禁用InnoDB锁定监视器。 启用后,InnoDB Lock Monitor会在SHOW ENGINE INNODB STATUS输出中打印有关锁的其他信息,并定期输出打印到MySQL错误日志中。 InnoDB Lock Monitor的定期输出作为标准InnoDB Monitor输出的一部分打印。 因此,必须为InnoDB Lock Monitor启用标准的InnoDB Monitor,以便定期将数据打印到MySQL错误日志中。


  • innodb_strict_mode



默认值是 ON
启用innodb_strict_mode时,InnoDB会针对某些条件返回错误而不是警告。


严格模式有助于防止SQL中忽略的拼写错误和语法错误,或操作模式和SQL语句的各种组合的其他意外后果。 启用innodb_strict_mode时,InnoDB会在某些情况下引发错误条件,而不是发出警告并处理指定的语句(可能具有意外行为)。 这类似于MySQL中的sql_mode,它控制MySQL接受的SQL语法,并确定它是否默默地忽略错误,或验证输入语法和数据值。




innodb_strict_mode设置会影响CREATE TABLE,ALTER TABLE,CREATE INDEX和OPTIMIZE TABLE语句的语法错误处理。 innodb_strict_mode还启用了记录大小检查,因此INSERT或UPDATE永远不会因为记录对于所选页面大小而言太大而失败。


Oracle建议在CREATE TABLE,ALTER TABLE和CREATE INDEX语句中使用ROW_FORMAT和KEY_BLOCK_SIZE子句时启用innodb_strict_mode。 禁用innodb_strict_mode时,InnoDB会忽略冲突的子句,并在消息日志中仅显示警告而创建表或索引。 生成的表可能具有与预期不同的特性,例如在尝试创建压缩表时缺少压缩支持。 启用innodb_strict_mode时,此类问题会立即生成错误,并且不会创建表或索引。


您可以在启动mysqld时在命令行上启用或禁用innodb_strict_mode,也可以在MySQL配置文件中启用或禁用innodb_strict_mode。 您还可以在运行时使用语句SET [GLOBAL | SESSION] innodb_strict_mode = mode启用或禁用innodb_strict_mode,其中mode为ON或OFF。 更改GLOBAL设置需要SUPER权限,并影响随后连接的所有客户端的操作。 任何客户端都可以更改innodb_strict_mode的SESSION设置,该设置仅影响该客户端。




innodb_strict_mode不适用于一般表空间。 一般表空间的表空间管理规则严格依赖innodb_strict_mode强制执行。




  • innodb_sync_array_size

默认值 1,最小值1,最大值1024


定义互斥锁/锁定等待数组的大小。 增加该值会拆分用于协调线程的内部数据结构,以便在具有大量等待线程的工作负载中实现更高的并发性。 必须在MySQL实例启动时配置此设置,之后无法更改。 对于经常产生大量等待线程(通常大于768)的工作负载,建议增加该值。




  • innodb_sync_spin_loops



默认值 30,最小值0,最大值 4294967295
在线程挂起之前线程等待InnoDB互斥锁被释放的次数。


  • innodb_table_locks

默认值是 TRUE


如果autocommit = 0,InnoDB会尊重LOCK TABLES; MySQL不会从LOCK TABLES ... WRITE返回,直到所有其他线程都释放了对表的所有锁。 innodb_table_locks的默认值为1,这意味着如果autocommit = 0,LOCK TABLES会导致InnoDB在内部锁定表。


在MySQL 5.7中,对于使用LOCK TABLES ... WRITE显式锁定的表,innodb_table_locks = 0无影响。 它对隐式写入(例如,通过触发器)或LOCK TABLES ... READ的LOCK TABLES有影响。


  • innodb_temp_data_file_path



默认值: ibtmp1:12M:autoextend


定义InnoDB临时表空间数据文件的相对路径,名称,大小和属性。 如果没有为innodb_temp_data_file_path指定值,则默认行为是在MySQL数据目录中创建一个名为ibtmp1的单个自动扩展数据文件,该文件略大于12MB。


临时表空间数据文件规范的完整语法包括文件名,文件大小以及autoextend和max属性:


file_name:file_size[:autoextend[:max:max_file_size]]


临时表空间数据文件不能与另一个InnoDB数据文件具有相同的名称。 创建临时表空间数据文件的任何无能或错误都被视为致命,并且拒绝服务器启动。 临时表空间具有动态生成的空间ID,可以在每次重新启动服务器时更改。


通过将K,M或G附加到大小值,可以指定文件大小KB,MB或GB(1024MB)。 文件大小的总和必须略大于12MB。


单个文件的大小限制由您的操作系统决定。 您可以在支持大文件的操作系统上将文件大小设置为大于4GB。 不支持将原始磁盘分区用于临时表空间数据文件。


autoextend和max属性只能用于innodb_temp_data_file_path设置中最后指定的数据文件。 例如:


[mysqld] innodb_temp_data_file_path=ibtmp1:50M;ibtmp2:12M:autoextend:max:500MB




如果指定autoextend选项,InnoDB会扩展数据文件(如果它的可用空间不足)。 默认情况下,自动扩展增量为64MB。 要修改增量,请更改innodb_autoextend_increment系统变量。


临时表空间数据文件的完整目录路径是通过连接innodb_data_home_dir和innodb_temp_data_file_path定义的路径形成的。


临时表空间由所有非压缩的InnoDB临时表共享。 压缩临时表驻留在临时文件目录中创建的每表文件表空间文件中,该目录由tmpdir配置选项定义。


在以只读模式运行InnoDB之前,请将innodb_temp_data_file_path设置为数据目录之外的位置。 路径必须相对于数据目录。 例如:


--innodb_temp_data_file_path=../../../tmp/ibtmp1:12M:autoextend


有关活动的InnoDB临时表的元数据位于INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO中。




  • innodb_thread_concurrency



默认值是0,最小值是0,最大值是1000


InnoDB尝试在InnoDB内同时保持操作系统线程的数量小于或等于此变量给出的限制(InnoDB使用操作系统线程来处理用户事务)。 一旦线程数达到此限制,就会在“先进先出”(FIFO)队列中将其他线程置于等待状态以供执行。 等待锁的线程不计入并发执行线程的数量。


此变量的范围是0到1000.值0(默认值)被解释为无限并发(无并发检查)。 禁用线程并发检查使InnoDB能够根据需要创建尽可能多的线程。 值0还会禁用InnoDB内的查询以及SHOW ENGINE INNODB STATUS输出的ROW OPERATIONS部分中的队列计数器中的查询项


如果您的MySQL实例与其他应用程序共享CPU资源,或者您的工作负载或并发用户数正在增长,请考虑设置此变量。 正确的设置取决于工作负载,计算环境以及您运行的MySQL版本。 您需要测试一系列值以确定提供最佳性能的设置。 innodb_thread_concurrency是一个动态变量,它允许您在实时测试系统上试验不同的设置。 如果特定设置执行不佳,您可以快速将innodb_thread_concurrency设置为0。




  • innodb_thread_sleep_delay



默认值是10000


定义InnoDB线程在加入InnoDB队列之前休眠的时间(以微秒为单位)。 默认值为10000.值为0将禁用睡眠。 您可以将配置选项innodb_adaptive_max_sleep_delay设置为innodb_thread_sleep_delay允许的最高值,InnoDB会根据当前的线程调度活动自动调整innodb_thread_sleep_delay的值。 这种动态调整有助于线程调度机制在系统轻载或满负荷运行时平稳运行。




  • innodb_tmpdir

默认值 为NULL


用于为在线ALTER TABLE操作期间重建表操作创建的临时排序文件定义备用目录。


重建表的在线ALTER TABLE操作还会在与原始表相同的目录中创建中间表文件。 innodb_tmpdir选项不适用于中间表文件。




有效值是除MySQL数据目录路径之外的任何目录路径。 如果值为NULL(默认值),则创建为MySQL的临时目录(在Unix上为$TMPDIR,在Windows上为%TEMP%,或由--tmpdir配置选项指定的目录)。 如果指定了目录,则只有在使用SET语句配置innodb_tmpdir时才会检查是否存在目录和权限。 如果在目录字符串中提供符号链接,则解析符号链接并将其存储为绝对路径。 路径不应超过512个字节。 如果innodb_tmpdir设置为无效目录,则在线ALTER TABLE操作会报告错误。 innodb_tmpdir会覆盖MySQL tmpdir设置,但仅适用于在线ALTER TABLE操作。




配置innodb_tmpdir需要FILE权限。


引入了innodb_tmpdir选项以帮助避免溢出位于tmpfs文件系统上的临时文件目录。 由于在重建表的联机ALTER TABLE操作期间创建的大型临时排序文件,可能会发生此类溢出。




在复制环境中,如果所有服务器具有相同的操作系统环境,则仅考虑复制innodb_tmpdir设置。 否则,在运行重建表的在线ALTER TABLE操作时,复制innodb_tmpdir设置可能会导致复制失败。 如果服务器操作环境不同,建议您分别在每台服务器上配置innodb_tmpdir。


  • innodb_undo_directory



默认值是.


InnoDB创建undo表空间的路径。 通常用于将undo日志放在不同的存储设备上。 与innodb_rollback_segments和innodb_undo_tablespaces一起使用。


没有默认值(它是NULL)。 如果未指定路径,则在MySQL数据目录中创建undo表空间,如datadir所定义。




  • innodb_undo_log_truncate

默认值是OFF


启用后,将超过innodb_max_undo_log_size定义的阈值的undo表空间标记为截断。 只有undo表空间可以被阶段。 不支持截断驻留在系统表空间中的undo日志。 要进行截断,必须至少有两个undo表空间和两个已启用重做的undo日志配置为使用undo表空间。 这意味着必须将innodb_undo_tablespaces设置为等于或大于2的值,并且innodb_rollback_segments必须设置为等于或大于35的值。




innodb_purge_rseg_truncate_frequency配置选项可用于加速截断undo表空间。




  • innodb_use_native_aio



默认 ON


指定是否使用Linux异步I / O子系统。 此变量仅适用于Linux系统,并且在服务器运行时无法更改。 通常,您不需要配置此选项,因为默认情况下已启用此选项。




使用大量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内核的组合,则此选项也可能在启动期间被自动禁用。




  • innodb_write_io_threads



默认值 是4,最小值是1,最大值是64


InnoDB中写操作的I / O线程数。 默认值为4.读取线程的对应项是innodb_read_io_threads


注意:
在Linux系统上,使用innodb_read_io_threads,innodb_write_io_threads和Linux aio-max-nr设置的默认设置运行多个MySQL服务器(通常超过12个)可能超出系统限制。 理想情况下,增加aio-max-nr设置; 作为解决方法,您可以减少一个或两个MySQL配置选项的设置。


还要考虑sync_binlog的值,它控制二进制日志到磁盘的同步。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3145272/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42242