mysql8.0之后推出了服务器资源自适应参数innodb_dedicated_server,可以根据操作系统内存资源自动设置一部分参数,避免手动设置不合理的烦恼。


参考官方文档:

https://dev.mysql.com/doc/refman/8.0/en/innodb-dedicated-server.html



官方建议仅在专用服务器上设置innodb_dedicated_server=ON,如果你的服务器上除了MySQL服务还部署了其他应用,建议不要开启该参数


设置innodb_dedicated_server=ON会自动配置以下参数:

  • innodb_buffer_pool_size

  • innodb_log_file_size

  • innodb_log_files_in_group (as of MySQL 8.0.14)

  • innodb_flush_method


注:如果设置了innodb_dedicated_server=ON的同时又显式设置了innodb_buffer_pool_size,innodb_log_file_size,innodb_log_files_in_group,innodb_flush_method,则会以显式设置的参数值为准。


innodb_buffer_pool_size自动设置规则:

Detected Server Memory

Buffer Pool Size

Less than 1GB

128MiB (the default value)

1GB to 4GB

detected server memory * 0.5

Greater than 4GB

detected server memory * 0.75

所以,在一个4C8G的服务器上,innodb_buffer_pool_size分配的值为6G

mysql8.0自适应参数_java


innodb_log_file_size自动设置规则:

Buffer Pool Size

Log File Size

Less than 8GB

512MiB

8GB to 128GB

1024MiB

Greater than 128GB

2048MiB

所以,在一个4C8G的服务器上,一个日志文件的大小为512M

mysql8.0自适应参数_java_02


innodb_log_files_in_group自动设置规则:

Buffer Pool Size

Number of Log Files

Less than 8GB

ROUND(buffer pool size)

8GB to 128GB

ROUND(buffer pool size * 0.75)

Greater than 128GB

64

所以,在一台4C8G的服务器上,日志文件数为6,该参数8.0.14之后才加入自动配置:

mysql8.0自适应参数_java_03


innodb_flush_method自动配置规则:

The flush method is set to O_DIRECT_NO_FSYNCwhen innodb_dedicated_server is enabled”https://dev.mysql.com/doc/refman/8.0/en/innodb-dedicated-server.html


所以只要开启了innodb_dedicated_server,innodb_flush_method=O_DIRECT_NO_FSYNC

mysql8.0自适应参数_java_04


这一步其实是有一定风险,我们知道一般设置的innodb_flush_method=O_DIRECT,意味着打开文件(数据文件,redo)时使用的是O_DIRECT方式,写文件时,则会写入文件系统buffer,并调用fsync()刷盘。设置innodb_flush_method=O_DIRECT_NO_FSYNC,则写入文件系统buffer后,跳过fsync的调用。官方建议如果使用外部存储,改用O_DIRECT。保险的方式是开启innodb_dedicated_server的同时显式指定innodb_flush_method=O_DIRECT


目前来看自适应功能可自动设置的参数还比较少,后续随着版本迭代,应该会引入更多参数~~~