
MySQL8.0新增加了一个可以自适应服务器的参数,保证在各种不同的服务器、虚拟机、容器下自动适配服务器资源。
可以设置参数 innodb_dedicated_server=ON来让MySQL自动探测服务器的内存资源,自动配置 innodb_buffer_pool_size, innodb_log_file_size 和 innodb_flush_method 三个参数的取值。
具体取值策略如下:
· innodb_buffer_pool_size
自动配置的缓冲池大小
检测到的服务器内存 | 缓冲池大小 |
<1G | 128MiB(innodb_buffer_pool_size 默认) |
<= 4G | 检测到服务器内存* 0.5 |
> 4G | 检测到的服务器内存* 0.75 |
· innodb_log_file_size
自动配置的日志文件大小
检测到的服务器内存 | 日志文件大小 |
<1GB | 48MiB(innodb_log_file_size 默认) |
<= 4GB | 128MiB |
<= 8GB | 为512MiB |
<= 16GB | 1024MiB |
> 16GB | 2048MiB |
· innodb_flush_method
如果系统允许设置为O_DIRECT_NO_FSYNC。如果系统不允许,则设置为InnoDB默认的Flush method。
上述这些参数在MySQL每次启动时自动探测服务器(包括虚拟机和容器的内存)配置并自动生效。
参数使用注意
· innodb_dedicated_server默认设置为OFF,不会自动调整3个参数值。该参数无法动态调整.
· innodb_dedicated_server=ON 设置以后它只探测了服务器内存,所以目前只能自适应调整内存相关的三个参数.
· innodb_dedicated_server=ON的情况下,如果还显式设置了 innodb_buffer_pool_size innodb_log_file_size / innodb_flush_method 参数,显示设置的这些参数会优先生效,并且在MySQL的错误日志中会打印如下内容:
"[Warning] InnoDB: Option innodb_dedicated_server is ignored for because 'variable name'=? is specified explicitly."
'variable name' 指的就是innodb_buffer_pool_size/innodb_log_file_size/inndob_flush_method三个参数。
注:不管是在配置文件、命令行、还是MySQL新引入的固化配置中设定上述三个参数都被认为是显式指定了参数值,都会优先生效。
· 显示指定某一个值,并不会影响其他变量的自适应参数值设置。如显式设置了innodb_buffer_pool_size,那么buffer pool会按照显示设置的值初始化,而不是 innodb_dedicated_server参数对应的值。但是innodb_log_file_size 和 innodb_flush_method 并不会受影响,它们还是会按照innodb_dedicated_server的自适应值按照服务器的内存大小来设置。
· innodb_dedicated_server=ON的情况下,mysqld服务进程每次重启后都会自动调整上述三个参数值。在任何时候MySQL都不会将自适应值保存在持久配置中。
· 如果系统不支持O_DIRECT_NO_FSYNC,MySQL会沿用之前的默认值。MySQL仍然必须保证在所有平台上能正常启动,不需要任何其他更改。
· 如果自适应导致innodb_log_file_size对应的redo log file超过了磁盘空间限制将会采取以下措施:
a.新生成的日志文件redo log将被删除
b.错误日志显示如下
"[ERROR] InnoDB: Error number 28 means 'No space left on device'
[ERROR] InnoDB: Cannot set log file to size MB"
```
```sql
* mysqld服务拒绝启动。
· innodb_dedicated_server=ON并不见得是最优的配置。例如,你用了MyISAM,MyRocks等其他存储引擎时,建议手工调整,而不是设置innodb_dedicated_server=ON
· XFS系统请手工设置inndob_flush_method=O_DIRECT。在inndob_flush_method=O_DIRECT_NO_FSYNC下,InnoDB使用O_DIRECT来刷新IO,但是跳过fsync()步骤。对某些文件系统有效,但是对XFS文件系统并不适用。为了保证文件的metadata刷新到磁盘中,XFS必须使用O_DIRECT。
在5.7上,innodb_buffer_pool_size默认为128MB,如果采用默认设置,MySQL 5.7大概只能消耗系统的512M内存。而innodb_log_file_size=48M,对于大并发下的请求并不适用。
MySQL 8.0提供了innodb_dedicated_server=ON这个参数可以很大程度解决这方面的问题。
该参数如下场景不建议开启:
· 单机多实例情况下不适应。
· 其他有特殊场景要求的不适用。
· 不是主要以InnoDB为存储引擎的
· 服务器上还有其他应用程序的。





