mysql 5.7配置项最详细的解释

配置样例

首先提供一个我使用的配置样例mysql

[client]  
#password=88888888  
socket=/data/var/mysql/mysql.sock  
  
[mysqld_safe]  
pid-file=/data/var/mysql/mysqld.pid  
log-error = /data/local/mysql-5.7.19/log/mysql-error.log  
  
[mysql]  
socket=/data/var/mysql/mysql.sock  
  
[mysqld]  
user = mysql  
port = 31306  
datadir = /data/var/mysql  
socket=/data/var/mysql/mysql.sock  
symbolic-links=0  
########basic settings########  
server-id = 11  
#bind_address = 10.166.224.32  
autocommit = 1  
character_set_server=utf8mb4  
skip_name_resolve = 1  
max_connections = 800  
max_connect_errors = 100  
transaction_isolation = READ-COMMITTED  
explicit_defaults_for_timestamp = 1  
join_buffer_size = 128M  
tmp_table_size = 128M  
tmpdir = /dev/shm  
max_allowed_packet = 16M  
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"  
interactive_timeout = 60  
wait_timeout = 60  
read_buffer_size = 16M  
read_rnd_buffer_size = 32M  
sort_buffer_size = 32M  
########log settings########  
#log_error = /data/local/mysql-5.7.19/log/mysql-error.log  
slow_query_log = 1  
slow_query_log_file = /data/local/mysql-5.7.19/log/mysql-slow.log  
log_queries_not_using_indexes = 1  
log_slow_admin_statements = 1  
log_slow_slave_statements = 1  
log_throttle_queries_not_using_indexes = 10  
expire_logs_days = 90  
long_query_time = 1  
min_examined_row_limit = 100  
########replication settings########  
#master_info_repository = TABLE  
#relay_log_info_repository = TABLE  
log_bin = /data/local/mysql-5.7.19/log/mysql-bin  
#sync_binlog = 4  
gtid_mode = on  
enforce_gtid_consistency = 1  
#log_slave_updates  
binlog_format = row  
#relay_log = /data/local/mysql-5.7.19/log/mysql-relay.log  
#relay_log_recovery = 1  
#binlog_gtid_simple_recovery = 1  
#slave_skip_errors = ddl_exist_errors  
########innodb settings########  
innodb_page_size = 16K  
innodb_buffer_pool_size = 4G  
#innodb_buffer_pool_instances = 8  
#innodb_buffer_pool_load_at_startup = 1  
#innodb_buffer_pool_dump_at_shutdown = 1  
#innodb_lru_scan_depth = 2000  
innodb_lock_wait_timeout = 5  
#innodb_io_capacity = 4000  
#innodb_io_capacity_max = 8000  
#innodb_flush_method = O_DIRECT  
#innodb_log_group_home_dir = /data/local/mysql-5.7.19/log/redolog/  
#innodb_undo_directory = /data/local/mysql-5.7.19/log/undolog/  
#innodb_undo_logs = 128  
#innodb_undo_tablespaces = 0  
#innodb_flush_neighbors = 1  
#innodb_log_file_size = 4G  
#innodb_log_buffer_size = 16M  
#innodb_purge_threads = 4  
innodb_large_prefix = 1  
innodb_thread_concurrency = 64  
#innodb_print_all_deadlocks = 1  
#innodb_strict_mode = 1  
innodb_sort_buffer_size = 64M  
########semi sync replication settings########  
#plugin_dir=/data/local/mysql-5.7.19/lib/plugin  
#plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"  
#loose_rpl_semi_sync_master_enabled = 1  
#loose_rpl_semi_sync_slave_enabled = 1  
#loose_rpl_semi_sync_master_timeout = 5000  
  
[mysqld-5.7]  
#innodb_buffer_pool_dump_pct = 40  
innodb_page_cleaners = 4  
#innodb_undo_log_truncate = 1  
#innodb_max_undo_log_size = 2G  
#innodb_purge_rseg_truncate_frequency = 128  
#binlog_gtid_simple_recovery=1  
log_timestamps=system  
#transaction_write_set_extraction=MURMUR32  
#show_compatibility_56=on  

详细解释

[client]

#password=88888888

mysql默认密码

socket=/data/var/mysql/mysql.sock

mysql以socket方式运行的sock文件位置
 
[mysqld_safe]

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

错误日志位置

pid-file=/var/run/mysqld/mysqld.pid

进程id文件
 
[mysql]

socket=/data/var/mysql/mysql.sock

mysql以socket方式运行的sock文件位置
 
[mysqld]

user = mysql

mysql以什么用户运行

port = 31306

mysql运行在哪一个端口

datadir = /data/var/mysql/

mysql的数据目录

socket=/data/var/mysql/mysql.sock

mysql以socket方式运行的sock文件位置

symbolic-links=0

是否支持符号连接,即数据库或表能够存储在my.cnf中指定datadir以外的分区或目录,为0不开启
 
########basic settings########

server-id = 11

mysql的服务器分配id,在启用主从和集群的时候必须指定,每一个节点必须不一样

#bind_address = 10.166.224.32

mysql监听的ip地址,若是是127.0.0.1,表示仅本机访问

autocommit = 1

数据修改是否自动提交,为0不自动提交

character_set_server=utf8mb4

服务器使用的字符集

skip_name_resolve = 1

禁用DNS主机名查找,启用之后用内网地址向mysqlslap请求响应快了一半

max_connections = 800

mysql最大链接数

max_connect_errors = 1000

某台host链接错误次数等于max_connect_errors(默认10) ,主机'host_name'再次尝试时被屏蔽。可有效反的防止dos攻击

transaction_isolation = READ-COMMITTED

数据库事务隔离级别
1.READ-UNCOMMITTED(读取未提交内容)级别
2. READ-COMMITTED(读取提交内容)
3. REPEATABLE-READ(可重读)
4.SERIERLIZED(可串行化)
默认级别REPEATABLE-READ

explicit_defaults_for_timestamp = 1

mysql中TIMESTAMP类型和其余的类型有点不同(在没有设置explicit_defaults_for_timestamp=1的状况下)

join_buffer_size = 128M

当咱们的join是ALL,index,rang或者Index_merge的时候使用的buffer。 实际上这种join被称为FULL JOIN

tmp_table_size = 128M

规定了内部内存临时表的最大值,每一个线程都要分配。(实际起限制做用的是tmp_table_size和max_heap_table_size的最小值。)若是内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下

tmpdir = /dev/shm/mysql-tmp/

保存临时文件的目录

max_allowed_packet = 16M

mysql最大接受的数据包大小

sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"

sql_mode 模式,定义了你MySQL应该支持的sql语法,对数据的校验等等,限制一些所谓的‘不合法’的操做

interactive_timeout = 60

服务器关闭交互式链接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端

wait_timeout = 60

服务器关闭非交互链接以前等待活动的秒数,在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的链接选项CLIENT_INTERACTIVE定义)

read_buffer_size = 16M

读入缓冲区的大小,将对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区

read_rnd_buffer_size = 32M

随机读缓冲区大小,当按任意顺序读取行时(列如按照排序顺序)将分配一个随机读取缓冲区,进行排序查询时,MySQL会首先扫描一遍该缓冲,以免磁盘搜索,提升查询速度

sort_buffer_size = 32M

是一个connection级参数,在每一个connection第一次须要使用这个buffer的时候,一次性分配设置的内存
 
########log settings########

#log_error = /data/local/mysql-5.7.19/log/mysql-error.log

错误日志位置

slow_query_log = 1

是否开启慢查询日志收集

slow_query_log_file = /data/local/mysql-5.7.19/log/mysql-slow.log

慢查询日志位置

log_queries_not_using_indexes = 1

是否记录未使用索引的语句

log_slow_admin_statements = 1

慢查询也记录那些慢的optimize table,analyze table和alter table语句

log_slow_slave_statements = 1

记录由Slave所产生的慢查询

log_throttle_queries_not_using_indexes = 10

设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间

expire_logs_days = 90

日志自动过时清理天数

long_query_time = 1

设置记录慢查询超时时间

min_examined_row_limit = 100

查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
 
########replication settings########

#master_info_repository = TABLE

从机保存主节点信息方式,设成file时 会生成master.info 和 relay-log.info2个文件,设成table,信息就会存在mysql.master_slave_info表中。无论是设置的哪一种值,都不要移动或者编辑相关的文件和表

#relay_log_info_repository = TABLE

用于保存slave读取relay log的位置信息,可选值为“FILE”、“TABLE”,以便crash重启后继续恢复

log_bin = /data/local/mysql-5.7.19/log/mysql-bin

binlog的保存位置,不能指定肯定的文件名如mysql-bin.log,只能指定位置和前缀,会生成之前缀为开头的一系列文件

#sync_binlog = 4

这个参数是对于MySQL系统来讲是相当重要的,他不只影响到Binlog对MySQL所带来的性能损耗,并且还影响到MySQL中数据的完整性。对于“sync_binlog”参数的各类设置的说明以下:
sync_binlog=0,当事务提交以后,MySQL不作fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定何时来作同步,或者cache满了以后才同步到磁盘。
sync_binlog=n,当每进行n次事务提交以后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
在MySQL中系统默认的设置是sync_binlog=0,也就是不作任何强制性的磁盘刷新指令,这时候的性能是最好的,可是风险也是最大的。由于一旦系统Crash,在binlog_cache中的全部binlog信息都会被丢失。而当设置为“1”的时候,是最安全可是性能损耗最大的设置。由于当设置为1的时候,即便系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于高并发事务的系统来讲,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。

gtid_mode = on

启用gtid类型,不然就是普通的复制架构

enforce_gtid_consistency = 1

强制GTID的一致性

#log_slave_updates

slave更新是否记入日志,在作双主架构时异常重要,影响到双主架构是否能互相同步

binlog_format = row

binlog日志格式,可选值“MIXED”、“ROW”、“STATEMENT”,在5.6版本以前默认为“STATEMENT”,5.6以后默认为“MIXED”;由于“STATEMENT”方式在处理一些“不肯定”性的方法时会形成数据不一致问题,咱们建议使用“MIXED”或者“ROW”

#relay_log = /data/local/mysql-5.7.19/log/mysql-relay.log

从机保存同步中继日志的位置

#relay_log_recovery = 1

当slave从库宕机后,假如relay-log损坏了,致使一部分中继日志没有处理,则自动放弃全部未执行的relay-log,而且从新从master上获取日志,这样就保证了relay-log的完整性

#binlog_gtid_simple_recovery = 1

这个参数控制了当mysql启动或重启时,mysql在搜寻GTIDs时是如何迭代使用binlog文件的。 这个选项设置为真,会提高mysql执行恢复的性能。由于这样mysql-server启动和binlog日志清理更快

#slave_skip_errors = ddl_exist_errors

跳过指定error no类型的错误,设成all 跳过全部错误
 
########innodb settings########

innodb_page_size = 16K

innodb每一个数据页大小,这个参数在一开始初始化时就要加入my.cnf里,若是已经建立了表,再修改,启动MySQL会报错

innodb_buffer_pool_size = 4G

缓存innodb表的索引,数据,插入数据时的缓冲,专用mysql服务器设置的大小: 操做系统内存的70%-80%最佳

#innodb_buffer_pool_instances = 8

能够开启多个内存缓冲池,把须要缓冲的数据hash到不一样的缓冲池中,这样能够并行的内存读写

#innodb_buffer_pool_load_at_startup = 1

默认为关闭OFF。若是开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中

#innodb_buffer_pool_dump_at_shutdown = 1

默认为关闭OFF。若是开启该参数,中止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘

#innodb_lru_scan_depth = 2000

根据 官方文档 描述,它会影响page cleaner线程每次刷脏页的数量, 这是一个每1秒 loop一次的线程

innodb_lock_wait_timeout = 5

事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒

#innodb_io_capacity = 4000
#innodb_io_capacity_max = 8000

这两个设置会影响InnoDB每秒在后台执行多少操做. 大多数写IO(除了写InnoDB日志)是后台操做的. 若是你深度了解硬件性能(如每秒能够执行多少次IO操做),则使用这些功能是很可取的,而不是让它闲着

#innodb_flush_method = O_DIRECT

默认值为 fdatasync. 若是使用 硬件RAID磁盘控制器, 可能须要设置为 O_DIRECT. 这在读取InnoDB缓冲池时可防止“双缓冲(double buffering)”效应,不然会在文件系统缓存与InnoDB缓存间造成2个副本(copy). 若是不使用硬件RAID控制器,或者使用SAN存储时, O_DIRECT 可能会致使性能降低

#innodb_log_group_home_dir = /data/local/mysql-5.7.19/log/redolog/

innodb重作日志保存目录

#innodb_undo_directory = /data/local/mysql-5.7.19/log/undolog/

innodb回滚日志保存目录

#innodb_undo_logs = 128

undo回滚段的数量, 至少大于等于35,默认128

#innodb_undo_tablespaces = 0

用于设定建立的undo表空间的个数,在mysql_install_db时初始化后,就不再能被改动了;默认值为0,表示不独立设置undo的tablespace,默认记录到ibdata中;不然,则在undo目录下建立这么多个undo文件,例如假定设置该值为4,那么就会建立命名为undo001~undo004的undo tablespace文件,每一个文件的默认大小为10M。修改该值会致使Innodb没法完成初始化,数据库没法启动,可是另两个参数能够修改

#innodb_flush_neighbors = 1

InnoDB存储引擎在刷新一个脏页时,会检测该页所在区(extent)的全部页,若是是脏页,那么一块儿刷新。这样作的好处是经过AIO能够将多个IO写操做合并为一个IO操做。对于传统机械硬盘建议使用,而对于固态硬盘能够关闭。

#innodb_log_file_size = 4G

这个值定义了日志文件的大小,innodb日志文件的做用是用来保存redo日志。一个事务对于数据或索引的修改每每对应到表空间中的随机的位置,所以当刷新这些修改到磁盘中就会引发随机的I/O,而随机的I/O每每比顺序的I/O更加昂贵的开销,由于随机的I/O须要更多的开销来定位到指定的位置。innodb使用日志来将随机的I/O转为顺序的I/O,只要日志文件是安全的,那么事务就是永久的,尽管这些改变尚未写到数据文件中,若是出现了当机或服务器断电的状况,那么innodb也能够经过日志文件来恢复以及提交的事务。可是日志文件是有必定的大小的,因此必需要把日志文件记录的改变写到数据文件中,innodb对于日志文件的操做是循环的,即当日志文件写满后,会将指针从新移动到文件开始的地方从新写,可是它不会覆盖那些尚未写到数据文件中的日志,由于这是惟一记录了事务持久化的记录
若是对 Innodb 数据表有大量的写入操做,那么选择合适的 innodb_log_file_size 值对提高MySQL性能很重要。然而设置太大了,就会增长恢复的时间,所以在MySQL崩溃或者忽然断电等状况会令MySQL服务器花很长时间来恢复

#innodb_log_buffer_size = 16M

事务在内存中的缓冲。 分配原 则:控制在2-8M.这个值不用太多的。他里面的内存通常一秒钟写到磁盘一次

#innodb_purge_threads = 4

控制是否使用,使用几个独立purge线程(清除二进制日志)

innodb_large_prefix = 1

mysql在5.6以前一直都是单列索引限制767,原由是256×3-1。这个3是字符最大占用空间(utf8)。可是在5.6之后,开始支持4个字节的uutf8。255×4>767, 因而增长了这个参数。这个参数默认值是OFF。当改成ON时,容许列索引最大达到3072

innodb_thread_concurrency = 64

InnoDB kernel并发最大的线程数。 1) 最少设置为(num_disks+num_cpus)*2。 2) 能够经过设置成1000来禁止这个限制

#innodb_print_all_deadlocks = 1

是否将死锁相关信息保存到MySQL 错误日志中

#innodb_strict_mode = 1

开启InnoDB严格检查模式,尤为采用了页数据压缩功能后,最好是开启该功能。开启此功能后,当建立表(CREATE TABLE)、更改表(ALTER TABLE)和建立索引(CREATE INDEX)语句时,若是写法有错误,不会有警告信息,而是直接抛出错误,这样就可直接将问题扼杀在摇篮里

innodb_sort_buffer_size = 64M

ORDER BY 或者GROUP BY 操做的buffer缓存大小

########semi sync replication settings########

#plugin_dir=/data/local/mysql-5.7.19/lib/plugin

指定mysql的插件目录

#plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

指定载入哪些插件

#loose_rpl_semi_sync_master_enabled = 1

控制主库上是否开启semisync

#loose_rpl_semi_sync_slave_enabled = 1

控制备库是否开启semisync

#loose_rpl_semi_sync_master_timeout = 5000

单位毫秒,防止半同步复制在没有收到确认的状况下,发送堵塞。master在超时以前没有收到确认,将恢复到异步复制,继续执行半同步没有进行的操做
 
[mysqld-5.7]

#innodb_buffer_pool_dump_pct = 40

表示转储每一个bp instance LRU上最热的page的百分比。经过设置该参数能够减小转储的page数

innodb_page_cleaners = 4

为了提高扩展性和刷脏效率,在5.7.4版本里引入了多个page cleaner线程。从而达到并行刷脏的效果
在该版本中,Page cleaner并未和buffer pool绑定,其模型为一个协调线程 + 多个工做线程,协调线程自己也是工做线程。所以若是innodb_page_cleaners设置为8,那么就是一个协调线程,加7个工做线程

#innodb_undo_log_truncate = 1

是否开启在线回收(收缩)undo log日志文件,支持动态设置

#innodb_max_undo_log_size = 2G

当超过这个阀值(默认是1G),会触发truncate回收(收缩)动做,truncate后空间缩小到10M

#innodb_purge_rseg_truncate_frequency = 128

控制回收(收缩)undo log的频率。undo log空间在它的回滚段没有获得释放以前不会收缩, 想要增长释放回滚区间的频率,就得下降设定值

#binlog_gtid_simple_recovery=1

这个参数控制了当mysql启动或重启时,mysql在搜寻GTIDs时是如何迭代使用binlog文件的。 这个选项设置为真,会提高mysql执行恢复的性能。由于这样mysql-server启动和binlog日志清理更快。该参数为真时,mysql-server只需打开最老的和最新的这2个binlog文件

log_timestamps=system

在MySQL 5.7.2 新增了 log_timestamps 这个参数,该参数主要是控制 error log、genera log,等等记录日志的显示时间参数。 在 5.7.2 以后改参数为默认 UTC 这样会致使日志中记录的时间比中国这边的慢,致使查看日志不方便。修改成 SYSTEM 就能解决问题

#transaction_write_set_extraction=MURMUR32

这个神奇的参数5.7.6版本引入,用于定义一个记录事务的算法,这个算法使用hash标识来记录事务。若是使用MGR,那么这个hash值须要用于分布式冲突检测何处理,在64位的系统,官网建议设置该参数使用 XXHASH64 算法。若是线上并无使用该功能,应该设为off

#show_compatibility_56=on

从mysql5.7.6开始information_schema.global_status已经开始被舍弃,为了兼容性,此时须要打开 show_compatibility_56
 
#table_open_cache = 512
table_open_cache指定表高速缓存的大小。每当MySQL访问一个表时,若是在表缓冲区中还有空间,该表就被打开并放入其中,这样能够更快地访问表内容。
经过检查峰值时间的状态值Open_tables和Opened_tables,能够决定是否须要增长table_open_cache的值。
可经过 SHOW GLOBAL STATUS LIKE 'Open%tables'; 得到

 

注意,不能盲目地把table_open_cache设置成很大的值,设置太大超过了shell的文件描述符(经过ulimit -n查看),形成文件描述符不足,从而形成性能不稳定或者链接失败。算法

相关文章
相关标签/搜索