MySQL 8.0 需要调整哪些参数

2022-06-15 13:59:11 浏览数 (1)

这一节内容来聊聊新部署的 MySQL 8.0,需要调整哪些参数。包括一个 my.cnf 的示例和重要参数的解释及建议。

1 my.cnf 示例

首先列出一个 8.0 my.cnf 的实例,这个只针对普通的单实例或者主从环境,对于其他环境,比如 MGR,可能有更多的一些参数需要调整。并且也不是最完整,最终要根据自己实际环境进行调整。

代码语言:javascript复制
[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port    = 3306
socket  = /tmp/mysql.sock

##  dir set
datadir           = /data/mysql/data
innodb_data_home_dir   = /data/mysql/data
innodb_log_group_home_dir = /data/mysql/data
log-bin           = /data/mysql/binlog/mysql-bin
log_bin_index             = /data/mysql/binlog/mysql-bin.index  
relay-log         = /data/mysql/binlog/mysql-relay-bin
tmpdir            = /data/mysql/tmpdir
slow_query_log_file   = /data/mysql/log/mysql-slow.log
general_log_file   = /data/mysql/log/mysql-general.log
log-error         = /data/mysql/log/mysql.err

## slave and binlog
server-id = 6666             
skip-slave-start = 0       
read_only = 0          
binlog_format = row             
log-slave-updates = 1
master_info_repository = table
relay_log_info_repository = table
relay_log_purge = 1
relay_log_recovery = 1
sync_binlog = 100                 

binlog_cache_size = 1M
binlog_expire_logs_seconds = 2592000
log_bin_trust_function_creators = 1         
slave_net_timeout=60                
#binlog_error_action="IGNORE_ERROR"     

innodb_autoinc_lock_mode=1          

## 
back_log = 200
bulk_insert_buffer_size = 8M            
#character-set-server = utf8
lower_case_table_names = 1              

## 基线
local-infile = off
skip-networking = off
skip-name-resolve = on 

## connect
max_allowed_packet = 32M
max_connect_errors = 1000
max_connections = 3000
wait_timeout = 3600            
interactive_timeout = 3600          

table_open_cache = 4096
thread_cache_size =  64
thread_stack = 192K
transaction-isolation = REPEATABLE-READ     # 
pid-file = mysql.pid

## slow
slow_query_log = 1              
long_query_time = 1
log-slow-admin-statements
log_queries_not_using_indexes = 0
slow_launch_time = 1
read_buffer_size = 4M               
read_rnd_buffer_size = 8M           
sort_buffer_size = 8M
join_buffer_size = 32M
tmp_table_size = 128M
max_heap_table_size = 128M

default-storage-engine = innodb
explicit_defaults_for_timestamp = on           

## innodb
innodb_buffer_pool_size = 1G                   
innodb_max_dirty_pages_pct = 80         
innodb_thread_concurrency = 8           
innodb_buffer_pool_instances = 2        
innodb_flush_log_at_trx_commit = 2      
innodb_read_io_threads = 8          
innodb_write_io_threads = 4         
innodb_io_capacity = 1000
innodb_io_capacity_max = 2000
innodb_lru_scan_depth = 1024
innodb_use_native_aio = 1
innodb_flush_neighbors = 1
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1

innodb_data_file_path=ibdata:1G:autoextend
innodb_log_files_in_group = 3
innodb_log_file_size = 2G
innodb_file_per_table = 1 

innodb_flush_method = O_DIRECT
innodb_strict_mode = 1
innodb_lock_wait_timeout = 30
innodb_log_buffer_size = 16M
innodb_adaptive_flushing = 1
innodb_change_buffering = all
innodb_purge_threads = 4            
innodb_purge_batch_size = 300           

innodb_old_blocks_time = 1
innodb_fast_shutdown = 0
performance_schema = 1
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 4M 

innodb_page_size = 16k
gtid_mode=on
enforce_gtid_consistency=on     

table_open_cache_instances=16
binlog_rows_query_log_events=1      


## pasword
default_password_lifetime=0 

[mysqldump]
quick
max_allowed_packet = 32M

[mysql]
no-auto-rehash
prompt=p@d>_

[mysqld_safe]
open-files-limit = 28192

[mysqlhotcopy]
interactive-timeout

2 重要参数解释

port

端口

socket

指定 socket 文件

datadir

数据目录的路径

log-bin

控制是否开启 Binlog,建议所有实例都开启 Binlog。在 MySQL 8.0 之前的版本,默认情况下禁用二进制日志,如果增加了该参数,则会开启 Binlog。从 MySQL 8.0 开始,无论是否设置了该参数,默认都开启 Binlog。后面可不带字符串,则使用主机名来定义 Binlog 文件,如果后面字符串是类似例子中的 /data/mysql/binlog/mysql-bin,则表示把 Binlog 存放在 /data/mysql/binlog/ 文件下,并以 mysql-bin 前缀命名。

log_bin_index

Binlog 文件索引文件的名称

binlog_format

二进制日志格式,可选择的日志格式有三种:statement、row、mix,具体介绍看查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/replication-formats.html。生产环境通常建议设置为 row,安全性最高。

relay-log

中继日志的名称。

slow_query_log

8.0 版本下,默认也是关闭 Slow Log 的,如果要开启,需要将 slow_query_log 设置为 1。

long_query_time

查询超过多少秒,则会记录到慢查询日志中,通常建议设置为 1,如果业务要求 MySQL 有更高的 QPS,则可以设置为 0.1 秒,发现慢查询及时优化。

slow_query_log_file

慢查询日志路径和名称。

server-id

主从或者 MGR 架构,需要将所有成员的 server id 设置的不一样。

read_only

主库关闭 read_only;从库视架构而定,通常从库开启 read_only。

log-slave-updates

表示从库从主库同步数据时,是否也写入从库自己的 Binlog。级联(A->B->C)情况下,中间的机器(B)必须要开启。通常建议都开启。这里要注意的是,从 MySQL 8.0.26,该参数改为了 log_replica_updates。

sync_binlog

控制 MySQL 服务器将二进制日志同步到磁盘的频率。对安全性要求较高的情况,建议设置成 1。各种值对应的效果,可查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_log_slave_updates。

binlog_expire_logs_seconds

Binlog 过期时间,单位秒。在以往的版本一般使用的是 expire_logs_days,该参数的单位为天。

lower_case_table_names

是否区分大小写,建议设置为1,各种值表示的含义可参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names。

max_connections

最大连接数,默认为 151,通常建议设置 1000 以上,当然也看具体配置。

wait_timeout

关闭非交互连接之前等待活动的秒数,默认 28800 秒,也就是 8 小时,建议设置小一点,防止空闲连接过多,比如设置为:3600。

interactive_timeout

关闭交互式连接之前等待活动的秒数,默认也是 28800 秒。也建议设置的小一点,比如 3600。

transaction-isolation

事务隔离级别,默认为 REPEATABLE READ,四种事务隔离级别的描述可参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html。

通常也是 REPEATABLE READ 和 READ COMMITTED 二选一,如果能接受幻读,业务可能是高并发的场景,可以配置成 RC;如果不能接受幻读,就设置成 RR 隔离级别。

innodb_buffer_pool_size

缓冲池的大小,对性能影响非常大,通常设置为机器内存的 50%-80%。

innodb_buffer_pool_instances

InnoDB 缓冲池的区域数,如果配置大于 1 的值,要求 innodb_buffer_pool_size 的值大于或等于 1G。将缓冲池划分多个区域,可以减少不同线程读取和写入缓存页时的争用,可提高并发性。

innodb_flush_log_at_trx_commit

控制 redo log 的写入策略,可设置为 0,1,2。

0:事务提交时,在事务提交时,每秒触发一次 redo log buffer 写磁盘操作,并调用操作系统 fsync 刷新 IO 缓存。

1:事务提交时,InnoDB 立即将缓存中的 redo 日志写到日志文件中,并调用操作系统 fsync 刷新 IO 缓存;

2:事务提交时,InnoDB 立即将缓存中的 redo 日志写到日志文件中,但不是马上调用 fsync 刷新 IO 缓存,而是每秒只做一次磁盘 IO 缓存刷新操作。

如果想要数据最为安全,可设置为 1,只是性能会下降一部分;

将参数设置为 0 时,如果数据库崩溃,最后 1秒钟的 redo log 可能会由于未及时写入磁盘文件而丢失,这种方式尽管效率最高,但是最不安全。

将参数设置为 2 时,如果数据库崩溃,由于已经执行了重做日志写入磁盘的操作,只是没有做磁盘 IO 刷新操作,因此,只要不发生操作系统崩溃,数据就不会丢失,这种方式是对性能和安全的一种折中处理。

innodb_io_capacity

控制每秒可用于 InnoDB 后台任务的 I/O 数,也就是 IOPS。如果是 SSD,可设置 5000 以上。

innodb_data_file_path

系统表空间数据文件的名称、大小和属性。默认为 12M,很多场景不适合,建议设置为 1G。

innodb_log_files_in_group

Redo Log 的个数,MySQL 以循环的方式写入 Redo Log 到这些文件。建议是指 2 或者大于 2 的值。

innodb_log_file_size

Redo Log 的大小,默认 48M,建议设置为 1 或者 2G,因为过小可能会导致 Redo Log 频繁切换。

innodb_file_per_table

是否开启独立表空间,建议设置为 1,即开启独立表空间。独立表空间,每一张表都会有独立的表空间文件,碎片率低,方便维护。

innodb_lock_wait_timeout

InnoDB 行锁等待时间,默认 50 秒,发生锁等待超时时,当前语句会回滚

gtid_mode=on

是否启用基于 GTID 的日志记录,以及日志可以包含的事务类型。可设置的值如下:

  • OFF: 新的事务和复制的事务都必须是匿名的。
  • OFF_PERMISSIVE: 新事务是匿名的。复制的事务可以是匿名事务或 GTID 事务。
  • ON_PERMISSIVE: 新事务是 GTID 事务。复制的事务可以是匿名事务或 GTID 事务。
  • ON:新事务和复制事务都必须是 GTID 事务。

建议设置为 ON。

enforce_gtid_consistency=on

是否允许违反 GTID 一致性,有以下值可以设置:

  • OFF:允许所有事务违反 GTID 一致性。
  • ON: 不允许任何事务违反 GTID 一致性。
  • WARN:允许所有事务违反 GTID 一致性,但在这种情况下会生成警告。

建议设置成 ON,保证基于 GTID 的复制时,主从数据一致。

这些就是 MySQL 8.0 的一些重要参数,当然,可能并不完整,朋友们可以通过文章底部的“发消息”进行补充或者参与讨论。

0 人点赞