第一个要做的决定是InnoDB
配置包括数据文件、日志文件、页面大小和内存缓冲区的配置,这些都应该在初始化之前进行配置InnoDB
.修改后的配置InnoDB
初始化可能涉及一些重要的过程。
本节提供有关指定的信息InnoDB
设置在配置文件中,查看InnoDB
初始化信息,以及重要的存储注意事项。
因为MySQL使用数据文件、日志文件和页面大小设置来初始化InnoDB
,建议您在MySQL启动时(在初始化之前)读取的选项文件中定义这些设置InnoDB
.通常情况下,InnoDB
在MySQL服务器第一次启动时初始化。
你可以把InnoDB
中的选项。(mysqld)
服务器启动时读取的任何选项文件的组。MySQL选项文件的位置描述在第4.2.2.2节“使用选项文件”.
为了确保mysqld仅从特定文件(和)读取选项mysqld-auto.cnf
),使用——defaults-file
选项作为启动服务器时命令行上的第一个选项:
mysqld——defaults-file =path_to_option_file
查看InnoDB
启动时的初始化信息,startmysqld命令提示符将初始化信息打印到控制台。
例如,在Windows上,如果mysqld位于C:\Program Files\MySQL\MySQL Server 8.0\bin
,启动MySQL服务器:
C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld"——控制台
在类unix系统上,mysqld位于箱子
MySQL安装目录:
Shell > bin/mysqld——user=mysql &
如果您没有将服务器输出发送到控制台,请在启动后查看错误日志以查看初始化信息InnoDB
在启动过程中打印。
有关使用其他方法启动MySQL的信息,请参见第2.10.5节,“自动启动和停止MySQL”.
InnoDB
在启动时不打开所有用户表和相关数据文件。然而,InnoDB
检查是否存在数据字典中引用的表空间文件。如果没有找到表空间文件,InnoDB
记录错误并继续启动顺序。重做日志中引用的表空间文件可能在重做应用程序崩溃恢复时被打开。
在继续启动配置之前,请查看以下与存储相关的注意事项。
在某些情况下,可以通过将数据和日志文件放在单独的物理磁盘上来提高数据库性能。您还可以使用原始磁盘分区(原始设备)
InnoDB
数据文件,这可能会加快I/O。看到使用裸磁盘分区作为系统表空间.InnoDB
是一个事务安全(ACID兼容)的存储引擎,具有提交、回滚和崩溃恢复功能,可以保护用户数据。然而,它不能这样做如果底层操作系统或硬件不像宣传的那样工作。许多操作系统或磁盘子系统可能会延迟或重新排序写操作以提高性能。在一些操作系统上,非常fsync ()
应该等到文件的所有未写入数据都被刷新的系统调用实际上可能在数据被刷新到稳定存储之前返回。因此,操作系统崩溃或断电可能会破坏最近提交的数据,或者在最坏的情况下,甚至会损坏数据库,因为写操作已被重新排序。如果数据完整性对您很重要,请执行”拔掉插头”在生产环境中使用任何东西之前进行测试。在macOS,InnoDB
使用特殊的fcntl ()
文件刷新方法。在Linux下,建议执行以下操作关闭回写缓存.在ATA/SATA磁盘驱动器上,命令如下
-W0 /dev/hda
可能会禁用回写缓存。注意,某些驱动器或磁盘控制器可能无法禁用回写缓存。关于
InnoDB
保护用户数据的恢复功能;InnoDB
使用涉及称为doublewrite缓冲,默认情况下是启用的(innodb_doublewrite =对
).双写缓冲区为意外退出或断电后的恢复增加了安全性,并通过减少需要来提高大多数Unix系统的性能fsync ()
操作。建议使用innodb_doublewrite
选项保持启用,如果您关心数据完整性或可能的故障。有关双写缓冲区的信息,请参见章节15.11.1,“InnoDB磁盘I/O”.使用NFS之前
InnoDB
,审查中列出的潜在问题在MySQL中使用NFS.
的innodb_data_file_path
的名称、大小和属性InnoDB
系统表空间数据文件。如果在初始化MySQL服务器之前没有配置此选项,则默认行为是创建一个单独的自动扩展数据文件,略大于12MB,名为ibdata1
:
mysql>显示变量:innodb_data_file_path+-----------------------+------------------------+ | Variable_name |值 | +-----------------------+------------------------+ | innodb_data_file_path | ibdata1:12M: autoextend | +-----------------------+------------------------+
完整的数据文件规范语法包括文件名、文件大小、autoextend
属性,马克斯
属性:
file_name:file_size[: autoextend[:马克斯:max_file_size]]
文件大小以千字节、兆字节或千兆字节为单位K
,米
或G
到大小值。如果以千字节为单位指定数据文件大小,请设置为1024的倍数。否则,千字节值四舍五入到最接近的兆字节(MB)边界。文件大小的总和必须至少略大于12MB。
可以使用分号分隔的列表指定多个数据文件。例如:
(mysqld) innodb_data_file_path = ibdata1:50M; ibdata2:50M: autoextend
的autoextend
和马克斯
属性只能用于最后指定的数据文件。
当autoextend
属性,则根据空间需求,数据文件的大小自动以64MB的增量增加。的innodb_autoextend_increment
变量控制增量大小。
要指定自动扩展数据文件的最大大小,请使用马克斯
属性后面的autoextend
属性。使用马克斯
属性,仅在限制磁盘使用非常重要的情况下使用。以下配置允许ibdata1
扩展到500MB的限制:
(mysqld) innodb_data_file_path = ibdata1:12M: autoextend:马克斯:500米
的最小文件大小是强制的第一个系统表空间数据文件,确保有足够的空间供双写缓冲页使用。下表显示了每种方法的最小文件大小InnoDB
页面大小。默认的InnoDB
页面大小为16384 (16KB)。
页面大小(innodb_page_size) | 最小文件大小 |
---|---|
16384 (16KB)或更小 | 3 mb |
32768 (32 kb) | 6 mb |
65536 (64 kb) | 12 mb |
如果磁盘已满,可以在另一个磁盘上添加数据文件。有关说明,请参阅调整系统表空间大小.
单个文件的大小限制由您的操作系统决定。在支持大文件的操作系统上,可以将文件大小设置为4GB以上。您还可以使用原始磁盘分区作为数据文件。看到使用裸磁盘分区作为系统表空间.
InnoDB
不知道文件系统的最大文件大小,所以对最大文件大小较小的文件系统(如2GB)要小心。
默认情况下,在data目录下创建系统表空间文件(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服务器在开始执行时将其当前工作目录更改为data目录。)
或者,您可以为系统表空间数据文件指定一个绝对路径。下面的配置与前面的配置相同:
(mysqld) innodb_data_file_path = / myibdata / ibdata1:50M: autoextend
的绝对路径innodb_data_file_path
,则设置不与innodb_data_home_dir
设置。系统表空间文件在指定的绝对路径下创建。在启动服务器之前,指定的目录必须存在。
从MySQL 8.0.20开始,doublewrite缓冲区存储区域驻留在doublewrite文件中,这为doublewrite页面的存储位置提供了灵活性。在以前的版本中,双写缓冲区存储区域位于系统表空间中。的innodb_doublewrite_dir
变量定义存放的目录InnoDB
在启动时创建双写文件。如果未指定目录,则在目录下创建双写文件innodb_data_home_dir
目录,如果未指定,则默认为数据目录。
在目录之外的位置创建双写文件innodb_data_home_dir
目录、配置innodb_doublewrite_dir
变量。例如:
innodb_doublewrite_dir =/ / doublewrite_directory /路径
其他doublewrite缓冲区变量允许定义doublewrite文件的数量、每个线程的页面数量和doublewrite批处理大小。有关双写缓冲区配置的详细信息,请参见第15.6.4节,“双写缓冲区”.
InnoDB
创建两个5MB的重做日志文件ib_logfile0
和ib_logfile1
默认在data目录中。
可以使用以下选项修改默认配置:
innodb_log_group_home_dir
控件的目录路径InnoDB
日志文件。如果未配置此选项,则InnoDB
日志文件创建在MySQL数据目录(datadir
).您可以使用此选项来放置
InnoDB
日志文件在不同的物理存储位置InnoDB
以避免潜在的I/O资源冲突。例如:[mysqld] innodb_log_group_home_dir = /dr3/iblogs
请注意InnoDB
不创建目录,因此在启动服务器之前请确保日志目录存在。使用Unix或DOS操作系统mkdir
命令创建任何必要的目录。确保MySQL服务器具有在日志目录中创建文件的适当访问权限。更一般地说,服务器必须对需要创建日志文件的任何目录具有访问权限。
innodb_log_files_in_group
定义日志组中日志文件的数量。默认值和推荐值均为2。innodb_log_file_size
以字节为单位定义日志组中每个日志文件的大小。合并的日志文件大小(innodb_log_file_size
*innodb_log_files_in_group
)不能超过最大值(略低于512GB)。例如,一对255gb的日志文件接近限制,但没有超过限制。默认的日志文件大小为48MB。通常,日志文件的组合大小应该足够大,以便服务器可以平滑工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理超过一个小时的写活动。更大的日志文件大小意味着缓冲池中的检查点刷新活动更少,从而减少磁盘I/O。有关其他信息,请参见第8.5.4节,“优化InnoDB重做日志”.
缺省情况下,Undo日志驻留在MySQL实例初始化时创建的两个Undo表空间中。
的innodb_undo_directory
变量定义路径InnoDB
创建默认的undo表空间。如果该变量未定义,则在数据目录中创建默认的undo表空间。的innodb_undo_directory
变量不是动态的。配置它需要重新启动服务器。
撤消日志的I/O模式使撤消表空间成为很好的备选固态硬盘存储。
有关配置其他undo表空间的信息,请参见第15.6.3.4节“撤销表空间”.
全局临时表空间存储对用户创建的临时表所做更改的回滚段。
单个自动扩展全局临时表空间数据文件ibtmp1
在innodb_data_home_dir
默认为目录。初始文件大小略大于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
选项指定所有选项的页面大小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缓冲区和缓存的概述,请参见第8.12.3.1节,“MySQL如何使用内存”.
特定于InnoDB
通过以下参数配置:
通过innodb_buffer_pool_size
定义缓冲池的大小,缓冲池是保存缓存数据的内存区域InnoDB
表、索引和其他辅助缓冲区。缓冲池的大小对系统性能很重要,通常建议这样做通过innodb_buffer_pool_size
配置为系统内存的50%到75%。默认缓冲池大小为128MB。有关其他指导,请参见第8.12.3.1节,“MySQL如何使用内存”.有关如何配置的信息InnoDB
缓冲池大小,参见第15.8.3.1节,“配置InnoDB缓冲池大小”.缓冲池大小可以在启动时或动态配置。在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。缓冲池实例的数量由by控制
innodb_buffer_pool_instances
选择。默认情况下,InnoDB
创建一个缓冲池实例。缓冲池实例的数量可以在启动时配置。有关更多信息,请参见第15.8.3.2节,“配置多个缓冲池实例”.innodb_log_buffer_size
的缓冲区的大小InnoDB
用于写入磁盘上的日志文件。默认大小为16MB。大型日志缓冲区允许运行大型事务,而无需在事务提交之前将日志写入磁盘。如果事务需要更新、插入或删除许多行,可以考虑增加日志缓冲区的大小,以节省磁盘I/O。innodb_log_buffer_size
可在启动时配置。相关信息请参见第8.5.4节,“优化InnoDB重做日志”.
在32位GNU/Linux x86上,如果内存使用设置过高,glibc
可能允许进程堆在线程堆栈上增长,从而导致服务器故障。如果分配给的内存存在风险mysqld用于全局和每线程缓冲区和缓存的进程接近或超过2GB。
计算MySQL全局和每个线程内存分配的公式类似于下面的公式,可以用来估计MySQL内存使用情况。您可能需要修改公式来解释MySQL版本和配置中的缓冲区和缓存。有关MySQL缓冲区和缓存的概述,请参见第8.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
可以使用大页面为其缓冲池分配内存。看到第8.12.3.2节“启用大页面支持”.