第一个要做的决定InnoDB
配置包括数据文件、日志文件、页面大小和内存缓冲区的配置,这些都应该在初始化之前进行配置InnoDB
.修改之后的配置InnoDB
初始化过程可能涉及非平凡的过程。
本节提供有关指定的信息InnoDB
配置文件中的设置,查看InnoDB
初始化信息,以及重要的存储注意事项。
因为MySQL使用数据文件、日志文件和页面大小设置来初始化InnoDB
在初始化之前,建议您在MySQL启动时读取的选项文件中定义这些设置InnoDB
.通常情况下,InnoDB
在MySQL服务器第一次启动时初始化。
你可以放置InnoDB
设置(mysqld)
服务器启动时读取的任何选项文件的组。MySQL选项文件的位置描述在第4.2.2.2节“使用选项文件”.
为了确保mysqld方法只从特定文件读取选项——defaults-file
选项作为启动服务器时命令行的第一个选项:
mysqld——defaults-file =path_to_option_file
查看InnoDB
启动时的初始化信息,启动mysqld从命令提示符,它将初始化信息打印到控制台。
例如,在Windows上,如果mysqld位于C:\Program Files\MySQL\MySQL Server 5.7\bin
,像这样启动MySQL服务器:
C:\程序文件\MySQL\MySQL Server 5.7\bin\mysqld"——控制台
在类unix系统中,mysqld位于箱子
MySQL安装目录:
$> 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磁盘驱动器上,这样的命令
hdparm -W0 /dev/hda
可以禁用回写缓存。注意,某些驱动器或磁盘控制器可能无法禁用回写缓存。关于
InnoDB
保护用户数据的恢复功能,InnoDB
使用文件刷新技术,该技术涉及名为doublewrite缓冲,在默认情况下启用(innodb_doublewrite =对
).doublewrite缓冲区为意外退出或断电后的恢复增加了安全性,并通过减少对fsync ()
操作。建议innodb_doublewrite
选项如果关心数据完整性或可能的故障,则保持启用状态。有关doublewrite缓冲区的信息,请参见第14.12.1节“InnoDB磁盘I/O”.在使用NFS之前
InnoDB
,检讨可能出现的问题使用NFS和MySQL.不支持在Windows上的4K扇区硬盘驱动器上运行MySQL服务器
innodb_flush_method = async_unbuffered
,为默认设置。解决方法是使用innodb_flush_method =正常
.
的innodb_data_file_path
选项定义的名称、大小和属性InnoDB
系统表空间数据文件。如果在初始化MySQL服务器之前没有配置此选项,则默认行为是创建一个自动扩展的数据文件,该文件略大于12MB,名为ibdata1
:
显示变量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目录。)
如果你指定innodb_data_home_dir
控件中列出的数据文件的绝对路径作为空字符串innodb_data_file_path
价值。以下配置等同于上述配置:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/myibdata/ibdata: 50m:autoextend .日志含义
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 . [mysqld] innodb_log_group_home_dir = /dr3/iblogs .
请注意InnoDB
不创建目录,因此在启动服务器之前,请确保日志目录存在。使用Unix或DOSmkdir
命令来创建任何必要的目录。请确保MySQL服务器具有在log目录下创建文件的适当访问权限。更一般地说,服务器必须对它需要在其中创建日志文件的任何目录具有访问权限。
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重做日志”章节.
缺省情况下,Undo日志是系统表空间的一部分。但是,您可以选择将撤消日志存储在一个或多个单独的撤消表空间中,通常位于不同的存储设备上。
的innodb_undo_directory
配置选项定义了路径InnoDB
为undo日志创建单独的表空间。该选项通常与innodb_rollback_segments
而且innodb_undo_tablespaces
选项,这些选项决定了撤消日志在系统表空间外的磁盘布局。
innodb_undo_tablespaces
弃用;希望它在未来的版本中被删除。
有关更多信息,请参见第14.6.3.4节“撤消表空间”.
名为。的单个自动扩展临时表空间数据文件ibtmp1
在innodb_data_home_dir
目录。初始文件大小略大于12MB。方法可以在启动时修改默认的临时表空间数据文件配置innodb_temp_data_file_path
配置选项。
的innodb_temp_data_file_path
选项指定临时表空间数据文件的路径、文件名和文件大小。通过连接形成完整的目录路径innodb_data_home_dir
指定的路径innodb_temp_data_file_path
.文件大小以KB、MB或GB (1024MB)为单位,通过在大小值后面加上K、M或G来指定。文件大小或文件的组合大小必须略大于12MB。
的innodb_data_home_dir
默认值为MySQL数据目录(datadir
).
在使用大型临时表或大量使用临时表的环境中,自动扩展临时表空间数据文件可能变得很大。使用临时表的长时间运行查询也可能产生大数据文件。为防止临时数据文件变得太大,请配置innodb_temp_data_file_path
选项指定最大数据文件大小。有关更多信息,请参见管理临时表空间数据文件大小.
的innodb_page_size
选项指定所有的页面大小InnoDB
MySQL实例中的表空间。该值在创建实例时设置,之后保持不变。取值范围为64KB、32KB、16KB(默认值)、8KB和4KB。或者,可以以字节为单位指定页面大小(65536、32768、16384、8192、4096)。
默认的16KB页面大小适用于广泛的工作负载,特别是涉及表扫描的查询和涉及批量更新的DML操作。对于涉及许多小写操作的OLTP工作负载,较小的页面大小可能更有效,当单个页面包含许多行时,可能会出现争用问题。较小的页面对于SSD存储设备也更有效,SSD存储设备通常使用较小的块大小。保持InnoDB
接近存储设备块大小的页面大小可以使重写到磁盘的未更改数据量最小化。
MySQL为各种缓存和缓冲区分配内存,以提高数据库操作的性能。分配内存时InnoDB
,总是考虑操作系统所需的内存,分配给其他应用程序的内存,以及分配给其他MySQL缓冲区和缓存的内存。例如,如果你使用MyISAM
表,考虑分配给键缓冲区的内存量(key_buffer_size
).有关MySQL缓冲区和缓存的概述,请参见第8.12.4.1节MySQL如何使用内存.
特定于InnoDB
使用以下参数进行配置:
通过innodb_buffer_pool_size
定义缓冲池的大小,它是用于保存缓存数据的内存区域InnoDB
表、索引和其他辅助缓冲区。缓冲池的大小对系统性能很重要,通常建议这样做通过innodb_buffer_pool_size
配置为系统内存的50%到75%。默认的缓冲池大小是128MB。有关其他指导,请参见第8.12.4.1节MySQL如何使用内存.有关如何配置的信息InnoDB
缓冲池大小,请参见第14.8.3.1节“配置InnoDB缓冲池大小”.缓冲池大小可以在启动时配置,也可以动态配置。在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。缓冲池实例的数量由by控制
innodb_buffer_pool_instances
选择。默认情况下,InnoDB
创建一个缓冲池实例。缓冲池实例的数量可以在启动时配置。有关更多信息,请参见第14.8.3.2节“配置多个缓冲池实例”.innodb_log_buffer_size
定义缓冲区的大小InnoDB
用于写入磁盘上的日志文件。默认大小为16MB。大的日志缓冲区使大的事务能够在事务提交之前不将日志写入磁盘而运行。如果您的事务更新、插入或删除许多行,您可能会考虑增加日志缓冲区的大小,以节省磁盘I/O。innodb_log_buffer_size
可以在启动时配置。相关信息请参见“优化InnoDB重做日志”章节.
在32位GNU/Linux x86上,如果内存使用率设置过高,glibc
可能允许进程堆超过线程堆栈,导致服务器故障。如果内存分配给mysqld对于全局和每个线程的缓冲区和缓存,该进程接近或超过2GB。
一个类似于下面的公式计算MySQL的全局和每个线程的内存分配,可以用来估计MySQL的内存使用情况。您可能需要修改这个公式,以考虑MySQL版本和配置中的缓冲区和缓存。有关MySQL缓冲区和缓存的概述,请参见第8.12.4.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.4.2节“启用大页面支持”.