InnoDB启动配置
有关InnoDB
配置的第一个决定涉及数据文件,日志文件,页面大小和内存缓冲区的配置。建议您在创建InnoDB
实例之前定义数据文件,日志文件和页面大小配置。InnoDB
创建实例后修改数据文件或日志文件配置可能涉及不平凡的过程,并且仅在InnoDB
首次初始化实例时才能定义页面大小。
除了这些主题之外,本节还提供有关InnoDB
在配置文件中指定选项,参见InnoDB
初始化信息以及重要的存储注意事项的信息。
- 在MySQL配置文件中指定选项
- 参见InnoDB初始化信息
- 重要的存储注意事项
- 系统表空间数据文件配置
- 重做日志文件配置
- 撤消表空间配置
- 全局临时表空间配置
- 会话临时表空间配置
- 页面大小配置
- 内存配置
在MySQL配置文件中指定选项
由于MySQL使用数据文件,日志文件和页面大小配置设置来初始化InnoDB
实例,因此建议您InnoDB
在首次初始化之前在MySQL启动时读取的配置文件中定义这些设置。InnoDB
在启动MySQL服务器时初始化,并且InnoDB
通常在首次启动MySQL服务器时进行第一次的初始化。
您可以将InnoDB
选项放在[mysqld]
服务器启动时读取的任何选项文件的组中。“使用选项文件”中描述了MySQL选项文件的位置。
为了确保mysqld仅从特定文件(和mysqld-auto.cnf
)中读取选项,--defaults-file
在启动服务器时,将该选项用作命令行上的第一个选项:
mysqld --defaults-file=path_to_configuration_file
参见InnoDB初始化信息
要InnoDB
在启动过程中参见初始化信息,请从命令提示符启动mysqld。当从命令提示符启动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位于bin
MySQL安装目录中:
shell>bin/mysqld --user=mysql &
如果不将服务器输出发送到控制台,请在启动后检查错误日志,以参见InnoDB
在启动过程中打印的初始化信息。
有关使用其他方法启动MySQL的信息,请参见“自动启动和停止MySQL”。
注意
InnoDB
在启动时不会打开所有用户表和关联的数据文件。但是,InnoDB
是否检查*.ibd
数据字典中引用的表空间文件是否存在。如果找不到表空间文件,则InnoDB
记录错误并继续启动过程。重做日志中引用的表空间文件可能会在崩溃恢复中为重做应用程序打开。
重要的存储注意事项
在继续启动配置之前,请参见以下与存储相关的注意事项。
- 在某些情况下,如果数据未全部放置在同一物理磁盘上,则数据库性能会提高。将日志文件与数据放在不同的磁盘上通常对性能很有帮助。例如,您可以将系统表空间数据文件和日志文件放置在不同的磁盘上。您还可以将原始磁盘分区(原始设备)用于
InnoDB
数据文件,这可以加快I / O速度。请参阅对系统表空间使用原始磁盘分区。 InnoDB
是用于MySQL的事务安全(兼容ACID)的存储引擎,具有提交,回滚和崩溃恢复功能来保护用户数据。但是,如果基础操作系统或硬件无法如所宣传的那样工作,则无法这样做。许多操作系统或磁盘子系统可能会延迟或重新排序写操作以提高性能。在某些操作系统上,fsync()
应该等待直到刷新了文件的所有未写数据的系统调用才可能实际返回,然后才将数据刷新到稳定存储。因此,操作系统崩溃或断电可能会破坏最近提交的数据,或者在最坏的情况下,甚至由于对写操作进行了重新排序都会破坏数据库。如果数据完整性对您很重要,请在生产中使用任何产品之前执行一些“即插即用”测试。在macOS上,InnoDB
使用特殊的fcntl()
文件刷新方法。在Linux下,建议禁用回写缓存。在ATA / SATA磁盘驱动器上,这样的命令
hdparm -W0 /dev/hda
可能会起作用以禁用回写缓存。注意某些驱动器或磁盘控制器可能无法禁用回写缓存。- 关于
InnoDB
保护用户数据的恢复功能,请InnoDB
使用文件刷新技术,该技术涉及一种称为doublewrite缓冲区的结构,默认情况下(innodb_doublewrite=ON
)已启用。doublewrite缓冲区可提高崩溃或断电后的恢复安全性,并通过减少fsync()
操作需求来提高大多数Unix类型的性能。innodb_doublewrite
如果您担心数据完整性或可能的故障,建议将该选项保持启用状态。有关双写缓冲区的其他信息,请参见“ 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]]
文件大小是由附加在千字节,兆字节或千兆字节指定K
,M
或G
对大小值。如果以千字节为单位指定数据文件大小,请以1024的倍数指定。否则,千字节值将四舍五入到最接近的兆字节(MB)边界。文件大小的总和至少必须大于12MB。
您可以使用分号分隔的列表指定多个数据文件。例如:
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
该autoextend
和max
属性只能用于将最后一个指定的数据文件中使用。
当autoextend
指定的属性,则数据文件自动大小由64MB增量因为需要空间增加。所述innodb_autoextend_increment
可变控制增量大小。
要为自动扩展的数据文件指定最大大小,请在max
属性之后使用autoextend
属性。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
通过在文本上将value的值连接innodb_data_home_dir
到数据文件名,形成每个数据文件的目录路径。如果innodb_data_home_dir
未定义,则默认值为“./”,它是数据目录。(MySQL服务器开始执行时,将其当前工作目录更改为数据目录。)
如果指定innodb_data_home_dir
为空字符串,则可以为innodb_data_file_path
值中列出的数据文件指定绝对路径。以下配置与前面的配置等效:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/myibdata/ibdata1:50M:autoextend
重做日志文件配置
默认情况下,InnoDB
在名为ib_logfile0
和的数据目录中创建两个5MB的重做日志文件ib_logfile1
。
以下选项可用于修改默认配置:
innodb_log_group_home_dir
定义InnoDB
日志文件的目录路径(重做日志)。如果未配置此选项,InnoDB
则在MySQL数据目录(datadir
)中创建日志文件。您可以使用此选项将
InnoDB
日志文件放置在与InnoDB
数据文件不同的物理存储位置,以避免潜在的I / O资源冲突。例如:[mysqld] innodb_log_group_home_dir = /dr3/iblogs
注意
InnoDB
不会创建目录,因此在启动服务器之前请确保日志目录存在。使用Unix或DOSmkdir
命令创建任何必要的目录。确保MySQL服务器具有适当的访问权限,可以在日志目录中创建文件。更一般而言,服务器必须在需要创建日志文件的任何目录中具有访问权限。
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。有关更多信息,请参见“优化InnoDB重做日志”。
撤消表空间配置
默认情况下,撤消日志位于初始化MySQL实例时创建的两个撤消表空间中。撤消日志的I / O模式使撤消表空间成为SSD存储的理想候选者。
该innodb_undo_directory
变量定义InnoDB
创建默认撤消表空间的路径。如果未定义该变量,则会在数据目录中创建默认的撤消表空间。该innodb_undo_directory
变量不是动态的。配置它需要重新启动服务器。
有关配置其他撤消表空间的信息,请参见“撤消表空间”。
全局临时表空间配置
全局临时表空间存储回滚段,以用于对用户创建的临时表所做的更改。
默认情况下,在目录中InnoDB
创建一个自动扩展的全局临时表空间数据文件。初始文件大小略大于12MB。ibtmp1
innodb_data_home_dir
该innodb_temp_data_file_path
变量指定全局临时表空间数据文件的路径,文件名和文件大小。通过将K,M或G附加到大小值,以KB,MB或GB来指定文件大小。文件大小的总和必须略大于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
选项指定InnoDB
MySQL实例中所有表空间的页面大小。创建实例时设置此值,此后保持不变。有效值为64KB,32KB,16KB(默认值),8KB和4KB。或者,您可以指定页面大小(以字节为单位)(65536、32768、16384、8192、4096)。
默认页面大小为16KB,适用于各种工作负载,尤其是涉及表扫描的查询和涉及批量更新的DML操作。对于涉及许多小写操作的OLTP工作负载,较小的页面大小可能更有效,当单个页面包含许多行时,争用可能成为问题。对于通常使用较小块大小的SSD存储设备,较小的页面可能也很有效。使InnoDB
页面大小接近存储设备块大小可以最大程度地减少重写到磁盘的未更改数据量。
内存配置
MySQL将内存分配给各种缓存和缓冲区,以提高数据库操作的性能。当为分配内存时InnoDB
,请始终考虑操作系统所需的内存,分配给其他应用程序的内存以及分配给其他MySQL缓冲区和缓存的内存。例如,如果使用MyISAM
表,请考虑为键缓冲区(key_buffer_size
)分配的内存量。有关MySQL缓冲区和缓存的概述,请参见“ MySQL如何使用内存”。
InnoDB
使用以下参数配置特定于的缓冲区:
innodb_buffer_pool_size
定义缓冲池的大小,缓冲池是用于存储InnoDB
表,索引和其他辅助缓冲区的缓存数据的内存区域。缓冲池的大小对于系统性能很重要,通常建议将innodb_buffer_pool_size
其配置为系统内存的50%到75%。默认缓冲池大小为128MB。有关其他指导,请参见“ MySQL如何使用内存”。有关如何配置InnoDB
缓冲池大小的信息,请参见“配置InnoDB缓冲池大小”。缓冲池大小可以在启动时配置,也可以动态配置。在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。缓冲池实例的数量由by
innodb_buffer_pool_instances
选项控制。默认情况下,InnoDB
创建一个缓冲池实例。可以在启动时配置缓冲池实例的数量。有关更多信息,请参见“配置多个缓冲池实例”。innodb_log_buffer_size
定义InnoDB
用于写入磁盘上日志文件的缓冲区的字节大小。默认大小为16MB。较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将日志写入磁盘。如果您有更新,插入或删除许多行的事务,则可以考虑增加日志缓冲区的大小以节省磁盘I / O。innodb_log_buffer_size
可以在启动时配置。有关相关信息,请参见“优化InnoDB重做日志”。
警告在32位GNU / Linux x86上,请注意不要将内存使用率设置得太高。
glibc
可能允许进程堆在线程堆栈上增长,从而使服务器崩溃。如果分配给mysqld进程的全局和每个线程缓冲区和缓存的内存接近或超过2GB ,则存在风险。可以使用与以下类似的公式来计算MySQL的全局和每个线程的内存分配,以估算MySQL的内存使用情况。您可能需要修改公式以解决MySQL版本和配置中的缓冲区和缓存。有关MySQL缓冲区和缓存的概述,请参见“ MySQL如何使用内存”。
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
每个线程使用一个堆栈(在Oracle公司提供的MySQL二进制文件中通常为2MB,但只有256KB),在最坏的情况下还使用sort_buffer_size + read_buffer_size
额外的内存。
在Linux上,如果为内核启用了大页面支持,则InnoDB
可以使用大页面为其缓冲池分配内存。请参见“启用大页面支持”。