MySQL8.0.34版本my.cnf最佳实践参考实例

[client]
port                                    = 3307
socket                                  = /data/mysql/3307/run/mysql.sock
default-character-set                   = utf8mb4

[mysql]          
port                                    = 3307
socket                                  = /data/mysql/3307/run/mysql.sock
default-character-set                   = utf8mb4
prompt                                  = \\u@\\h:\\d \\r:\\m:\\s >

[mysqld]
server-id                               = 64112
port                                    = 3307
mysqlx_port                             = 33070
admin_address                           = 127.0.0.1
admin_port                              = 9999
default_storage_engine                  = InnoDB
character_set_server                    = utf8mb4

transaction_isolation                   = READ-COMMITTED
max_allowed_packet                      = 1G
max_connections                         = 1000
max_connect_errors                      = 1000000

# 机械硬盘保持默认值200即可,SSD磁盘建议调高该值(比如2000)
innodb_io_capacity                      = 2000

datadir                                 = /data/mysql/3307/data
log_bin                                 = /data/mysql/3307/binlogs/mysql-bin
socket                                  = /data/mysql/3307/run/mysql.sock
mysqlx_socket                           = /data/mysql/3307/run/mysqlx.sock 
pid-file                                = /data/mysql/3307/run/mysql.pid
log_error                               = /data/mysql/3307/logs/error.log
slow_query_log_file                     = /data/mysql/3307/logs/slow.log
tmpdir                                  = /data/mysql/3307/tmp

# 建议调整为操作系统内存的50%到60%之间
innodb_buffer_pool_size                 = 32G


# 缓存binlog event的内存,当有大事物,大的DML操作,binlog_cache_size不足以容纳所有的binlog event时,便转而使用临时文件来缓存binlog event,这样性能会下降(采用临时文件缓存binlog event 肯定比采用内存缓存binlog event慢)
# 从Binlog_cache_use和Binlog_cache_disk_use可以看出是否使用了binlog cache或binlog 临时文件用于保存binlog event。
binlog_cache_size                       = 2M

# 用于普通索引扫,范围扫,和全表扫的表连接缓冲区的大小,在MySQL 8.0.18及更高版本中,此变量还控制用于哈希联接hash join的内存量。
# 默认256KB,当无法添加索引时,增加join_buffer_size的值以获得更快的完全联接。为两个表之间的每个完整联接分配一个联接缓冲区。
# 当使用块嵌套循环(Block Nested-Loop)时,更大的联接缓冲区是有益的,因为涉及到第一张表的所有关联行的所有关联列被存储在join buffer中(会减少磁盘IO)。
# 当使用Batched Key Access BKA时,也是将外部表的相关列存入join buffer中,减少随机IO,join buffer越大,越能提高性能。
join_buffer_size                        = 8M

# 默认256K,如果内存充足,增大该值会加速排序的速度,提高查询性能。connection级参数,在每个connection需要buffer的时候,一次性分配的内存,并不是越大越好,过大的设置+高并发可能会耗尽系统内存资源。
sort_buffer_size                        = 2M

read_buffer_size                        = 2M
read_rnd_buffer_size                    = 2M



# 临时表内存大小,默认16兆,执行计划中 Using temporary 出现表明用到临时表,当临时表内存不够用的时候,会使用磁盘,性能下降,典型场景:group by.  
# 当Created_tmp_disk_tables 数值增加,说明tmp的大小不够用,进而判断是否需要增加tmp_table_size的大小。
# Created_tmp_disk_tables/Created_tmp_tables 大于一定比例(5% or 10%),尝试调大tmp_table_size
tmp_table_size                          = 64M


# 从8.0.27版本后引入该参数,适用于创建或重新生成辅助索引的在线DDL操作,默认1兆,加大该值有理由提高在线DDL的执行时间。
innodb_ddl_buffer_size                  = 1G
 

# 从8.0.30版本引入该参数,产生不可见主键简称GIPK,在建表时没有指定主键的情况(备库库会出现全表扫描回放问题,带来非常大的主备延迟),MySQL会帮助我们创建名为 my_row_id 主键,建议主从库都设置。
sql_generate_invisible_primary_key      = ON


# 从8.0.30引入该参数,该参数为MySQL redo的大小,如果显示定义了innodb_log_file_size 和innodb_log_files_in_group 那么,innodb_redo_log_capacity= innodb_log_files_in_group * innodb_log_file_size,否则保持默认值100MB
innodb_redo_log_capacity                = 6G



innodb_data_file_path                   = ibdata1:500M;ibdata2:500M:autoextend
innodb_temp_data_file_path              = ibtmp1:500M;ibtmp2:500M:autoextend:max:5120M
innodb_flush_method                     = O_DIRECT
default-time-zone                       = '+8:00'
log_bin_trust_function_creators         = 1
innodb_adaptive_hash_index              = 0
log_timestamps                          = SYSTEM

gtid_mode                               = ON
enforce_gtid_consistency                = ON

lower_case_table_names                  = 1
report_host                             = '9.23.64.112'
relay-log                               = /data/mysql/3307/binlogs/relay-log
relay-log-index                         = /data/mysql/3307/binlogs/relay-log.index

binlog_expire_logs_seconds              = 2592000
slow_query_log                          = 1
long_query_time                         = 1

my.cnf使用示例

/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &


踩坑参数合集:

set global innodb_adaptive_hash_index =off;
  • 在某些负载下innodb_adaptive_hash_index并不适合打开,关闭innodb_adaptive_hash_index可以避免额外的维护开销。当然这取决于针对具体负载的性能测试。
  • 如官网所说:
    如果有许多线程等待在btr0sea中创建很多线程在等待 RW-latch竞争。考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引特性。
  • 8.0多加了 skip-innodb-adaptive-hash_index进行默认关闭。
  • 8.0.18版本多了hash join 两个都是hash ,是否有关联?看下下面解释。
    hash join只能在没有索引的字段上有效。
    Innodb_adaptive_hash_index二级索引上生效。

个人建议,部署初期直接关闭掉即可,在轻量级MySQL数据库来说,性能方面提升无法评估,又存在隐患。


控制Mysql导入数据速度

生产环境上控制Mysql导入数据速度,减小影响生产,可以限制速度导入,命令如下:

pv -p -a -L10m 07.sql | /root/opt/mysql/8.0.28/bin/mysql --defaults-file=/root/sandboxes/rsandbox_8_0_28/master/my.sandbox.cnf。

会显示导入进度条和平均速度。

 主要的参数,

-p:显示进度

-a:显示平均速度

-L:表示每秒传输速度

MySQL 8.0参数最佳实践_mysql