前几天,一位【DBA驿站】星友去面试某互联网大厂DBA岗,被问到一个面试题:
MySQL部署的时候针对哪些参数进行过调整?
这一节内容,我们就针对这个面试题,来讲一下,MySQL建议调整的参数(主要针对MySQL 8.0)。文章最后,也会附上一个MySQL配置文件模板。
1 缓冲池大小和数量
innodb_buffer_pool_size
一般建议设置机器内存的60%-80%
innodb_buffer_pool_instances
InnoDB 缓冲池的区域数,如果配置大于 1 的值,要求 innodb_buffer_pool_size 的值大于或等于 1G。将缓冲池划分多个区域,可以减少不同线程读取和写入缓存页时的争用,可提高并发性。
2 最大连接数
max_connections
允许同时连接的最大客户端数,默认151,通常建议设置 1000 以上,当然也看具体配置。
3 Binlog相关参数
一定要保证Binlog开启的,比如:
log-bin = /data/mysql/binlog/mysql-bin
其中:
/data/mysql/binlog/表示Binlog的路径;
mysql-bin表示Binlog文件的前缀。
Binlog格式:
binlog_format = row
Binlog大小:
max_binlog_size=1G
Binlog有效期:之前的版本是设置:
expire_logs_days
表示二进制日志文件保留的天数。
8.0官方建议配置另外一个参数:
binlog_expire_logs_seconds
表示Binlog以秒为单位的有效期,过期后,Binlog会自动删除。
log_slave_updates
表示从库从主库同步数据时,是否也写入从库自己的 Binlog。
级联(A->B->C)情况下,中间的机器(B)必须要开启。
通常建议都开启。这里要注意的是,从 MySQL 8.0.26,该参数改为了:
log_replica_updates
4 数据目录
datadir
一般建议给MySQL配置单独的数据盘。
5 服务ID
server_id
主从或者 MGR 架构,需要将所有成员的 server id 设置成不一样。
建议是设置成IP后两位。
比如IP是192.168.95.27,那server_id就配置成9527。
6 只读
read_only
主库关闭 read_only;
从库视架构而定,通常从库建议开启 read_only。
7 双一参数
sync_binlog
innodb_flush_log_at_trx_commit
数据重要的,设置为双一;
数据相对不重要,比如日志数据库,性能优先的,设置为100、2;
8 开启GTID
gtid_mode=on
开启GTID。
enforce_gtid_consistency=on
表示不允许事务违反GTID一致性。
9 采用独立表空间
innodb_file_per_table = 1
每一张表都会有独立的表空间文件,这样碎片率更低,也方便维护。
10 不区分大小写
lower_case_table_names = 1
建议设置为1,不区分大小写。
11 IO操作数控制
innodb_io_capacity
控制每秒可用于 InnoDB 后台任务的 I/O 数,也就是 IOPS。
比如缓冲池中的页面刷新,或者合并来自更改缓冲区的数据。
如果是 SSD,可设置 5000 以上。
有印象的朋友应该知道,我们在8.4刚出来的时候,还说过官方把默认值改了,可以点击跳转当时写的:MySQL 8.4新特性速览。
默认值改成了10000,之前是200。
毕竟现在数据库基本都用上了SSD。
另外还有一个参数
innodb_io_capacity_max
如果刷新操作落后,InnoDB会更积极的进行刷新,每秒IO操作数可能会高于innodb_io_capacity变量定义的速率。
innodb_io_capacity_max定义了这种情况下InnoDB后台任务执行的IOPS最大数量。
12 重做日志相关
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 频繁切换。
13 慢查询相关
slow_query_log = 1
8.0 版本下,默认也是关闭 Slow Log 的,如果要开启,需要将 slow_query_log 设置为 1。
slow_query_log_file = /data/mysql/log/mysql-slow.log
定义慢查询的路径和文件名。
long_query_time
查询超过多少秒,则会记录到慢查询日志中,通常建议设置为 1,如果业务要求 MySQL 有更高的 QPS,则可以设置为 0.1 秒,发现慢查询及时优化。
14 连接超时
wait_timeout
关闭非交互连接之前等待活动的秒数,默认 28800 秒,也就是 8 小时,建议设置小一点,防止空闲连接过多,比如设置为:3600。
通过MySQL客户端连接数据库是交互式连接,通过JDBC连接数据库是非交互式连接。
interactive_timeout
关闭交互式连接之前等待活动的秒数,默认也是 28800 秒。也建议设置的小一点,比如 3600。
15 事务隔离级别
transaction_isolation
默认为 REPEATABLE-READ,互联网场景很多都设置为READ-COMMITTED。
如果能接受幻读,业务可能是高并发的场景,可以配置成 RC;
如果不能接受幻读,就设置成 RR 隔离级别。
16 InnoDB行锁等待时间
innodb_lock_wait_timeout
InnoDB 行锁等待时间,默认 50 秒,发生锁等待超时时,当前事务会回滚。
17 死锁信息记录在错误日志里
innodb_print_all_deadlocks
设置为 on或者1,表示死锁信息就会记录在错误日志里。
如果不开启这个参数,我们只能通过下面的命令记录最后一个死锁的信息:
show engine innodb status\G
18 配置文件举例(针对8.0)
[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
max_binlog_size = 1G
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 = 1
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 = 1000
wait_timeout = 3600
interactive_timeout = 3600
table_open_cache = 4096
thread_cache_size = 64
thread_stack = 192K
transaction_isolation = READ-COMMITTED #
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 = 1
innodb_read_io_threads = 8
innodb_write_io_threads = 4
innodb_io_capacity = 10000
innodb_io_capacity_max = 12000
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
另外,从今天开始到11月11日,【DBA驿站】将开启双十一活动。
1 新用户可以领双十一活动优惠券,立减60,券后68。
2 老用户这期间续费5折(64元)。
关注公众号
回复“复制”,可以获取小编编写的69页MySQL主从复制PDF;
回复“DBA面试题”,可获取36个DBA高频面试题及解析;
回复“社群”,可加入MySQL交流群。