文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  InnoDB 启动配置

17.8.1 InnoDB 启动配置

关于 InnoDB 配置的第一个决策涉及数据文件、日志文件、页面大小和内存缓冲池的配置,这些配置应在初始化 InnoDB 之前进行。在初始化 InnoDB 后修改配置可能涉及非平凡的过程。

本节提供有关在配置文件中指定 InnoDB 设置、查看 InnoDB 初始化信息以及重要存储注意事项的信息。

在 MySQL 选项文件中指定选项

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

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

要确保 mysqld 仅从特定文件(以及 mysqld-auto.cnf)读取选项,请在启动服务器时,在命令行的第一个选项中使用 --defaults-file 选项

mysqld --defaults-file=path_to_option_file

查看 InnoDB 初始化信息

要在启动期间查看 InnoDB 初始化信息,请从命令提示符启动 mysqld,它会将初始化信息打印到控制台。

例如,在 Windows 上,如果 mysqld 位于 C:\Program Files\MySQL\MySQL Server 9.0\bin 中,请像这样启动 MySQL 服务器

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

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

$> bin/mysqld --user=mysql &

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

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

注意

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 选项启用。有关双写缓冲区的信息,请参见 第 17.11.1 节,“InnoDB 磁盘 I/O”

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

系统表空间数据文件配置

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 |
+-----------------------+------------------------+

完整的数据文件规范语法包括文件名、文件大小、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 属性时,数据文件会随着空间需求的增长而自动以 64MB 的增量增加大小。 innodb_autoextend_increment 变量控制增量大小。

要为自动扩展数据文件指定最大大小,请在 autoextend 属性之后使用 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 双写缓冲区文件配置

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 节,“双写缓冲区”

重做日志配置

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

[mysqld]
innodb_redo_log_capacity = 8589934592

有关在运行时配置重做日志容量的信息,请参见 配置重做日志容量

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 个重做日志文件,每个文件等于 1/32 * innodb_redo_log_capacity。重做日志文件位于数据目录中的 #innodb_redo 目录中,除非 innodb_log_group_home_dir 变量指定了其他目录。如果定义了 innodb_log_group_home_dir,则重做日志文件位于该目录中的 #innodb_redo 目录中。有关更多信息,请参见 第 17.6.5 节,“重做日志”

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

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

innodb_log_file_size 定义日志组中每个日志文件的大小(以字节为单位)。组合的日志文件大小 (innodb_log_file_size * innodb_log_files_in_group) 无法超过最大值,该值略小于 512GB。例如,一对 255 GB 的日志文件接近该限制,但不会超过该限制。默认的日志文件大小为 48MB。通常,日志文件的组合大小应该足够大,以使服务器能够平滑工作负载活动的峰值和谷值,这通常意味着有足够的重做日志空间来处理一个多小时的写入活动。较大的日志文件大小意味着缓冲池中较少的检查点刷新活动,从而减少磁盘 I/O。有关更多信息,请参见 第 10.5.4 节,“优化 InnoDB 重做日志记录”

innodb_log_group_home_dir 定义 InnoDB 日志文件的目录路径。您可以使用此选项将 InnoDB 重做日志文件放在与 InnoDB 数据文件不同的物理存储位置,以避免潜在的 I/O 资源冲突;例如

[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
注意

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

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

撤消表空间配置

撤消日志默认情况下位于两个撤消表空间中,这两个表空间在 MySQL 实例初始化时创建。

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

撤消日志的 I/O 模式使得撤消表空间成为 SSD 存储的良好候选者。

有关配置其他撤消表空间的信息,请参见 第 17.6.3.4 节,“撤消表空间”

全局临时表空间配置

全局临时表空间存储对用户创建的临时表所做更改的回滚段。

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

innodb_temp_data_file_path 选项指定全局临时表空间数据文件的路径、文件名和文件大小。文件大小以 KB、MB 或 GB 为单位指定,在大小值后面附加 K、M 或 G。文件大小或组合文件大小必须略大于 12MB。

要为全局临时表空间数据文件指定其他位置,请在启动时配置 innodb_temp_data_file_path 选项。

会话临时表空间配置

在 MySQL 9.0 中,InnoDB 始终用作内部临时表的磁盘存储引擎。

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

要为会话临时表空间指定其他位置,请在启动时配置 innodb_temp_tablespaces_dir 变量。允许使用完整限定路径或相对于数据目录的路径。

页面大小配置

innodb_page_size 选项指定 MySQL 实例中所有 InnoDB 表空间的页面大小。此值在实例创建时设置,之后保持不变。有效值为 64KB、32KB、16KB(默认值)、8KB 和 4KB。或者,您可以以字节为单位指定页面大小(65536、32768、16384、8192、4096)。

默认的 16KB 页面大小适用于各种工作负载,特别是对于涉及表扫描和涉及批量更新的 DML 操作的查询。对于涉及许多小写入的 OLTP 工作负载,较小的页面大小可能更有效,其中当单个页面包含许多行时,争用可能成为问题。较小的页面对于 SSD 存储设备也可能更有效,SSD 存储设备通常使用较小的块大小。使 InnoDB 页面大小接近存储设备块大小可最大程度地减少写入磁盘的未更改数据量。

重要

仅在初始化数据目录时才能设置 innodb_page_size。有关更多信息,请参见此变量的描述。

内存配置

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

特定于 InnoDB 的缓冲区使用以下参数配置

警告

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

可以使用类似于以下计算 MySQL 全局和每个线程内存分配的公式来估计 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 节,“启用大页面支持”