MySQL默认安装下配置的启动参数少的可怜,核心的参数基本都没有。本身提供的硬件资源局限,所以新部署MySQL需要合理的配置全局内存,底层基础日志文件。对于分配多少合适,通常有经验的DBA,都有一些个人心得。
到MySQL8.0版本之后,提供了一个自动分配的机制。当innodb_dedicated_server开启时,InnoDB会自动配置以下3个变量,也解决了部分小白配置,自动配置会在每次MySQL服务启动时进行评估和重新配置。
innodb_buffer_pool_size
全局内存包含data,index 信息。官方给出的规则如下:
| 服务器内存大小 | buffer_pool_size大小 | |
|---|---|---|
| 一档 | Less than 1GB | 128MB (the default value) |
| 二挡 | 1GB to 4GB | detected server memory * 0.5 |
| 三挡 | Greater than 4GB | detected server memory * 0.75 |
按照个人经验来说内存50%~75%还是非常合理的。但一些经验老到的DBA看来,高负载下还是存在一些风险。更改如下:
| 服务器内存大小 | buffer_pool_size大小 | |
|---|---|---|
| 一档 | Less than 1GB | 128MB (the default value) |
| 二挡 | 1GB to 16GB | detected server memory * 0.5 |
| 三挡 | Greater than 16GB | detected server memory * 0.75 |
innodb_redo_log_capacity
配置Redo log文件大小。
1.在MySQL 8.0.30之前,使用innodb_log_file_size和innodb_log_files_in_group参数
| 服务器内存大小 | Redo Log 大小 |
|---|---|
| Less than 8GB | 512MB |
| 8GB to 128GB | 1024MB |
| Greater than 128GB | 2048MB |
| 服务器内存大小 | Redo Log 大小 |
|---|---|
| Less than 8GB | round(buffer pool size) |
| 8GB to 128GB | round(buffer pool size * 0.75) |
| Greater than 128GB | 64 |
备注:2~4个个文件 每个文件1G大小。
2.在MySQL 8.0.30之后 ,有innodb_redo_log_capacity 生成临时文件方式代替
| 服务器内存大小 | Buffer Pool Size | Redo Log 大小 |
|---|---|---|
| Less than 1GB | 不设置 | 100MB |
| Less than 1GB | Less than 1GB | 100MB |
| 1GB to 2GB | Not applicable | 100MB |
| 2GB to 4GB | 不设置 | 1GB |
| 2GB to 4GB | Any configured value | round(0.5 * detected server memory in GB) * 0.5 GB |
| 4GB to 10.66GB | Not applicable | round(0.75 * detected server memory in GB) * 0.5 GB |
| 10.66GB to 170.66GB | Not applicable | round(0.5625 * detected server memory in GB) * 0.5 GB |
| Greater than 170.66GB | Not applicable | 128GB |
备注:这里没多大要求就32G = 32个文件* 每个1G 就完全够用。
innodb_flush_method
将数据刷新到InnoDB数据文件和日志文件的方法。包含fsync,O_DSYNC,O_DIRECT 等方式
当启用innodb_dedicated_server时,刷新方法设置为O_DIRECT_NO_FSYNC
- 在MySQL 8.0.14之前,这个设置不适合像XFS和EXT4这样的文件系统,需要使用fsync()系统调用来同步文件系统元数据的更改。
- 从MySQL 8.0.14开始,fsync()在创建新文件、增加文件大小和关闭文件后被调用,以确保文件系统元数据的更改被同步。在每次写操作之后,fsync()系统调用仍然被跳过。
如果重做日志文件和数据文件驻留在不同的存储设备上,并且在从没有电池支持的设备缓存刷新数据文件之前发生意外退出,则可能会丢失数据。如果使用或打算使用不同的存储设备来存储重做日志文件和数据文件,并且数据文件驻留在具有不支持电池的缓存的设备上,则需要使用O_DIRECT。
总结:
按照官方说明,只有当MySQL实例位于专用服务器上,独享所有可用的系统资源时,才考虑启用。如果MySQL实例与其他应用程序共享系统资源,不建议启用innodb_dedicated_server。
一些场景不适用:
- 单机多实例情况下不适应。
- 非Innodb为引擎的不适用
- 不同应用共享部署情况
当然不管专属,还是混合下这个参数都不适用,需要按照需求部署。




