关于 InnoDB 配置的第一个决定涉及数据文件、日志文件、页面大小和内存缓冲区的配置,这些应该在初始化 InnoDB 之前配置。在初始化 InnoDB 之后修改配置可能需要一些复杂的步骤。
本节提供有关在配置文件中指定 InnoDB 设置、查看 InnoDB 初始化信息和重要存储注意事项的信息。
文章目录
在 MySQL 选项文件中指定选项
由于 MySQL 使用数据文件、日志文件和页面大小设置来初始化 InnoDB, 因此建议在初始化 InnoDB 之前,在 MySQL 启动时读取的选项文件中定义这些设置。通常,InnoDB 在 MySQL server 首次启动时初始化。
您可以将 InnoDB 选项放在服务器启动时读取的任何选项文件的 [ mysqld]
组中。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 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 初始化信息。
有关使用其他方法启动 MySQL 的信息,请参阅 2.9.5 节“自动启动和停止 MySQL”。
注意
InnoDB 在启动时不会打开所有用户表和关联的数据文件。然而,InnoDB 会检查数据字典中引用的表空间文件是否存在。如果找不到表空间文件,InnoDB 会记录错误并继续启动序列。在为应用 redo 的崩溃恢复期间,可能打开重做日志中引用的表空间文件。
重要的存储注意事项
在继续进行启动配置之前,请查看以下与存储相关的注意事项。
-
在某些情况下,可以通过将数据和日志文件放在单独的物理磁盘上来提高数据库性能。您还可以将原始磁盘分区(原始设备)用于 InnoDB 数据文件,这可能会加速 I/O。 请参阅 为系统表空间使用裸磁盘分区 。
-
InnoDB 是一个事务安全(符合 ACID) 存储引擎,具有提交、回滚和崩溃恢复功能,以保护用户数据。然而,如果底层操作系统或硬件不能像宣称的那样工作,则它不能这样做。许多操作系统或磁盘子系统可能会延迟或重新排序写入操作以提高性能。在某些操作系统上,应该等待直到文件的所有未写入数据都被刷新为止的
fsync()
系统调用实际上可能会在数据被刷新到稳定存储之前返回。因此,操作系统崩溃或断电可能会破坏最近提交的数据,或者在最坏的情况下,甚至会损坏数据库,因为写入操作已被重新排序。如果数据完整性对您很重要,请在生产中使用任何东西之前执行“断电”测试。在 macOS 上,InnoDB 使用特殊的fcntl()
文件刷新方法。在 Linux 下,建议禁用写回缓存(Write-back Cache)。在 ATA/SATA 磁盘驱动器上,类似
hdparm -W0 /dev/hda
的命令可以用于禁用写回缓存。请注意,某些驱动器或磁盘控制器可能无法禁用写回缓存。 -
关于保护用户数据的 InnoDB 恢复功能,InnoDB 使用一种文件刷新技术,涉及一种称为 双写缓冲(Doublewrite Buffer) 的结构,默认情况下启用(
innodb_doublewrite=ON
)。双写缓冲区在意外退出或断电后为恢复增加了安全性,并通过减少对fsync()
操作的需要,提高了大多数 Unix 类型的性能。如果您关心数据完整性或可能的故障,建议保持启用innodb_doublewrite
选项。有关双写缓冲区的信息,请参阅第 17.11.1 节,“ InnoDB 磁盘 I/O”。 -
在将 NFS 与 InnoDB 一起使用之前,请查看 将 NFS 与 MySQL 一起使用 中概述的潜在问题。
系统表空间数据文件配置
innodb_data_file_path
选项定义 InnoDB系统表空间数据文件的名称、大小和属性。如果在初始化 MySQL Server 之前未配置此选项,默认行为是创建单个自动扩展数据文件,略大于 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 附加到大小值,以 KB、MB 或 GB为单位指定文件大小。如果以 KB 为单位指定数据文件大小,则以 1024 的倍数进行指定。否则,千字节值将舍入到最接近的兆字节(MB)边界。文件大小的总和必须至少略大于 12MB 。
可以使用分号分隔的列表指定多个数据文件。例如:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
autoextend
和 max
属性只能用于最后指定的数据文件。
指定 autoextend
属性后,数据文件的大小会根据需要的空间自动增加 64MB。innodb_autoextend_increment
变量控制增量大小。
要指定自动扩展数据文件的最大大小,请在自动扩展属性之后使用 max
属性。仅在约束磁盘使用至关重要的情况下使用 max
属性。以下配置允许 ibdata1
增长到 500MB 的限制:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
为第一个系统表空间数据文件强制使用最小文件大小,以确保有足够的空间用于双写缓冲区页面(MySQL 8.0.20 以后双写缓冲改为独立存储了 --译者注)。下表显示了每个 InnoDB 页面大小的最小文件大小。默认 InnoDB 页面大小为 16384
(16KB
)。
页大小 (innodb_page_size) | 最小文件大小 |
---|---|
16384 (16KB) or less | 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 server 具有在目录中创建文件的适当访问权限。
InnoDB 通过将 innodb_data_home_dir
的值文本连接到数据文件名,形成每个数据文件的目录路径。如果未定义 innodb_data_home_dir
, 则默认值为“./
”,即数据目录。( MySQL Server 在开始执行时将其当前工作目录更改为数据目录。)
或者,您可以为系统表空间数据文件指定绝对路径。以下配置相当于前面的配置:
[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
其他双写缓冲区变量允许定义双写文件的数量、每个线程的页数和双写批处理大小。有关双写缓冲器配置的更多信息,请参阅 第 17.6.4 节“双写缓冲器” 。
重做日志配置
从 MySQL 8.0.30 开始,重做日志文件所占用的磁盘空间量由 innodb_redo_log_capacity
变量控制,该变量可以在启动或运行时设置;例如,要在选项文件中将变量设置为 8GB,请添加以下条目:
[mysqld]
innodb_redo_log_capacity = 8589934592
有关在运行时配置重做日志容量的信息,请参阅配置重做日志能力( MySQL 8.0.30 或更高版本)。
innodb_redo_log_capacity
变量取代了不推荐使用的 innodb_log_file_size
和 innodb_log_files_in_group
变量。当定义了 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
将设置为默认值,即 104857600
字节( 100MB
)。 最大设置为 128GB
。
在 MySQL 8.0.30 中,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 8.0.30 之前,InnoDB 默认在数据目录中创建两个 5MB
的 redo 日志文件,分别命名为 ib_logfile0
和 ib_logfile1
。 在初始化 MySQL Server 实例时,可以通过配置 innodb_log_files_in_group
和 innodb_log_file_size
变量来定义不同数量的重做日志文件和不同的重做日志大小。
innodb_log_files_in_group
定义日志组中日志文件的数量。默认值和建议值为2
。innodb_log_file_size
定义日志组中每个日志文件的大小(以字节为单位)。日志文件的总大小(innodb_log_files_in_group * innodb_log_file_size
) 不能超过最大值,略小于512GB
。 例如,一对 255 GB 的日志文件接近限制,但没有超过限制。默认日志文件大小为48MB
。 通常,日志文件的总大小应该足够大,以便服务器能够平滑工作负载活动的波峰和波谷,这通常意味着有足够的重做日志空间来处理一个小时以上的写入活动。更大的日志文件大小意味着缓冲池中的检查点刷新活动更少,从而减少了磁盘 I/O。 有关更多信息,请参阅 第 10.5.4 节“优化 InnoDB 重做日志记录” 。
innodb_log_group_home_dir
定义了 InnoDB日志文件的目录路径。您可以使用此选项将 InnoDB 重做日志文件放置在与 InnoDB 数据文件不同的物理存储位置,以避免潜在的 I/O 资源冲突(与 《高性能 MySQL 第三版》建议的相反);例如:
[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
笔记
InnoDB 不创建目录,因此在启动服务器之前,请确保日志目录存在。使用 Unix 或 DOSmkdir
命令创建任何必要的目录。
确保 MySQL 服务器具有在日志目录中创建文件的适当访问权限。进一步说,服务器必须对需要创建文件的任何目录具有访问权限。
撤消表空间配置
默认情况下,撤消日志位于初始化 MySQL 实例时创建的两个撤消表空间中。
innodb_undo_directory
变量定义了 InnoDB 创建默认 undo 表空间的路径。如果该变量未定义,则在数据目录中创建默认的撤消表空间。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 8.0.15 及更早版本中,当 InnoDB 被配置为内部临时表的磁盘存储引擎( internal_tmp_disk_storage_engine=InnoDB
) 时,会话临时表空间存储用户创建的临时表和优化器创建的内部临时表。从 MySQL 8.0.16 开始,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 存储设备(早期 4K 块大小的 SSD,现在诸如 16K 块大小的 SSD 已经很普遍了 --译者注,手册中其他位置也有类似说法),较小的页面也可以更高效。保持 InnoDB 页面大小接近存储设备块大小可以最大限度地减少重写到磁盘的未更改数据量。
重要提示
innodb_page_size
只能在初始化数据目录时设置。有关详细信息,请参阅此变量的描述。
内存配置
MySQL 将内存分配给各种缓存和缓冲区,以提高数据库操作的性能。在为 InnoDB 分配内存时,请始终考虑操作系统所需的内存、分配给其他应用程序的内存以及分配给其他 MySQL 缓冲区和缓存的内存。例如,如果使用 MyISAM 表,请考虑为键缓冲区分配的内存量( key_buffer_size
)。 有关 MySQL 缓冲区和缓存的概述,请参阅 第 10.12.3.1 节“ MySQL 如何使用内存” 。
InnoDB 特有的缓冲区使用以下参数进行配置:
-
innodb_buffer_pool_size
定义缓冲池的大小,缓冲池是为 InnoDB 表、索引和其他辅助缓冲保存缓存数据的内存区域。缓冲池的大小对系统性能很重要,通常建议将innodb_buffer_pool_size
配置为系统内存的 50% 到 75%。 默认缓冲池大小为128MB
。 有关其他指导,请参阅第 10.12.3.1 节“ MySQL 如何使用内存”。有关如何配置 InnoDB 缓冲池大小的信息,请参阅第 17.8.3.1 节“配置 InnoDB 缓冲器池大小”。缓冲池大小可以在启动时配置,也可以动态配置。 -
在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。缓冲池实例的数量由
innodb_buffer_pool_instances
选项控制。默认情况下,InnoDB 创建一个缓冲池实例。可以在启动时配置缓冲池实例的数量。有关更多信息,请参阅第 17.8.3.2 节“配置多个缓冲池实例”。 -
innodb_log_buffer_size
定义了 InnoDB 用来写入磁盘上日志文件的缓冲区的大小。默认大小为16MB
。 大的日志缓冲区使大型事务能够运行,而无需在事务提交之前将日志写入磁盘。如果有更新、插入或删除多行的事务,可以考虑增加日志缓冲区的大小以节省磁盘 I/O 。 可以在启动时配置innodb_log_buffer_size
。 有关信息,请参阅第 10.5.4 节“优化 InnoDB 重做日志记录”。
警告
在 32 位 GNU/Linux x86 上,如果内存使用率设置过高,glibc
可能会允许进程堆(process heep)增长到溢出线程堆栈,从而导致服务器故障。如果为全局和每线程(per-thread)缓冲区和缓存分配给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 公司提供的 MySQL 二进制文件中只有256KB
),在最坏的情况下,还使用sort_buffer_size + read_buffer_size
额外的内存。
在 Linux 上,如果内核支持大页面,InnoDB 可以使用大页面为其缓冲池分配内存。请参阅第 10.12.3.3 节“启用大页面支持”。