MySQL 常用配置说明

环境信息

  • mysql 5.7

默认配置文件路径: /etc/my.cnf

##############通用配置##############
user = mysql
port = 3306
default_storage_engine = InnoDB
## 只读
read_only=1

## 跳过域名解析参数,禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。
## 但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
skip-name-resolve

## 跳过授权,重置密码时需要
## 重置密码:update mysql.user set authentication_string=password('Password@123') where user='root';
skip-grant-tables

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

## 解决日志中因wait-timeout的报错:
## Aborted connection 40476 to db: '' user: '' host: '' (Got an error reading communication packets)
log_warnings=1

### 连接错误超过此值,客户端无法连接,即拉黑
max_connect_errors = 1000

###########主从配置选项###########
server-id = 1
# 主库要生成的二进制日志文件名称
log-bin = mysql-bin

## 从库中继日志名称
relay-log = mysql-relay-bin

################
## sync_binlog = 0 表示MySQL 不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。
## 这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。
## sync_binlog>0 表示每N个sync_binlog次事务提交,MySQL调用文件系统的刷新操作将缓存刷下去。
## 最安全的就是sync_binlog=1了,表示每次事务提交,MySQL都会把binlog刷下去,是最安全但是性能损耗最大的设置。这样的话,在数据库所在的主机操作系统损坏或者突然掉电的情况下,系统才有可能丢失1个事务的数据。
## 但是binlog虽然是顺序IO,但是设置sync_binlog=1,多个事务同时提交,同样很大的影响MySQL和IO性能。
## 对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。
## 只适用于主库的二进制日志,不适用中继日志
################
sync_binlog=0

## 要同步的库.应该在从库上尽可能的使用replicate_wild_*,不建议在主库上使用
binlog-do-db = rtzc_pnc_base

# 不同步的数据库,应该在从库上尽可能的使用replicate_wild_*
binlog-ignore-db = mysql

### 应该在从库上尽可能的使用replicate_wild_*
#replicate-wild-ignore-table=db.*
#replicate-wild-ignore-table=mysql.*
#replicate-wild-ignore-table=information_schema.*
#replicate-wild-ignore-table=performance_schema.*
#replicate-wild-ignore-table=sys.*
#replicate_wild_do_table=DB_NAME.%
#replicate_ignore_db=test

###复制实现模式/级别
binlog_format=statement/row/mixed

# binlog日志大于此值是重新生成新的日志,默认(最大)1G,若使用大事务,日志可能会超过此值
max_binlog_size = 100M

# bilog日志保存天数,过期后清除
expire_logs_days = 7

# 跳过某些同步错误号
slave-skip-errors = 1032,1062

### 从库需要记录binlog,如级联从库场景,级联从库必须有此参数
log-slave-updates=1

# 阻止slave自动启动复制
skip_slave_start

# 从库发现和主库连接失败后,重连等待的时间,默认1小时
slave_net_timeout = 1

# 在从库上同步状态文件到磁盘,默认10000,表示在10000个事务执行完成后,将信息同步到磁盘
# 打开后,可能会降低IO性能,设置为1最安全,但是IO性能最差;设置为0,由OS控制刷新
sync_master_info | sync_relay_log | sync_relay_log_info = 1

# SQL线程重放完一个中继日志后尽快将其删除
relay_log_purge = 1

# 所有中继日志大小和的最大值。可防止主从延迟很大时,IO线程写relay log,导致磁盘空间不足。中继日志总和超过此值,IO线程会停止,等待SQL线程释放空间;
# 风险是从库未从主库读取所有relaylog,这些日志可能在主库崩溃时丢失,磁盘空间足够的情况下,不推荐配置
relay_log_space_limit = 1G


#########日志选项###########
slow_query_log =1
long_query_time=2
slow_query_log_file=/var/lib/mysql/slow.log

log-error=/var/log/mysqld.log

##########编码选项######
character-set-server = utf8
collation-server=utf8_general_ci

#############连接选项#############

# 客户端的连接闲置的最大时间,默认8小时,设置非交互模式(jdbc)时的超时时间
wait-timeout = 60

# 交互模式超时时间
interactive_timeout = 60

# 并发连接数,最终值由open_files_limit共同决定
max_connections=65535

# 一个账号最大可发起多少并发连接
max_user_connections=65535


#############性能选项#############

# 缓存的表个数,可以观察Opened_tables状态变量值,若很大(若经常需要创建/删除临时表,该计数器也会不停增长),建议增加此配置值,由OS rlimit共同决定
table_open_cache = 65535

# 缓存的线程个数,具体配置值可以观察Threads_created状态变量,如果此值较大,可加大thread_cache_size,建议此值保持足够大
thread_cache_size = 5000

# 查询缓存使用的内存大小,启动时,一次性分配
query_cache_size = 1024M

# 查询需排序时分配内存,立即分配指定的全部内存,无论是否需要这么多
sort_buffer_size = 10k

# 需要在服务启动程序(/usr/lib/systemd/system/mysqld.service)中配置:LimitNOFILE = 65535
open_files_limit = 65535

max_allowed_packet = 200M
innodb_open_files = 65535

# 默认值一般都太小,此值建议配置为os和其他应用消耗的内存除外的内存大小
# 配置太大也会导致预热和关闭花费较多时间
innodb_buffer_pool_size = 20G

# 事务日志的文件大小,太小,InnoDB必须做更多检查点,导致更多日志写,不利于IO。日志缓存满,事务提交或每秒,会刷新缓存到磁盘;
# 可以观察show innodb status中log部分,Innodb_os_log_written查看写入了多少数据
innodb_log_file_size = (32-128)M


innodb_flush_log_at_trx_commit = N
########## innodb特有参数,事务日志用于在mysql崩溃后的恢复
# N=0 每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
# 在这种情况下,MySQL性能最好,但如果 mysqld 进程崩溃,通常会导致最后 1s 的日志丢失。

# N=1 每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;每次事务提交时,log buffer 会被写入到日志文件并刷写到磁盘。
# 这也是默认值。这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以也最慢。

# N=2 当取值为2 时,每次事务提交会写入日志文件,但并不会立即刷写到磁盘,日志文件会每秒刷写一次到磁盘。
# 这时如果 mysqld 进程崩溃,由于日志已经写入到系统缓存,所以并不会丢失数据;在操作系统崩溃的情况下,通常会导致最后 1s 的日志丢失。
# 对于一些数据一致性和完整性要求不高的应用,配置为 2 就足够了;如果为了最高性能,可以设置为 0。有些应用,如支付服务,对一致性和完整性要求很高,所以即使最慢,也最好设置为 1.
##########

# 限制一次性可以有多少线程进入内核,建议值:cpu数量* 磁盘数量* 2,进入内核的线程超过此值,新线程无法进入。
# 为使线程高效进入内核,线程第一次休眠innodb_thread_sleep_delay(默认10000)微秒,然后重试,若依然不能进入内核,则放入一个等待线程队列,由OS内核处理。
# 在高并发环境或大量小查询时,可减小此值。
innodb_thread_concurrency = 64

# 一旦线程进入内核,可以有指定数量的tickents,再次进入内核时,可不在做并发检查,按照查询授权,而非事务
innodb_concurrency_tickets = 10

# 多少个线程可以在同一时间提交事务,太小会有线程冲突
innodb_commit_concurrency = 100

# 指定磁盘IO能力,默认为100,使用SSD或IO性能好的磁盘时,建议提高此值
innodb_io_capacity = 1000

# 控制后台由多少线程负责IO操作,默认为4
innodb_read_io_threads | innodb_write_io_threads = 10