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,可在启动时配置。
以上内容是关于MySQL初始化InnoDB时关于配置的建议,供读者参考。感谢您关注“MySQL解决方案工程师”
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/419590.html