MySQL的InnoDB可能是我们使用最多的一种存储引擎,和Oracle相比,MySQL给我的感觉,一直以来都是有很多的参数,控制粒度很细,如何用好这些参数存在一定的困难。但实际上,我们只需要掌握常用的参数,很多特殊参数,用到再了解,可能就够了。徐老师写的这篇文章《InnoDB 启动配置》就给我们讲解了InnoDB启动相关的常用配置,可以学习了解。

和InnoDB相关的历史文章如下,

《InnoDB执行delete时到底做了什么?》

《InnoDB快速定位行锁争用会话的过程和操作》

《小白学习MySQL - InnoDB支持optimize table?》

InnoDB的配置涉及数据文件、日志文件、页面大小和内存缓冲区的配置,这些应在InnoDB初始化之前进行配置。本篇介绍在配置文件中指定InnoDB设置、查看InnoDB初始化信息,以及重要的存储注意事项等相关信息。

在MySQL选项文件中指定选项

通常,在首次启动MySQL服务器时,InnoDB进行初始化。MySQL使用数据文件、日志文件和页面大小设置来初始化InnoDB,因此,在初始化InnoDB之前,用户需要在选项文件中定义这些设置。

用户可以将InnoDB选项放在服务器启动时读取的选项文件的 [mysqld] 组中。要确保mysqld仅从特定文件(和mysqld-auto.cnf)读取选项,请在启动服务器时在命令行中将--defaults-file选项作为第一个选项,

mysqld --defaults-file=path_to_option_file

查看InnoDB初始化信息

如果需要在启动期间查看InnoDB的初始化信息,请从命令提示符启动mysqld,它将初始化信息打印到控制台。例如,在Windows上,如果mysqld位于“C:\Program Files\MySQL\MySQL Server 8.0\bin”,则像这样启动MySQL服务器,

C:> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld" --console

在类Unix系统上,mysqld位于MySQL安装的bin目录中,

$> bin/mysqld --user=mysql &

如果未将服务器输出发送到控制台,请在启动后检查错误日志,日志中记录InnoDB在启动过程中打印的初始化信息。

注意
InnoDB在启动时不会打开所有用户表和相关的数据文件。但是,InnoDB会检查数据字典中引用的表空间文件是否存在。如果找不到表空间文件,InnoDB会记录错误并继续启动序列。在崩溃恢复期间,重做日志中引用的表空间文件可能会打开以应用重做。

重要的存储注意事项

在继续启动配置之前,请查看以下与存储相关的注意事项。

在某些情况下,将数据和日志文件放在不同的物理磁盘上可以提高数据库性能。用户还可以将原始磁盘分区(原始设备)用于保存 InnoDB 数据文件,这可能会加快I/O。InnoDB具有提交、回滚和崩溃恢复功能的事务安全(符合ACID)存储引擎。但是,如果底层操作系统或硬件无法正常工作,则无法做到这一点。许多操作系统或磁盘子系统可能会对写操作进行延迟或重新排序以提高性能。在某些操作系统上,fsync()系统调用应该等到文件的所有未写数据都被刷新后才返回,但实际上可能在数据被刷新到稳定存储之前就返回了。因此,操作系统崩溃或电源中断可能会破坏最近提交的数据,在最坏的情况下,甚至会损坏数据库,因为写操作已被重新排序。如果数据完整性对您非常重要,请在生产中使用任何内容之前执行“断电”测试。在macOS上,InnoDB使用特殊的fcntl()文件刷新方法。在Linux下,建议禁用回写缓存。

在ATA/SATA磁盘驱动器上,命令如“hdparm -W0 /dev/hda”可能用于禁用回写缓存。请注意,某些驱动器或磁盘控制器可能无法禁用回写缓存。

关于保护用户数据的InnoDB恢复功能,InnoDB使用双写缓冲区的结构的文件刷新技术,默认情况下开启(innodb_doublewrite=ON)。双写缓冲区在意外退出或电源中断后的恢复中增加了安全性,并通过减少对fsync()操作的需求在大多数类Unix操作系统上提高了性能。如果您关心数据完整性或可能的故障,建议保持innodb_doublewrite选项启用。

系统表空间数据文件配置
“innodb_data_file_path”选项定义了InnoDB系统表空间数据文件的名称、大小和属性。如果在初始化MySQL服务器之前未配置此选项,默认行为是创建一个略大于12MB的单个自动扩展数据文件,名为ibdata1,

mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+

完整的数据文件规范语法包括文件名、文件大小、自动扩展属性和最大属性,

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

文件大小以千字节、兆字节或千兆字节指定,通过在大小值后附加K、M或G。如果以千字节指定数据文件大小,请以1024的倍数进行设置。否则,千字节值将舍入到最接近的兆字节(MB)边界。文件大小的总和必须大于12MB。用户可以使用分号分隔的列表指定多个数据文件。例如,

[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

自动扩展和最大属性只能用于指定的最后一个数据文件。

当指定自动扩展属性时,数据文件在需要空间时自动以64MB的增量增加大小。可以通过“innodb_autoextend_increment”变量控制增量大小。

如果需要为自动扩展数据文件指定最大大小,请在自动扩展属性之后使用max属性。仅在限制磁盘使用至关重要的情况下使用max属性。以下配置允许“ibdata1”增长到500MB的限制,

[mysqld]
innodb_data_file_path=ibdata1:12M:autoextend:max:500M

为第一个系统表空间数据文件强制执行最小文件大小,以确保有足够的空间用于双写缓冲区页面。下表显示了每个InnoDB页面大小的最小文件大小。InnoDB的默认页面大小为16384(16KB)。

页面大小(innodb_page_size)

最小文件大小

16384(16KB)或更小

 3MB

32768(32KB)

6MB

65536(64KB)

12MB

如果磁盘已满,可以在另一个磁盘上添加数据文件。

单个文件的大小限制由操作系统决定。在支持大文件的操作系统上,用户可以将文件大小设置为超过4GB,还可以将原始磁盘分区用作数据文件。

InnoDB不知道文件系统的最大文件大小,因此在最大文件大小较小(例如2GB)的文件系统上要小心。

系统表空间文件默认在数据目录(datadir)中创建。如果需要指定备用位置,请使用“innodb_data_home_dir"选项。例如,要在名为”myibdata“ 的目录中创建系统表空间数据文件,请使用此配置,

[mysqld]
innodb_data_home_dir = /myibdata/
innodb_data_file_path=ibdata1:50M:autoextend

为“innodb_data_home_dir”指定值时需要尾随斜杠。InnoDB不会创建目录,因此在启动服务器之前请确保指定的目录存在。此外,请确保MySQL服务器具有在该目录中创建文件的适当访问权限。

InnoDB通过将“innodb_data_home_dir”的值与数据文件名按文本方式连接来形成每个数据文件的目录路径。如果未定义“innodb_data_home_dir”,则默认值为“./”,即数据目录。(当MySQL服务器开始执行时,它会将当前工作目录更改为数据目录。)或者,用户可以为系统表空间数据文件指定绝对路径。以下配置等同于前面的配置,

[mysqld]
innodb_data_file_path=/myibdata/ibdata1:50M:autoextend

当用户为“innodb_data_file_path”指定绝对路径时,该设置不会与“innodb_data_home_dir”设置关联。系统表空间文件在指定的绝对路径中创建。指定的目录必须在启动服务器之前存在。

InnoDB 双写缓冲区文件配置
从MySQL 8.0.20开始,双写缓冲区存储区域位于双写文件中,这为双写页面的存储位置提供了灵活性。在以前的版本中,双写缓冲区存储区域位于系统表空间中。“innodb_doublewrite_dir”变量定义了InnoDB在启动时,创建双写文件的目录。如果未指定目录,则双写文件在“innodb_data_home_dir”目录中创建。如果需要在“innodb_data_home_dir”目录以外的位置创建双写文件,请配置“innodb_doublewrite_dir”变量。例如,

innodb_doublewrite_dir=/path/to/doublewrite_directory

重做日志配置

在MySQL 8.0.30之前,InnoDB默认在数据目录中创建两个5MB的重做日志文件,名为“ib_logfile0”和“ib_logfile1”。用户可以通过配置“innodb_log_files_in_group”和“innodb_log_file_size”变量在初始化MySQL服务器实例时自定义重做日志文件的数量和大小。

  • “innodb_log_files_in_group”定义了日志组中的日志文件数量,默认和推荐值是2。
  • “innodb_log_file_size”定义了每个日志文件的大小,组合的日志文件大小不能超过略小于512GB的最大值。较大的日志文件大小可减少缓冲池中的检查点刷新活动,降低磁盘I/O。
  • “innodb_log_group_home_dir”定义了InnoDB日志文件的目录路径,可将其放置在与InnoDB数据文件不同的位置以避免I/O资源冲突。

撤销表空间配置

默认情况下,撤销日志位于初始化MySQL实例时创建的两个撤销表空间中。“innodb_undo_directory”变量定义了创建默认撤销表空间的路径,若未定义,则在数据目录中创建。该变量非动态,配置需重启服务器。撤销表空间适用于SSD存储。

全局临时表空间配置
全局临时表空间用于存储对用户创建的临时表所做更改的回滚段。默认在“innodb_data_home_dir”目录中有一个名为“ibtmp1”的自动扩展数据文件,初始大小略大于12MB。“innodb_temp_data_file_path”选项用于指定全局临时表空间数据文件的路径、文件名和大小。

会话临时表空间配置
在MySQL 8.0.15及更早版本中,会话临时表空间的存储情况有所不同,从8.0.16开始,InnoDB始终用作内部临时表的磁盘存储引擎。

“innodb_temp_tablespaces_dir”变量定义了会话临时表空间的创建位置,默认在数据目录中的#innodb_temp目录,可在启动时配置更改位置。

页面大小配置
“innodb_page_size”选项指定MySQL实例中所有InnoDB表空间的页面大小,创建实例时设置且保持不变,有效值包括64KB、32KB、16KB(默认)、8KB和4KB,也可按字节指定。默认的16KB页面大小适用广泛,较小页面大小在特定场景可能更有效,例如涉及许多小写入的OLTP工作负载和使用存储块较小的SSD存储设备。

内存配置
MySQL为提高数据库操作性能会为各种缓存和缓冲区分配内存。为InnoDB分配内存时需综合考虑多种因素。

  • “innodb_buffer_pool_size”定义了缓冲池的大小,对系统性能重要,通常建议为系统内存的50% - 75%,默认128MB,可在启动时或动态配置。
  • 在内存量大的系统上,可通过“innodb_buffer_pool_instances”选项控制的缓冲池实例数量提高并发性。
  • “innodb_log_buffer_size”定义了写入磁盘日志文件的缓冲区大小,默认16MB,可在启动时配置。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"