Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  InnoDB Startup Configuration

17.8.1 InnoDB 启动配置

在初始化InnoDB之前,需要对数据文件、日志文件、页面大小和内存缓冲区进行配置。修改配置后InnoDB已经初始化可能涉及非 trivial 程序。

本节提供了关于在配置文件中指定InnoDB设置、查看InnoDB初始化信息和重要存储考虑的信息。

由于 MySQL 使用数据文件、日志文件和页面大小设置来初始化InnoDB,因此建议在 MySQL 读取启动时的选项文件中定义这些设置,以便在初始化InnoDB之前。通常情况下,InnoDB是在 MySQL 服务器第一次启动时被初始化的。

您可以将InnoDB选项放置在读取服务器启动时的任何选项文件中的[mysqld]组中。MySQL 选项文件的位置在第6.2.2.2节,“使用选项文件”中有描述。

为了确保mysqld从特定的文件中读取选项(并且mysqld-auto.cnf),在启动服务器时使用--defaults-file选项作为命令行的第一个选项:

mysqld --defaults-file=path_to_option_file

要在启动时查看InnoDB初始化信息,使用命令提示符启动mysqld,该命令将在控制台上打印初始化信息。

例如,在 Windows 上,如果mysqld位于C:\Program Files\MySQL\MySQL Server 8.4\bin,启动 MySQL 服务器如下:

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

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

$> bin/mysqld --user=mysql &

如果您不将服务器输出发送到控制台,启动后检查错误日志以查看初始化信息InnoDB在启动过程中打印的内容。

关于使用其他方法启动 MySQL 的信息,请参阅第 2.9.5 节,“自动启动和停止 MySQL”

Note

InnoDB 在启动时不打开所有用户表和关联的数据文件。然而,InnoDB 会检查数据字典中引用的表空间文件是否存在。如果找不到表空间文件,InnoDB 将记录错误并继续启动序列。在崩溃恢复过程中,redo日志中引用了的表空间文件可能会在redo应用程序期间打开。

在继续启动配置前,请查看以下存储相关考虑因素。

  • 在某些情况下,您可以通过将数据和日志文件分配到不同的物理磁盘来提高数据库性能。您还可以使用raw磁盘分区(raw设备)为InnoDB数据文件,可能会加速I/O。请参阅使用Raw磁盘分区为系统表空间

  • InnoDB 是一个事务安全(ACID compliant)的存储引擎,具有提交、回滚和崩溃恢复能力来保护用户数据。然而,如果底层操作系统或硬件不按预期工作,它就不能实现这些功能。许多操作系统或磁盘子系统可能会延迟或重新排序写入操作以提高性能。在某些操作系统中,即使是fsync()系统调用也返回前数据未被刷新到稳定存储之前。这意味着,操作系统崩溃或电源故障可能会销毁最近提交的数据,或者在最坏的情况下,甚至会损害数据库,因为写入操作已经被重新排序。如果对数据完整性很重要,请在生产环境中使用前执行pull-the-plug测试。在macOS上,InnoDB 使用特殊的fcntl()文件刷新方法。 在Linux上,建议禁用写回缓存

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

  • 关于InnoDB恢复功能保护用户数据,InnoDB使用一个名为双写缓冲区的文件刷新技术,该技术默认启用(innodb_doublewrite=ON)。双写缓冲区在出现意外退出或电源故障时保护恢复,且在大多数Unix变体中减少了fsync()操作的需求。建议保持innodb_doublewrite选项启用,如果您关心数据完整性或可能的故障。关于双写缓冲区的信息,请参阅第17.11.1节,“InnoDB Disk I/O”

  • 在使用NFS与InnoDB之前,请查看使用NFS与MySQL中列出的潜在问题。

System 表space Data File Configuration

选项innodb_data_file_path定义了InnoDB系统表space数据文件的名称、大小和属性。如果您在初始化MySQL服务器之前未配置该选项,缺省行为是创建一个名为ibdata1的单个自动扩展数据文件,该文件大约12MB slighter:

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

完整的数据文件指定语法包括文件名、文件大小、autoextend 属性和 max 属性:

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

文件大小以千字节、兆字节或吉字节形式指定,通过在大小值后添加 KMG。如果指定数据文件大小为千字节,请使用1024的倍数。否则,千字节值将被舍入到最近的兆字节(MB)边界。文件大小之和必须至少大于12MB。

您可以使用分号分隔的列表指定多个数据文件。例如:

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

autoextendmax 属性只能用于最后一个指定的数据文件。

当指定了 autoextend 属性时,数据文件将自动增加大小,以满足空间需求。innodb_autoextend_increment 变量控制增量大小。

要指定一个自动扩展数据文件的最大大小,请使用 max 属性,紧跟在 autoextend 属性后。只在磁盘使用限制非常重要的情况下使用 max 属性。以下配置允许 ibdata1 文件增长到500MB:

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

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

Page Size (innodb_page_size) Minimum File Size
16KB以下(16384) 3MB
32KB以下(32768) 6MB
64KB以下(65536) 12MB

如果您的磁盘已满,您可以在另一个磁盘上添加数据文件。请参阅调整系统表空间

单个文件的大小限制由操作系统确定。在支持大文件的操作系统上,您可以将文件大小设置为超过4GB。您也可以使用原始磁盘分区作为数据文件。请参阅使用原始磁盘分区为系统表空间

InnoDB 不了解文件系统的最大文件大小,因此在文件系统中最大文件大小为小值,如2GB时,需要小心。

系统表空间文件默认创建在数据目录(datadir)中。要指定 alternate 位置,请使用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,那么默认值为./,即数据目录。 (MySQL 服务器在执行时将其当前工作目录更改为数据目录。)

或者,您可以为系统表空间数据文件指定绝对路径。以下配置与前一个配置等效:

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

当您指定innodb_data_file_path的绝对路径时,该设置将不会与innodb_data_home_dir设置拼接。系统表空间文件将在指定的绝对路径中创建。指定的目录必须存在于服务器启动之前。

InnoDB 双写缓冲区 File Configuration

InnoDB 双写缓冲区存储区域位于双写文件中,这提供了对双写页面存储位置的灵活性。在之前的版本中,双写缓冲区存储区域位于系统表空间。innodb_doublewrite_dir 变量定义了 InnoDB 在启动时创建双写文件的目录。如果未指定目录,双写文件将在innodb_data_home_dir 目录下创建,该目录默认为数据目录如果未指定。

要在其他位置创建双写文件,而不是innodb_data_home_dir 目录,配置innodb_doublewrite_dir 变量。例如:

innodb_doublewrite_dir=/path/to/doublewrite_directory

其他双写缓冲区变量允许定义双写文件的数量、每个线程的页面数和双写批处理大小。有关双写缓冲区配置的更多信息,请参见第17.6.4节,“Doublewrite Buffer”

重做日志配置

重做日志文件所占用的磁盘空间由innodb_redo_log_capacity 变量控制,可以在启动或运行时设置;例如,在选项文件中将变量设置为8GiB,添加以下条目:

[mysqld]
innodb_redo_log_capacity = 8589934592

关于在运行时配置 redo 日志容量的信息,请见Configuring Redo Log Capacity

变量innodb_redo_log_capacity超出了变量innodb_log_file_sizeinnodb_log_files_in_group,这两个变量已经弃用。当设置了innodb_redo_log_capacity时,innodb_log_file_sizeinnodb_log_files_in_group将被忽略;否则,如果定义了一个或两个弃用的设置,那么它们将用于计算Innodb_redo_log_capacity_resized为(innodb_log_files_in_group * innodb_log_file_size)。如果没有设置这些变量,那么将使用默认的innodb_redo_log_capacity值。

InnoDB 尝试维护32个redo日志文件,每个文件等于innodb_redo_log_capacity的1/32。redo日志文件位于数据目录中的#innodb_redo目录,除非通过innodb_log_group_home_dir变量指定了不同的目录。如果innodb_log_group_home_dir被定义,redo日志文件位于该目录中的#innodb_redo目录。更多信息,请见第17.6.5节,“Redo Log”

您可以在初始化MySQL Server实例时通过配置innodb_log_files_in_groupinnodb_log_file_size变量来定义不同的redo日志文件数量和大小。

innodb_log_files_in_group 定义了日志组中的日志文件数量。默认值和推荐值是2。

innodb_log_file_size 定义了每个日志文件在日志组中的大小,以字节为单位。日志文件的总大小(innodb_log_file_size * innodb_log_files_in_group)不能超过最大值,该值略小于512GB。例如,255 GB的日志文件对(pair)接近限制但不超过它。默认日志文件大小为48MB。通常,日志文件的总大小应该足够,以平滑工作负载活动的峰值和谷底,这通常意味着可以处理超过一个小时的写入活动。较大的日志文件大小意味着缓冲池中的checkpoint flush活动减少,从而减少磁盘I/O。有关详细信息,请参见第10.5.4节,“优化InnoDB redo日志”

innodb_log_group_home_dir 定义了InnoDB日志文件的目录路径。您可能使用该选项将InnoDBredo日志文件与InnoDB数据文件分开存储,以避免潜在的I/O资源冲突;例如:

[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
Note

InnoDB不创建目录,因此在启动服务器前确保日志目录存在。使用Unix或DOSmkdir命令创建必要的目录。

确保 MySQL 服务器在日志目录中具有合适的访问权限。更广泛地说,服务器必须在需要创建文件的任何目录中具有访问权限。

Undo 表space 配置

默认情况下,undo 日志驻留在 MySQL 实例初始化时创建的两个 undo 表空间中。

变量innodb_undo_directory定义了 InnoDB 创建默认 undo 表空间的路径。如果该变量未定义,default undo 表空间将在数据目录中创建。变量innodb_undo_directory不是动态的。配置它需要重新启动服务器。

undo 日志的 I/O 模式使 undo 表空间成为 SSD 存储的良好候选项。

有关配置额外 undo 表空间的信息,请参阅第17.6.3.4节,“Undo Tablespaces”

全局临时 表space 配置

全球临时表空间存储对用户创建的临时表进行更改的回滚段。

默认情况下,在innodb_data_home_dir目录中存在一个自动扩展的全球临时表空间数据文件名为ibtmp1。初始文件大小略大于 12MB。

innodb_temp_data_file_path选项指定了全局临时表空间数据文件的路径、文件名和文件大小。文件大小可以通过在大小值后添加K、M或G来指定KB、MB或GB。文件大小或组合文件大小必须大于12MB。

要指定全局临时表空间数据文件的 alternate 位置,configure innodb_temp_data_file_path 选项在启动时。

Session Temporary 表space 配置

在 MySQL 8.4 中,InnoDB 总是用作内部临时表的 on-disk 存储引擎。

innodb_temp_tablespaces_dir 变量定义了 InnoDB 创建会话临时表空间的位置。默认位置是数据目录中的#innodb_temp 目录。

要指定会话临时表空间的 alternate 位置,configure innodb_temp_tablespaces_dir 变量在启动时。允许使用完全限定路径或相对数据目录的路径。

innodb_ page_size 选项指定了 MySQL 实例中所有 InnoDB 表空间的页面大小。该值在实例创建时设置,并且保持不变。有效值为64KB、32KB、16KB(默认)、8KB和4KB。Alternatively, you can specify page size in bytes (65536, 32768, 16384, 8192, 4096)。

默认的16KB页面大小适合广泛的工作负载,特别是涉及表扫描和 DML 操作的 bulk 更新。较小的页面大小可能更适合 OLTP 工作负载,其中包含许多小写入的 contendions 可能会出现问题。较小的页面也可以更适合 SSD 存储设备,这些设备通常使用小块大小。保持 InnoDB 页面大小接近存储设备块大小,可以最小化未改变数据被重新写回磁盘的数量。

Important

innodb_ page_size 只能在初始化数据目录时设置。请查看该变量的描述以获取更多信息。

MySQL 为各种缓存和缓冲区分配内存,以提高数据库操作的性能。当为 InnoDB 分配内存时,始终考虑操作系统所需的内存、其他应用程序已分配的内存和 MySQL 其他缓冲区和缓存所需的内存。例如,如果使用 MyISAM 表,请考虑键缓冲区 (key_buffer_size) 所需的内存。关于 MySQL 缓冲区和缓存的概述,见 第 10.12.3.1 节,“MySQL 使用内存”

以下是特定于 InnoDB 的缓冲区配置参数:

Warning

在32位GNU/Linux x86上,如果内存使用设置太高,glibc可能允许进程堆栈增长到线程栈的高度,从而导致服务器崩溃。如果将mysqld进程为全局和每个线程的缓存和缓冲区分配的内存超过或接近2GB,则存在风险。

可以使用以下类似公式来估算MySQL内存使用。您可能需要根据您的MySQL版本和配置修改公式,以便考虑缓存和缓冲区。在了解MySQL缓存和缓冲区的概述,请见第10.12.3.1节,“MySQL如何使用内存”

innodb_buffer_pool_size
+ key_buffer_size
+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)
+ max_connections*2MB

每个线程都使用一个堆栈(通常为2MB,但在Oracle Corporation提供的MySQL二进制文件中为256KB),并且在最坏的情况下还使用sort_buffer_size + read_buffer_size额外内存。

在Linux上,如果内核启用了大页支持,InnoDB可以使用大页来分配其缓冲池的内存。见第10.12.3.3节,“启用大页支持”