参考官方文档:
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
innodb_log_file_size自动设置规则:
Buffer Pool Size | Log File Size |
Less than 8GB | 512MiB |
8GB to 128GB | 1024MiB |
Greater than 128GB | 2048MiB |
所以,在一个4C8G的服务器上,一个日志文件的大小为512M
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之后才加入自动配置:
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
这一步其实是有一定风险,我们知道一般设置的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
目前来看自适应功能可自动设置的参数还比较少,后续随着版本迭代,应该会引入更多参数~~~