建议收藏:让MySQL更安全、更高效的参数设置指南

科技   2024-10-30 15:01   上海  

前几天,一位【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 = 3306socket = /tmp/mysql.sock
[mysqld]port = 3306socket = /tmp/mysql.sock
## dir setdatadir = /data/mysql/datainnodb_data_home_dir = /data/mysql/datainnodb_log_group_home_dir = /data/mysql/datalog-bin = /data/mysql/binlog/mysql-binmax_binlog_size = 1G
log_bin_index = /data/mysql/binlog/mysql-bin.index relay-log = /data/mysql/binlog/mysql-relay-bintmpdir = /data/mysql/tmpdirslow_query_log_file = /data/mysql/log/mysql-slow.loggeneral_log_file = /data/mysql/log/mysql-general.loglog-error = /data/mysql/log/mysql.err
## slave and binlogserver_id = 6666 skip-slave-start = 0 read_only = 0 binlog_format = row log_slave_updates = 1master_info_repository = tablerelay_log_info_repository = tablerelay_log_purge = 1relay_log_recovery = 1sync_binlog = 1
binlog_cache_size = 1Mbinlog_expire_logs_seconds = 2592000log_bin_trust_function_creators = 1 slave_net_timeout=60 #binlog_error_action="IGNORE_ERROR"
innodb_autoinc_lock_mode=1
## back_log = 200bulk_insert_buffer_size = 8M #character-set-server = utf8lower_case_table_names = 1
## 基线local-infile = offskip-networking = offskip-name-resolve = on
## connectmax_allowed_packet = 32Mmax_connect_errors = 1000max_connections = 1000wait_timeout = 3600 interactive_timeout = 3600
table_open_cache = 4096thread_cache_size = 64thread_stack = 192Ktransaction_isolation = READ-COMMITTED # pid-file = mysql.pid
## slowslow_query_log = 1 long_query_time = 1log_slow_admin_statementslog_queries_not_using_indexes = 0slow_launch_time = 1read_buffer_size = 4M read_rnd_buffer_size = 8M sort_buffer_size = 8Mjoin_buffer_size = 32Mtmp_table_size = 128Mmax_heap_table_size = 128M
default_storage_engine = innodbexplicit_defaults_for_timestamp = on
## innodbinnodb_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 = 10000innodb_io_capacity_max = 12000innodb_lru_scan_depth = 1024innodb_use_native_aio = 1innodb_flush_neighbors = 1innodb_buffer_pool_load_at_startup = 1innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path=ibdata:1G:autoextendinnodb_log_files_in_group = 3innodb_log_file_size = 2Ginnodb_file_per_table = 1
innodb_flush_method = O_DIRECTinnodb_strict_mode = 1innodb_lock_wait_timeout = 30innodb_log_buffer_size = 16Minnodb_adaptive_flushing = 1innodb_change_buffering = allinnodb_purge_threads = 4 innodb_purge_batch_size = 300
innodb_old_blocks_time = 1innodb_fast_shutdown = 0performance_schema = 1innodb_print_all_deadlocks = 1innodb_sort_buffer_size = 4M
innodb_page_size = 16kgtid_mode=onenforce_gtid_consistency=on
table_open_cache_instances=16binlog_rows_query_log_events=1

## pasworddefault_password_lifetime=0
[mysqldump]quickmax_allowed_packet = 32M
[mysql]no-auto-rehashprompt=\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交流群。

MySQL数据库联盟
关注后,回复“高可用”,可获取8篇MySQL高可用文章
 最新文章