my.cnf 配置文件参数解释

2023-06-09,,

my.cnf 配置文件参数解释
#*** client options 相关选项 ***#
#以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。
[client]
port = 3309
socket =  /usr/local/mysql/tmp/mysql.sock
[mysqld]
!include  /usr/local/mysql/etc/mysqld.cnf #包含的配置文件 ,把用户名,密码文件单独存放
port = 3309
bind-address = 0.0.0.0
server-id = 1 #表示是本机的序号为1,唯一
socket =  /usr/local/mysql/tmp/mysql.sock
pid-file =  /usr/local/mysql/var/mysql.pid
basedir =  /usr/local/mysql/
datadir =  /usr/local/mysql/var/
tmpdir =  /usr/local/mysql/tmp/ #此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表.如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好。另一种选择是你也可以将其放置在独立的磁盘上.你可以使用”;”来放置多个路径,他们会按照 roud-robin 方法被轮询使用.
slave-load-tmpdir =  /usr/local/mysql/tmp/ #当 slave 执行 load data infile 时用

#*** skip options 相关选项 ***#
skip-name-resolve #禁止 MySQL 对外部连接进行 DNS 解析,使用这一选项可以消除 MySQL 进行 DNS 解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用 IP 地址方式,否则 MySQL 将无法正常处理连接请求!
skip-symbolic-links #不能使用连接文件,多个客户可能会访问同一个数据库,因此这防止外部客户锁定 MySQL 服务器。 该选项默认开启

skip-external-locking #不使用系统锁定,要使用 myisamchk,必须关闭服务器 ,避免 MySQL的外部锁定,减少出错几率增强稳定性。
skip-slave-start #启动 mysql,不启动复制
skip-networking #开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式,如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项!否则将无法正常连接! 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 这样设置将是增强安全的方法
sysdate-is-now = 1 #把SYSDATE 函数编程为 NOW的别名

#*** 系统资源相关选项 ***#
back_log = 50 #接受队列,对于没建立 tcp 连接的请求队列放入缓存中,队列大小为 back_log,受限制与 OS 参数,试图设定 back_log 高于你的操作系统的限制将是无效的。默认值为 50。对于 Linux 系统推荐设置为小于512的整数。如果系统在一个短时间内有很多连接,则需要增大该参数的值
max_connections = 1000 #指定MySQL允许的最大连接进程数。如果在访问数据库时经常出现"Too Many Connections"的错误提 示,则需要增大该参数值。
max_connect_errors = 10000 #如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,直到管理员执行 flush hosts ; 命令或者服务重启, 防止黑客 , 非法的密码以及其他在链接时的错误会增加此值
open_files_limit = 10240 #MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections*5和ulimit-n的值,哪个大用哪个,当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个。
connect-timeout = 10 #连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间
wait-timeout = 28800 #等待关闭连接的时间
interactive-timeout = 28800 #关闭连接之前,允许 interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话 wait_timeout 变量被设为会话interactive_timeout 变量的值。如果前端程序采用短连接,建议缩短这2个值, 如果前端程序采用长连接,可直接注释掉这两个选项,默认配置(8小时)
slave-net-timeout = 600 #从服务器也能够处理网络连接中断。但是,只有从服务器超过slave_net_timeout 秒没有从主服务器收到数据才通知网络中断
net_read_timeout = 30 #从服务器读取信息的超时
net_write_timeout = 60 #从服务器写入信息的超时
net_retry_count = 10 #如果某个通信端口的读操作中断了,在放弃前重试多次
net_buffer_length = 16384 #包消息缓冲区初始化为 net_buffer_length 字节,但需要时可以增长到 max_allowed_packet 字节
max_allowed_packet = 64M# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB 字段一起工作时相当必要), 每个连接独立的大小.大小动态增加。 设置最大包,限制server接受的数据包大小,避免超长SQL的执行有问题 默认值为16M,当MySQL客户端或mysqld
服务器收到大于 max_allowed_packet 字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与 MySQL 服务器的连接”错误。默认值 16M。
table_cache = 512 # 所有线程所打开表的数量. 增加此值就增加了mysqld所需要的文件描述符的数量这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096
thread_stack = 192K # 线程使用的堆大小. 此容量的内存在每次连接时被预留.MySQL 本身常不会需要超过 64K 的内存如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点.默认设置足以满足大多数应用
thread_cache_size = 20 # 我们在 cache 中保留多少线程用于重用.当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入 cache 中.这可以在你需要大量新连接的时候极大的减少线程创建的开销(一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用
根据物理内存设置规则如下:
1G  —> 8
2G  —> 16
3G  —> 32
大于3G  —> 64

thread_concurrency = 8 #此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有 2 颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为 4 × 2 = 8.设置 thread_concurrency的值的正确与否, 对 mysql 的性能影响很大, 在多个 cpu(或多核)的情况下,错误设置了 thread_concurrency 的值, 会导致 mysql 不能充分利用多 cpu(或多核),出现同一时刻只能一个 cpu(或核)在工作的情况。 thread_concurrency 应设为 CPU 核数的 2 倍.比如有一个双核的 CPU, 那么 thread_concurrency 的应该为 4; 2 个双核的 cpu,thread_concurrency 的值应为 8,属重点优化参数


#*** qcache settings 相关选项 ***#
query_cache_limit = 2M #不缓存查询大于该值的结果.只有小于此设定值的结果才会被缓冲,  此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_min_res_unit = 2K #查询缓存分配的最小块大小.默认是 4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过 20%,可以用 FLUSH QUERY CACHE 整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size *100%
查询缓存利用率在 25%以下的话说明 query_cache_size 设置的过大,可适当减小;查询缓存利用率在 80%以上而且 Qcache_lowmem_prunes > 50 的话说明 query_cache_size 可能有点小,要不就是碎片太多。查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
query_cache_size = 64M  #指定 MySQL 查询缓冲区的大小。可以通过在 MySQL 控制台执行以下命令观察:
代码:
> SHOW VARIABLES LIKE '%query_cache%';
> SHOW STATUS LIKE 'Qcache%';如果 Qcache_lowmem_prunes 的值非常大,则表明经常出现缓冲不够的情况;
如果 Qcache_hits 的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲; Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
memlock # 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度
紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out,此选项对于性能有益

#*** default settings 相关选项 ***#
default_table_type = InnoDB # 当创建新表时作为默认使用的表类型,如果在创建表示没有特别执行表类型,将会使用此值
default-time-zone = system #服务器时区
character-set-server = utf8 #server 级别字符集
default-storage-engine = InnoDB #默认存储引擎

#*** tmp && heap settings 相关选项 ***#
tmp_table_size = 512M #临时表的最大大小,如果超过该值,则结果放到磁盘中,此限制是针对单个表的,而不是总和.
max_heap_table_size = 512M #独立的内存表所允许的最大容量.此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.

#*** log settings 相关选项 ***#
log-bin = mysql-bin #打开二进制日志功能.在复制(replication)配置中,作为 MASTER 主服务器必须打开此项.如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.这些路径相对于 datadir
log_slave_updates = 1 #表示slave将复制事件写进自己的二进制日志
log-bin-index = mysql-bin.index #二进制的索引文件名
relay-log = relay-log #定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn(By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory);
relay_log_index = relay-log.index  #relay-log的索引文件名
log-warnings = 1 # 将警告打印输出到错误 log 文件.如果你对于MySQL有任何问题,你应该打开警告 log 并且仔细审查错误日志,查出可能的原因.
log-error =  /usr/local/mysql/log/mysql.err #错误日志路径
log_output = FILE #参数 log_output 指定了慢查询输出的格式,默认为 FILE,你可以将它设为 TABLE,然后就可以查询 mysql 架构下的 slow_log 表了
log_slow_queries #指定是否开启慢查询日志(该参数要被slow_query_log取代,做兼容性保留)
slow_query_log = 1 # 指定是否开启慢查询日志. 慢查询是指消耗了比 “long_query_time” 定义的更多时间的查询.如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,
long-query-time = 1 #设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s.所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).
log_long_format # 在慢速日志中记录更多的信息.一般此项最好打开,打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
slow_query_log_file =  /usr/local/mysql/log/slow.log # 指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
log-queries-not-using-indexes #如果运行的SQL语句没有使用索引,则mysql数据库同样会将这条SQL语句记录到慢查询日志文件中。
min_examined_row_limit=1000    #记录那些由于查找了多余1000次而引发的慢查询
long-slow-admin-statements    #记录那些慢的optimize table,analyze table和alter table语句
log-slow-slave-statements #记录由Slave所产生的慢查询
general_log = 1 #将所有到达MySQL Server的SQL语句记录下来,默认关闭
general_log_file =  /usr/local/mysql/log/mysql.log #general_log路径
max_binlog_size = 1G #如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。如果你正使用大的事务,二进制日志还会超过max_binlog_size
max_relay_log_size = 1G #标记relaylog允许的最大值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;
relay-log-purge = 1 #是否自动清空不再需要中继日志时。默认值为1(启用)
expire_logs_days = 30 #超过 30 天的 binlog 删除
binlog_cache_size = 1M # 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小,如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中,如果事务比此值大, 会使用磁盘上的临时文件来替代.此缓冲在每个连接的事务第一次更新状态时被创建.session 级别
replicate-wild-ignore-table = mysql.% #复制时忽略数据库及表
slave_skip_errors=all #定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。
slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
  默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
    一些error code代表的错误如下:
    1007:数据库已存在,创建数据库失败
    1008:数据库不存在,删除数据库失败
    1050:数据表已存在,创建数据表失败
    1051:数据表不存在,删除数据表失败
    1054:字段不存在,或程序文件跟数据库有冲突
    1060:字段重复,导致无法插入
    1061:重复键名
    1068:定义了多个主键
    1094:位置线程ID
    1146:数据表缺失,请恢复数据库
    1053:复制过程中主服务器宕机
    1062:主键冲突 Duplicate entry '%s' for key %d

#*** MyISAM 相关选项 ***#
key_buffer_size = 256M #指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。如果是以InnoDB引擎为主的DB,专用于MyISAM引擎的 key_buffer_size 可以设置较小,8MB 已足够  如果是以MyISAM引擎为主,可设置较大,但不能超过4G. 在这里,强烈建议不使用MyISAM引擎,默认都是用InnoDB引擎.注意:该参数值设置的过大反而会是服务器整体效率降低!
sort_buffer_size = 2M #查询排序时所能使用的缓冲区大小。排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序.一个用来替代的基于磁盘的合并分类会被使用.查看 “Sort_merge_passes” 状态变量. 在排序发生时由每个线程分配 注意:该参数对应的分配内存是每连接独占!如果有 100 个连接,那么实际分配的总共排序缓冲区大小为 100 × 6 =600MB,所以,对于内存在 4GB 左右的服务器推荐设置为 6-8M。
read_buffer_size = 2M #读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!用来做 MyISAM 表全表扫描的缓冲大小.当全表扫描需要时,在对应线程中分配.
join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!此缓冲被使用来优化全联合(full JOINs 不带索引的联合).类似的联合在极大多数情况下有非常糟糕的性能表现, 但是将此值设大能够减轻性能影响.通过 “Select_full_join”状态变量查看全联合的数量, 当全联合发生时,在每个线程中分配。
read_rnd_buffer_size = 8M #MyISAM 以索引扫描(Random Scan)方式扫描数据的 buffer大小
bulk_insert_buffer_size = 64M #MyISAM 使用特殊的类似树的 cache 来使得突发插入(这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATAINFILE) 更快. 此变量限制每个进程中缓冲树的字节数.设置为 0 会关闭此优化.为了最优化不要将此值设置大于 “key_buffer_size”.当突发插入被检测到时此缓冲将被分配MyISAM 用在块插入优化中的树缓冲区的大小。注释:这是一个 per thread 的限制 ( bulk 大量).此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE到一个空表中引起重建索引时被分配.这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 64M #MyISAM 设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE 或用 CREATE INDEX 创建索引或 ALTER TABLE 过程中排序 MyISAM 索引分配的缓冲区
myisam_max_sort_file_size = 10G#mysql重建索引时允许使用的临时文件最大大小
myisam_repair_threads = 1 #如果该值大于 1,在 Repair by sorting 过程中并行创建MyISAM 表索引(每个索引在自己的线程内).如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择.
myisam_recover = 64K#允许的 GROUP_CONCAT()函数结果的最大长度
transaction_isolation = REPEATABLE-READ # 设定默认的事务隔离级别.可用的级别如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE
1.READ UNCOMMITTED-读未提交 2.READ COMMITTE-读已提交 3.REPEATABLE READ -可重复读 4.SERIALIZABLE -串行

# *** INNODB 相关选项 ***#
skip-innodb # 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话,使用此选项会节省内存以及磁盘空间,并且加速某些部分
innodb_file_per_table = 1 # InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间
独立表空间优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(除drop table操作处,表空不能自已回收)
缺点:
1.单表增加过大,如超过100G
结论:
共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files
innodb_status_file = 1 #启用InnoDB的status file,便于管理员查看以及监控等
innodb_open_files = 2048 # 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300
innodb_additional_mem_pool_size = 100M #设置InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。 

innodb_buffer_pool_size = 2G #包括数据页、索引页、插入缓存、锁信息、自适应哈希所以、数据字典信息.InnoDB 使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.这里你设置越大,你在存取表里面数据时所需要的磁盘 I/O 越少.在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的 80%,不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.注意在 32 位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,所以不要设置的太高.
innodb_write_io_threads = 4
innodb_read_io_threads = 4
# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4
# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64
innodb_data_home_dir =  /usr/local/mysql/var/ #设置此选项如果你希望 InnoDB 表空间文件被保存在其他分区.默认保存在 MySQL 的 datadir 中.
innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend#InnoDB将数据保存在一个或者多个数据文件中成为表空间.如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.其他情况下.每个设备一个文件一般都是个好的选择.你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容
innodb_file_io_threads = 4 #用来同步 IO 操作的 IO 线程的数量. 此值在 Unix 下被硬编码为 4,但是在 Windows 磁盘 I/O 可能在一个大数值下表现的更好.
innodb_thread_concurrency = 16#在 InnoDb 核心内的允许线程数量,InnoDB 试着在 InnoDB 内保持操作系统线程的数量少于或等于这个参数给出的限制,最优值依赖于应用程序,硬件以及操作系统的调度方式.过高的值可能导致线程的互斥颠簸.默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量
innodb_flush_log_at_trx_commit = 1 #如果设置为 1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的 ACID 行为.如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到 0 或者 2 来减少由事务日志引起的磁盘 I/O
0 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
2 代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
innodb_log_buffer_size = 8M #用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB 将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_file_size = 500M #事物日志大小.在日志组中每个日志文件的大小,你应该设置日志文件总合大小到你缓冲池大小的5%~100%,来避免在日志文件覆写上不必要的缓冲池刷新行为.不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.
innodb_log_files_in_group = 2 #在日志组中的文件总数.通常来说 2~3 是比较好的.
innodb_log_group_home_dir =  /usr/local/mysql/var/# InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir.你可以将其指定到一个独立的硬盘上或者一个 RAID1 卷上来提高其性能innodb_max_dirty_pages_pct = 90 #innodb 主线程刷新缓存池中的数据,使脏数据比例小于 90%,这是一个软限制,不被保证绝对执行.
innodb_lock_wait_timeout = 50 #InnoDB 事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB 在它自己的 锁定表中自动检测事务死锁并且回滚事务。 InnoDB 用 LOCK TABLES 语句注意到锁定设置。默认值是 50 秒
innodb_flush_method = O_DSYNC # InnoDB 用来刷新日志的方法.表空间总是使用双重写入刷新方法.默认值是 “fdatasync”, 另一个是 “O_DSYNC”.
innodb_force_recovery=1# 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.从1 开始并且增加此值知道你能够成功的导出表.
innodb_fast_shutdown # 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并.这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作.

# *** 其他 相关选项 ***#
[mysqldump]
quick #支持较大数据库的转储,在导出非常巨大的表时需要此项。增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 如果你正是用大的BLOB值,而且未为mysqld授予为处理查询而访问足够内存的权限,也会遇到与大信息包有关的奇怪问题。如果怀疑出现了该情况,请尝试在mysqld_safe脚本开始增加ulimit -d 256000,并重启mysqld。

[mysql]
auto-rehash #允许通过 TAB 键提示
default-character-set = utf8 #数据库字符集
connect-timeout = 3
[mysqld_safe]
open-files-limit = 8192 #增加每个进程的可打开文件数量.确认你已经将全系统限制设定的足够高!打开大量表需要将此值设大

MySQL数据库配置文件my.cnf详解

[client]                                             #客户端
port    = 3306                                       #数据库端口3306
socket  = /my/log/mysql.sock                         #MySQL套接字,多实例下用socket连接

[mysql]
default-character-set = utf8                         #字符集

[mysqld]
# file
datadir = /my/data                                   #数据文件路径
pid-file= /my/log/mysql.pid                          #MySQL进程
log_error=/my/log/mysql.err                          #MySQL错误日志路径
port    = 3306                                       #数据库端口3306
socket  = /my/log/mysql.sock                         #MySQL套接字,多实例下用socket连接
character_set_server = utf8                          #字符集
#skip-grant-tables                                   #忘记root密码时,可通过--skip-grant-tables启动后连接MySQL并重置密码
slow_query_log = 1                                   #开启慢查询日志
slow_query_log_file = /my/log/slowq.log              #慢查询日志路径
long_query_time = 1                                  #慢查询时间1秒
                                                     
# temp                                               
max_tmp_tables = 64                                  #打开临时表的最大数量
max_heap_table_size = 1G                             #创建内存表的的大小
tmp_table_size = 512M                                #内存临时表的最大值
slave_load_tmpdir = /my/log                          #Slave临时目录路径
tmpdir = /my/log                                     #临时目录路径
                                                     
# session                                            
back_log = 8192                                      #MySQL停止新请求前表示有多少请求可以暂时堆栈
skip-name-resolve                                    #跳过反向解析过程
max_allowed_packet = 32M                             #客户端接收最大字节会话值
max_connections = 16000                              #最大连接数
max_connect_errors = 10000                           #最大错误连接数,满了需要通过flush hosts来清楚
wait_timeout = 28800                                 #等待超时时间
binlog_cache_size = 1M                               #binlog缓存大小
                                                     
table_open_cache = 1024                              #表缓冲区大小
thread_concurrency = 4                               #线程并发数
thread_cache_size = 128                              #线程缓冲区大小
thread_handling = pool-of-threads                    #开启线程池
thread_pool_high_prio_mode = none                    #新的连接根据thread_pool_high_prio_mode分出优先级
thread_pool_idle_timeout = 28800                     #线程闲置超时时间
thread_pool_oversubscribe = 20                       #支持运行的最大任务数
#max_statement_time = 5000                           #控制查询在MySQL的最长执行时间,单位毫秒

query_cache_type = 0                                 #查询缓冲区是否开启 0:关闭  1:开启 2:demand
query_cache_size = 0                                 #查询缓冲区大小
key_buffer_size = 128M                               #索引缓冲区大小
myisam_sort_buffer_size = 16M                        #MyISAM排序缓冲大小
read_buffer_size = 8M                                #顺序读缓区冲大小
read_rnd_buffer_size = 4M                            #随机读缓冲区大小
sort_buffer_size = 16M                               #排序缓冲区大小
join_buffer_size = 16M                               #join缓冲区大小

# innodb
default_storage_engine = InnoDB                      #默认存储引擎
innodb_data_home_dir = /my/log                       #innodb存储引擎共享表空间路径,即:ibdata
innodb_data_file_path = ibdata1:256M:autoextend      #innodb存储引擎大小,自增
innodb_log_group_home_dir = /my/log                  #ib_logfile日志路径
innodb_log_files_in_group = 2                        #ib_logfile两组,每组两个
innodb_log_file_size = 512M                          #ib_logfile大小
innodb_log_buffer_size = 8M                          #日志缓冲区大小
innodb_flush_log_at_trx_commit = 2                   #等于2时,不写硬盘而是写入系统缓存,日志仍会每秒写到硬盘
innodb_flush_method = O_DIRECT                       #向文件写入数据,只有数据写到了磁盘,写入操作完成(write返回成功)
innodb_lock_wait_timeout = 50                        #innodb引擎锁等待超时时间
#innodb_thread_concurrency = 16                      #innodb线程并发数
innodb_buffer_pool_size = 44G                        #innodb存储引擎缓冲区大小
innodb_additional_mem_pool_size = 20M                #用来设置 InnoDB 存储的数据目录信息和其它内部数据结构的内存池大小
innodb_io_capacity = 1500                            #控制Innodb checkpoint时的IO能力
innodb_use_native_aio = 1                            #控制是否启用Native AIO,默认开启。官方的测试显示,启用Native AIO,恢复速度可以提高75%
innodb_file_per_table = 1                            #innodb引擎使用独立的表空间
innodb_open_files = 3000                             #innodb打开文件数
innodb_print_all_deadlocks = 1                       #在error中打印锁信息

# others
memlock = 1                                          #MySQL是否使用交换分区

# replication
server-id = 1137                                     #server-id 搭建主从时必须配置且唯一
log-bin = /my/log/mysql-bin                          #二进制日志文件路径
#binlog-ignore-db=mysql                              #过滤mysql库的二进制日志
binlog_format = mixed                                #二进制日志模式    分三种,分别为:row,statement,mixed
expire_logs_days = 7                                 #删除过期日志时间
relay_log = /my/log/relay-bin                        #relay-log文件路径
#replicate_ignore_db = mysql                         #复制过滤MySQL库
#slave_skip_errors = 1062                            #主从同步出现问题,从库忽略所有类型为1062的错误
log_slave_updates = 1                                #级联复制使用的参数,为满足M-S-S
skip-slave-start                                     #Slave不会随MySQL的启动而启动
#read_only = 1                                       #只读
sync_binlog = 1                                      #将binlog_cache中的数据强制写入磁盘

[mysqldump]
default-character-set = utf8                         #数据库字符集

[mysqld] #服务器端配置
!include  /usr/local/mysql/etc/mysqld.cnf  #包含的配置文件,可以把用户名和密码文件单独存放

port = 3306  #监听端口  
bind-address = 0.0.0.0  #监听的ip地址
server-id = 1  #MySQL服务的ID

socket =  /usr/local/mysql/tmp/mysql.sock  #socket通信设置
pid-file =  /usr/local/mysql/var/mysql.pid  #pid文件路径
basedir =  /usr/local/mysql/          #MySQL程序路径
datadir =  /usr/local/mysql/data        #数据目录
tmpdir =  /usr/local/mysql/tmp/
#此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表.如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好。另一种选择是你也可以将其放置在独立的磁盘上.你可以使用”;”来放置多个路径,他们会按照 roud-robin 方法被轮询使用.

slave-load-tmpdir =  /usr/local/mysql/tmp/  #当slave执行load data infile时使用

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

skip-symbolic-links
#不能使用连接文件,多个客户可能会访问同一个数据库,因此这防止外部客户锁定 MySQL 服务器。 该选项默认开启

skip-external-locking
#不使用系统锁定,要使用 myisamchk,必须关闭服务器 ,避免 MySQL的外部锁定,减少出错几率增强稳定性。

skip-slave-start
#启动 mysql,不启动复制

skip-networking
#开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式,如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项!否则将无法正常连接! 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 这样设置将是增强安全的方法

sysdate-is-now = 1
#把SYSDATE 函数编程为 NOW的别名

#*** 系统资源相关选项 ***#
back_log = 50
#接受队列,对于没建立 tcp 连接的请求队列放入缓存中,队列大小为 back_log,受限制与 OS 参数,试图设定 back_log 高于你的操作系统的限制将是无效的。默认值为 50。对于 Linux 系统推荐设置为小于512的整数。如果系统在一个短时间内有很多连接,则需要增大该参数的值

max_connections = 1000
#指定MySQL允许的最大连接进程数。如果在访问数据库时经常出现"Too Many Connections"的错误提 示,则需要增大该参数值。

max_connect_errors = 10000
#如果某个用户发起的连接 error 超过该数值,则该用户的下次连接将被阻塞,直到管理员执行 flush hosts ; 命令或者服务重启, 防止黑客 , 非法的密码以及其他在链接时的错误会增加此值

open_files_limit = 10240
#MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections*5和ulimit-n的值,哪个大用哪个,当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个。

connect-timeout = 10
#连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间

wait-timeout = 28800
#等待关闭连接的时间

interactive-timeout = 28800
#关闭连接之前,允许 interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话 wait_timeout 变量被设为会话interactive_timeout 变量的值。如果前端程序采用短连接,建议缩短这2个值, 如果前端程序采用长连接,可直接注释掉这两个选项,默认配置(8小时)  

slave-net-timeout = 600
#从服务器也能够处理网络连接中断。但是,只有从服务器超过slave_net_timeout 秒没有从主服务器收到数据才通知网络中断

net_read_timeout = 30
#从服务器读取信息的超时

net_write_timeout = 60
#从服务器写入信息的超时

net_retry_count = 10
#如果某个通信端口的读操作中断了,在放弃前重试多次

net_buffer_length = 16384
#包消息缓冲区初始化为 net_buffer_length 字节,但需要时可以增长到 max_allowed_packet 字节

max_allowed_packet = 64M
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB 字段一起工作时相当必要), 每个连接独立的大小.大小动态增加。 设置最大包,限制server接受的数据包大小,避免超长SQL的执行有问题 默认值为16M,当MySQL客户端或mysqld
服务器收到大于 max_allowed_packet 字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与 MySQL 服务器的连接”错误。默认值 16M。

table_cache = 512
# 所有线程所打开表的数量. 增加此值就增加了mysqld所需要的文件描述符的数量这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096

thread_stack = 192K
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.MySQL 本身常不会需要超过 64K 的内存如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点.默认设置足以满足大多数应用

thread_cache_size = 20
# 我们在 cache 中保留多少线程用于重用.当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入 cache 中.这可以在你需要大量新连接的时候极大的减少线程创建的开销(一般来说如果你有好的线程模型的话,
这不会有明显的性能提升.)服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,
如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用
根据物理内存设置规则如下:
1G  —> 8
2G  —> 16
3G  —> 32
大于3G  —> 64

thread_concurrency = 8
#此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有 2 颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为 4 × 2 = 8.设置 thread_concurrency的值的正确与否,
对 mysql 的性能影响很大, 在多个 cpu(或多核)的情况下,错误设置了 thread_concurrency 的值, 会导致 mysql 不能充分利用多 cpu(或多核),出现同一时刻只能一个 cpu(或核)在工作的情况。 thread_concurrency 应设为 CPU 核数的 2 倍.比如有一个双核的 CPU,
那么 thread_concurrency 的应该为 4; 2 个双核的 cpu,thread_concurrency 的值应为 8,属重点优化参数

#*** qcache settings 相关选项 ***#
query_cache_limit = 2M
#不缓存查询大于该值的结果.只有小于此设定值的结果才会被缓冲,  此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.

query_cache_min_res_unit = 2K
#查询缓存分配的最小块大小.默认是 4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过 20%,可以用 FLUSH QUERY CACHE 整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size *100%
查询缓存利用率在 25%以下的话说明 query_cache_size 设置的过大,可适当减小;查询缓存利用率在 80%以上而且 Qcache_lowmem_prunes > 50 的话说明 query_cache_size 可能有点小,要不就是碎片太多。
查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

query_cache_size = 64M
#指定 MySQL 查询缓冲区的大小。可以通过在 MySQL 控制台执行以下命令观察:
代码:
> SHOW VARIABLES LIKE '%query_cache%';
> SHOW STATUS LIKE 'Qcache%';如果 Qcache_lowmem_prunes 的值非常大,则表明经常出现缓冲不够的情况;
如果 Qcache_hits 的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲; Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
memlock # 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度
紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out,此选项对于性能有益

#*** default settings 相关选项 ***#
default_table_type = InnoDB
# 当创建新表时作为默认使用的表类型,如果在创建表示没有特别执行表类型,将会使用此值

default-time-zone = system
#服务器时区

character-set-server = utf8
#server 级别字符集

default-storage-engine = InnoDB
#默认存储引擎

#*** tmp && heap settings 相关选项 ***#
tmp_table_size = 512M
#临时表的最大大小,如果超过该值,则结果放到磁盘中,此限制是针对单个表的,而不是总和.

max_heap_table_size = 512M
#独立的内存表所允许的最大容量.此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.

#*** log settings 相关选项 ***#
log-bin = mysql-bin
#打开二进制日志功能.在复制(replication)配置中,作为 MASTER 主服务器必须打开此项.如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.这些路径相对于 datadir

log_slave_updates = 1
#表示slave将复制事件写进自己的二进制日志

log-bin-index = mysql-bin.index
#二进制的索引文件名

relay-log = relay-log
#定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn(By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory);

relay_log_index = relay-log.index
#relay-log的索引文件名

log-warnings = 1
# 将警告打印输出到错误 log 文件.如果你对于MySQL有任何问题,你应该打开警告 log 并且仔细审查错误日志,查出可能的原因.

log-error =  /usr/local/mysql/log/mysql.err
#错误日志路径

log_output = FILE
#参数 log_output 指定了慢查询输出的格式,默认为 FILE,你可以将它设为 TABLE,然后就可以查询 mysql 架构下的 slow_log 表了

log_slow_queries
#指定是否开启慢查询日志(该参数要被slow_query_log取代,做兼容性保留)

slow_query_log = 1
# 指定是否开启慢查询日志. 慢查询是指消耗了比 “long_query_time” 定义的更多时间的查询.如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,

long-query-time = 1
#设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s.所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).

log_long_format
# 在慢速日志中记录更多的信息.一般此项最好打开,打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里

slow_query_log_file =  /usr/local/mysql/log/slow.log
# 指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log

log-queries-not-using-indexes
#如果运行的SQL语句没有使用索引,则mysql数据库同样会将这条SQL语句记录到慢查询日志文件中。

min_examined_row_limit=1000    
#记录那些由于查找了多余1000次而引发的慢查询

long-slow-admin-statements    
#记录那些慢的optimize table,analyze table和alter table语句

log-slow-slave-statements
#记录由Slave所产生的慢查询

general_log = 1
#将所有到达MySQL Server的SQL语句记录下来,默认关闭 

general_log_file =  /usr/local/mysql/log/mysql.log
#general_log路径

max_binlog_size = 1G
#如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。如果你正使用大的事务,二进制日志还会超过max_binlog_size

max_relay_log_size = 1G
#标记relaylog允许的最大值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;

relay-log-purge = 1
#是否自动清空不再需要中继日志时。默认值为1(启用)

expire_logs_days = 30
#超过 30 天的 binlog 删除

binlog_cache_size = 1M
# 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小,如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中,如果事务比此值大, 会使用磁盘上的临时文件来替代.此缓冲在每个连接的事务第一次更新状态时被创建.session 级别

replicate-wild-ignore-table = mysql.%
#复制时忽略数据库及表
slave_skip_errors=all
#定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。
slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
  默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
    一些error code代表的错误如下:
    1007:数据库已存在,创建数据库失败
    1008:数据库不存在,删除数据库失败
    1050:数据表已存在,创建数据表失败
    1051:数据表不存在,删除数据表失败
    1054:字段不存在,或程序文件跟数据库有冲突
    1060:字段重复,导致无法插入
    1061:重复键名
    1068:定义了多个主键
    1094:位置线程ID
    1146:数据表缺失,请恢复数据库
    1053:复制过程中主服务器宕机
    1062:主键冲突 Duplicate entry '%s' for key %d

#*** MyISAM 相关选项 ***#
key_buffer_size = 256M
#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。如果是以InnoDB引擎为主的DB,专用于MyISAM引擎的 key_buffer_size 可以设置较小,8MB 已足够  如果是以MyISAM引擎为主,可设置较大,但不能超过4G. 在这里,强烈建议不使用MyISAM引擎,默认都是用InnoDB引擎.注意:该参数值设置的过大反而会是服务器整体效率降低!

sort_buffer_size = 2M
#查询排序时所能使用的缓冲区大小。排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序.一个用来替代的基于磁盘的合并分类会被使用.查看 “Sort_merge_passes” 状态变量. 在排序发生时由每个线程分配 注意:该参数对应的分配内存是每连接独占!如果有 100 个连接,那么实际分配的总共排序缓冲区大小为 100 × 6 =600MB,所以,对于内存在 4GB 左右的服务器推荐设置为 6-8M。 

read_buffer_size = 2M
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!用来做 MyISAM 表全表扫描的缓冲大小.当全表扫描需要时,在对应线程中分配.

join_buffer_size = 8M
#联合查询操作所能使用的缓冲区大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!此缓冲被使用来优化全联合(full JOINs 不带索引的联合).类似的联合在极大多数情况下有非常糟糕的性能表现, 但是将此值设大能够减轻性能影响.通过 “Select_full_join”状态变量查看全联合的数量, 当全联合发生时,在每个线程中分配。

read_rnd_buffer_size = 8M
#MyISAM 以索引扫描(Random Scan)方式扫描数据的 buffer大小 

bulk_insert_buffer_size = 64M
#MyISAM 使用特殊的类似树的 cache 来使得突发插入(这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATAINFILE) 更快. 此变量限制每个进程中缓冲树的字节数.设置为 0 会关闭此优化.为了最优化不要将此值设置大于 “key_buffer_size”.当突发插入被检测到时此缓冲将被分配MyISAM 用在块插入优化中的树缓冲区的大小。注释:这是一个 per thread 的限制 ( bulk 大量).此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE到一个空表中引起重建索引时被分配.这在每个线程中被分配.所以在设置大值时需要小心.

myisam_sort_buffer_size = 64M
#MyISAM 设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE 或用 CREATE INDEX 创建索引或 ALTER TABLE 过程中排序 MyISAM 索引分配的缓冲区

myisam_max_sort_file_size = 10G
#mysql重建索引时允许使用的临时文件最大大小

myisam_repair_threads = 1
#如果该值大于 1,在 Repair by sorting 过程中并行创建MyISAM 表索引(每个索引在自己的线程内).如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择.

myisam_recover = 64K
#允许的 GROUP_CONCAT()函数结果的最大长度
transaction_isolation = REPEATABLE-READ # 设定默认的事务隔离级别.可用的级别如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE
1.READ UNCOMMITTED-读未提交 2.READ COMMITTE-读已提交 3.REPEATABLE READ -可重复读 4.SERIALIZABLE -串行

# *** INNODB 相关选项 ***#
skip-innodb
# 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话,使用此选项会节省内存以及磁盘空间,并且加速某些部分

innodb_file_per_table = 1
# InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间
独立表空间优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(除drop table操作处,表空不能自已回收)
缺点:
1.单表增加过大,如超过100G
结论:
共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files

innodb_status_file = 1
#启用InnoDB的status file,便于管理员查看以及监控等

innodb_open_files = 2048
# 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300

innodb_additional_mem_pool_size = 100M
#设置InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。 

innodb_buffer_pool_size = 2G
#包括数据页、索引页、插入缓存、锁信息、自适应哈希所以、数据字典信息.InnoDB 使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.这里你设置越大,你在存取表里面数据时所需要的磁盘 I/O 越少.在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的 80%,不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.注意在 32 位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,所以不要设置的太高.

innodb_write_io_threads = 4
innodb_read_io_threads = 4
# innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4
# 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64

innodb_data_home_dir =  /usr/local/mysql/var/
#设置此选项如果你希望 InnoDB 表空间文件被保存在其他分区.默认保存在 MySQL 的 datadir 中.

innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend
#InnoDB将数据保存在一个或者多个数据文件中成为表空间.如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.其他情况下.每个设备一个文件一般都是个好的选择.你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容

innodb_file_io_threads = 4
#用来同步 IO 操作的 IO 线程的数量. 此值在 Unix 下被硬编码为 4,但是在 Windows 磁盘 I/O 可能在一个大数值下表现的更好.

innodb_thread_concurrency = 16
#在 InnoDb 核心内的允许线程数量,InnoDB 试着在 InnoDB 内保持操作系统线程的数量少于或等于这个参数给出的限制,最优值依赖于应用程序,硬件以及操作系统的调度方式.过高的值可能导致线程的互斥颠簸.默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量

innodb_flush_log_at_trx_commit = 1
#如果设置为 1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的 ACID 行为.如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到 0 或者 2 来减少由事务日志引起的磁盘 I/O
0 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
2 代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.

innodb_log_buffer_size = 8M
#用来缓冲日志数据的缓冲区的大小.当此值快满时, InnoDB 将必须刷新数据到磁盘上.由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)

innodb_log_file_size = 500M
#事物日志大小.在日志组中每个日志文件的大小,你应该设置日志文件总合大小到你缓冲池大小的5%~100%,来避免在日志文件覆写上不必要的缓冲池刷新行为.不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.

innodb_log_files_in_group = 2
#在日志组中的文件总数.通常来说 2~3 是比较好的.

innodb_log_group_home_dir =  /usr/local/mysql/var/
# InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir.你可以将其指定到一个独立的硬盘上或者一个 RAID1 卷上来提高其性能innodb_max_dirty_pages_pct = 90 #innodb 主线程刷新缓存池中的数据,使脏数据比例小于 90%,这是一个软限制,不被保证绝对执行.

innodb_lock_wait_timeout = 50
#InnoDB 事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB 在它自己的 锁定表中自动检测事务死锁并且回滚事务。 InnoDB 用 LOCK TABLES 语句注意到锁定设置。默认值是 50 秒

innodb_flush_method = O_DSYNC
# InnoDB 用来刷新日志的方法.表空间总是使用双重写入刷新方法.默认值是 “fdatasync”, 另一个是 “O_DSYNC”.

innodb_force_recovery=1
# 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.从1 开始并且增加此值知道你能够成功的导出表.

innodb_fast_shutdown
# 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并.这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作.

# *** 其他 相关选项 ***#
[mysqldump]
quick
#支持较大数据库的转储,在导出非常巨大的表时需要此项。增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 如果你正是用大的BLOB值,而且未为mysqld授予为处理查询而访问足够内存的权限,也会遇到与大信息包有关的奇怪问题。如果怀疑出现了该情况,请尝试在mysqld_safe脚本开始增加ulimit -d 256000,并重启mysqld。

[mysql]
auto-rehash
#允许通过 TAB 键提示

default-character-set = utf8
#数据库字符集

connect-timeout = 3
[mysqld_safe]

open-files-limit = 8192
#增加每个进程的可打开文件数量.确认你已经将全系统限制设定的足够高!打开大量表需要将此值设大

参数详解(补充ing...)

[client]                   #客户端设置,即客户端默认的连接参数
port = 3307                 #默认连接端口
socket = /data/mysqldata/3307/mysql.sock   #用于本地连接的socket套接字
default-character-set = utf8mb4       #编码

[mysqld]                   #服务端基本设置
port = 3307 MySQL监听端口
socket = /data/mysqldata/3307/mysql.sock   #为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
pid-file = /data/mysqldata/3307/mysql.pid  #pid文件所在目录
basedir = /usr/local/mysql-5.7.11      #使用该目录作为根目录(安装目录)
datadir = /data/mysqldata/3307/data     #数据文件存放的目录
tmpdir = /data/mysqldata/3307/tmp       #MySQL存放临时文件的目录
character_set_server = utf8mb4        #服务端默认编码(数据库级别)
collation_server = utf8mb4_bin        #服务端默认的比对规则,排序规则
user = mysql                 #MySQL启动用户

log_bin_trust_function_creators = 1      #This variable applies when binary logging is enabled. It controls whether stored function creators can be trusted not to create stored functions that will cause                        #unsafe events to be written to the binary log. If set to 0 (the default), users are not permitted to create or alter stored functions unless they have the SUPER                        #privilege in addition to the CREATE ROUTINE or ALTER ROUTINE privilege. 开启了binlog后,必须设置这个值为1.主要是考虑binlog安全

performance_schema = 0            #性能优化的引擎,默认关闭

secure_auth = 1               #secure_auth 为了防止低版本的MySQL客户端(<4.1)使用旧的密码认证方式访问高版本的服务器。MySQL 5.6.7开始secure_auth 默认为启用值1

#ft_min_word_len = 1             #开启全文索引

#myisam_recover                #自动修复MySQL的myisam表

explicit_defaults_for_timestamp        #明确时间戳默认null方式

event_scheduler                #计划任务(事件调度器)
skip-external-locking            #跳过外部锁定;External-locking用于多进程条件下为MyISAM数据表进行锁定

skip-name-resolve              #跳过客户端域名解析;当新的客户连接mysqld时,mysqld创建一个新的线程来处理请求。该线程先检查是否主机名在主机名缓存中。如果不在,线程试图解析主机名。

                      #使用这一选项以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

#bind-address = 127.0.0.1          #MySQL绑定IP

skip-slave-start               #为了安全起见,复制环境的数据库还是设置--skip-slave-start参数,防止复制随着mysql启动而自动启动

slave_net_timeout = 30            #The number of seconds to wait for more data from a master/slave connection before aborting the read. MySQL主从复制的时候,

                       #当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。

                       #Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据。

                       #1.用这三个参数来判断主从是否延迟是不准确的Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.还是用pt-heartbeat吧。
                       #2.slave_net_timeout不要用默认值,设置一个你能接受的延时时间。

local-infile = 0               #设定是否支持命令load data local infile。如果指定local关键词,则表明支持从客户主机读文件

back_log = 1024               #指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。

                       #back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。

#sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER  #sql_mode,定义了mysql应该支持的sql语法,数据校验等!  NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户。

                             #NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎

key_buffer_size = 32M            #索引块的缓冲区大小,对MyISAM表性能影响最大的一个参数.决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests

                       #和Key_reads,可以知道key_buffer_size设置是否合理

max_allowed_packet = 512M          #一个查询语句包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。

                       #该值太小则会在处理大包时产生错误。如果使用大的BLOB列,必须增加该值。
                       #这个值来限制server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

thread_stack = 256K             #线程缓存;主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。

sort_buffer_size = 16M            #是MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。

                       #如果不能,可以尝试增加sort_buffer_size变量的大小。

read_buffer_size = 16M            #是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。

                       #如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

join_buffer_size = 16M           #应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index join),为了减少参与Join的“被驱动表”的

                      #读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,

                      #而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,

                      #然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。

read_rnd_buffer_size = 32M         #是MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,

                      #提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

net_buffer_length = 16K           #通信缓冲区在查询期间被重置到该大小。通常不要改变该参数值,但是如果内存不足,可以将它设置为查询期望的大小。

                       #(即,客户发出的SQL语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)

myisam_sort_buffer_size = 128M        #当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”

bulk_insert_buffer_size = 32M        #默认8M,当对MyISAM非空表执行insert … select/ insert … values(…),(…)或者load data infile时,使用树状cache缓存数据,每个thread分配一个;
                       #注:当对MyISAM表load 大文件时,调大bulk_insert_buffer_size/myisam_sort_buffer_size/key_buffer_size会极大提升速度

thread_cache_size = 384           #thread_cahe_size线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,

                      #则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。

query_cache_size = 0             #工作原理: 一个SELECT查询在DB中工作后,DB会把该语句缓存下来,当同样的一个SQL再次来到DB里调用时,DB在该表没发生变化的情况下把结果从缓存中返回给Client。
                       #在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建系把该功能禁掉。

query_cache_type = 0             #决定是否缓存查询结果。这个变量有三个取值:0,1,2,分别代表了off、on、demand。       

tmp_table_size = 1024M          #它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)

                     #如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下

max_heap_table_size = 512M          #独立的内存表所允许的最大容量.# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.

open_files_limit = 10240          #mysql打开最大文件数

max_connections = 2000           #MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。

                      #因此MySQL的实际最大可连接数为max_connections+1;
                      #这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;
                      #增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
                      #该参数设置过小的最明显特征是出现”Too many connections”错误;

max-user-connections = 0          #用来限制用户资源的,0不限制;对整个服务器的用户限制

max_connect_errors = 100000         #max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
                      #当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。

table_open_cache = 5120          #表描述符缓存大小,可减少文件打开/关闭次数;

interactive_timeout = 86400        #interactive_time -- 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接
wait_timeout = 86400            #wait_timeout -- 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数

binlog_cache_size = 16M          #二进制日志缓冲大小
                      #我们知道InnoDB存储引擎是支持事务的,实现事务需要依赖于日志技术,为了性能,日志编码采用二进制格式。那么,我们如何记日志呢?有日志的时候,就直接写磁盘?

                     #可是磁盘的效率是很低的,如果你用过Nginx,,一般Nginx输出access log都是要缓冲输出的。因此,记录二进制日志的时候,我们是否也需要考虑Cache呢?

                     #答案是肯定的,但是Cache不是直接持久化,于是面临安全性的问题——因为系统宕机时,Cache中可能有残余的数据没来得及写入磁盘。因此,Cache要权衡,要恰到好处:

                     #既减少磁盘I/O,满足性能要求;又保证Cache无残留,及时持久化,满足安全要求。

slow_query_log = 1             #开启慢查询
long_query_time = 1            #超过的时间为1s;MySQL能够记录执行时间超过参数 long_query_time 设置值的SQL语句,默认是不记录的。

log-slow-admin-statements 
log-queries-not-using-indexes       #记录管理语句和没有使用index的查询记录

# *** Replication related settings ***
binlog_format = ROW            #在复制方面的改进就是引进了新的复制技术:基于行的复制。简言之,这种新技术就是关注表中发生变化的记录,而非以前的照抄 binlog 模式。

                      #从 MySQL 5.1.12 开始,可以用以下三种模式来实现:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),

                      混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默认的。

#max_binlog_cache_size = 102400                 # 为每个session 最大可分配的内存,在事务过程中用来存储二进制日志的缓存。
log-bin = /data/mysqldata/3307/binlog/mysql-bin        #开启二进制日志功能,binlog数据位置
log-bin-index = /data/mysqldata/3307/binlog/mysql-bin.index
relay-log = /data/mysqldata/3307/relay/mysql-relay-bin     #relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,

                               #然后SQL线程会读取relay-log日志的内容并应用到从服务器
relay-log-index = /data/mysqldata/3307/relay/mysql-relay-bin.index #binlog传到备机被写道relaylog里,备机的slave sql线程从relaylog里读取然后应用到本地。

server_id = 100              #服务端ID,用来高可用时做区分
log_slave_updates = 1           #log_slave_updates是将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中。
expire-logs-days = 15           #二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
max_binlog_size = 512M           #如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。

replicate-wild-ignore-table = mysql.%  #replicate-wild-ignore-table参数能同步所有跨数据库的更新,比如replicate-do-db或者replicate-ignore-db不会同步类似 
#replicate-wild-do-table = db_name.%   #设定需要复制的Table

#slave-skip-errors = 1062,1053,1146    #复制时跳过一些错误;不要胡乱使用这些跳过错误的参数,除非你非常确定你在做什么。当你使用这些参数时候,MYSQL会忽略那些错误,

                     #这样会导致你的主从服务器数据不一致。

auto_increment_offset = 1
auto_increment_increment = 2        #这两个参数一般用在主主同步中,用来错开自增值, 防止键值冲突

relay_log_info_repository = TABLE     #将中继日志的信息写入表:mysql.slave_realy_log_info
master_info_repository = TABLE       #将master的连接信息写入表:mysql.salve_master_info
relay_log_recovery = on          #中继日志自我修复;当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,

                     #并且重新从master上获取日志,这样就保证了relay-log的完整性

# *** innodb setting ***
innodb_buffer_pool_size = 4G        #InnoDB 用来高速缓冲数据和索引内存缓冲大小。 更大的设置可以使访问数据时减少磁盘 I/O。

innodb_data_file_path = ibdata1:1G:autoextend  #单独指定数据文件的路径与大小

innodb_flush_log_at_trx_commit = 0      #每次commit 日志缓存中的数据刷到磁盘中。通常设置为 1,意味着在事务提交前日志已被写入磁盘, 事务可以运行更长以及服务崩溃后的修复能力。

                       #如果你愿意减弱这个安全,或你运行的是比较小的事务处理,可以将它设置为 0 ,以减少写日志文件的磁盘 I/O。这个选项默认设置为 0。

#sync_binlog = 1000            #sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

innodb_read_io_threads = 8  
innodb_write_io_threads = 8        #对于多核的CPU机器,可以修改innodb_read_io_threads和innodb_write_io_threads来增加IO线程,来充分利用多核的性能

innodb_file_format = Barracuda      #Innodb Plugin引擎开始引入多种格式的行存储机制,目前支持:Antelope、Barracuda两种。其中Barracuda兼容Antelope格式。

innodb_open_files = 65536         #限制Innodb能打开的表的数量
innodb_purge_threads = 1         #开始碎片回收线程。这个应该能让碎片回收得更及时而且不影响其他线程的操作
innodb_support_xa = FALSE        #分布式事务
innodb_log_buffer_size = 256M      #InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。

                     #因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。

innodb_log_file_size = 1G        #日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目,那么理想的数值为 1M 至下面设置的缓冲池(buffer pool)大小的 1/n。较大的值,

                    #可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。

innodb_log_files_in_group = 3      #指定有三个日志组

#innodb_lock_wait_timeout = 120     #在回滚(rooled back)之前,InnoDB 事务将等待超时的时间(单位 秒)

innodb_max_dirty_pages_pct = 75     #innodb_max_dirty_pages_pct作用:控制Innodb的脏页在缓冲中在那个百分比之下,值在范围1-100,默认为90.这个参数的另一个用处:

                    #当Innodb的内存分配过大,致使swap占用严重时,可以适当的减小调整这个值,使达到swap空间释放出来。建义:这个值最大在90%,最小在15%。

                    #太大,缓存中每次更新需要致换数据页太多,太小,放的数据页太小,更新操作太慢。

innodb_buffer_pool_instances = 4     #innodb_buffer_pool_size 一致 可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。

innodb_io_capacity = 500        #这个参数据控制Innodb checkpoint时的IO能力

innodb_file_per_table = 1        #作用:使每个Innodb的表,有自已独立的表空间。如删除文件后可以回收那部分空间。
                     #分配原则:只有使用不使用。但DB还需要有一个公共的表空间。

innodb_change_buffering = inserts    #当更新/插入的非聚集索引的数据所对应的页不在内存中时(对非聚集索引的更新操作通常会带来随机IO),会将其放到一个insert buffer中,

                     #当随后页面被读到内存中时,会将这些变化的记录merge到页中。当服务器比较空闲时,后台线程也会做merge操作

innodb_adaptive_flushing = 1      #该值影响每秒刷新脏页的操作,开启此配置后,刷新脏页会通过判断产生重做日志的速度来判断最合适的刷新脏页的数量;

transaction-isolation = READ-COMMITTED  #数据库事务隔离级别 ,读取提交内容

innodb_flush_method = O_DIRECT      #innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式
                        #InnoDB使用O_DIRECT模式打开数据文件,用fsync()函数去更新日志和数据文件。

#innodb_use_sys_malloc = 1        #默认设置值为1.设置为0:表示Innodb使用自带的内存分配程序;设置为1:表示InnoDB使用操作系统的内存分配程序。

[mysqldump]
quick                 #它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中

max_allowed_packet = 512M        #限制server接受的数据包大小;指代mysql服务器端和客户端在一次传送数据包的过程当中数据包的大小
net_buffer_length = 16384        #TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行

[mysql]
auto-rehash              #auto-rehash是自动补全的意思

[isamchk]                #isamchk数据检测恢复工具
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[myisamchk]              #使用myisamchk实用程序来获得有关你的数据库桌表的信息、检查和修复他们或优化他们
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout #mysqlhotcopy使用lock tables、flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能用于备份MyISAM存储引擎和运行在数据库目录所在的机器上.

          #与mysqldump备份不同,mysqldump属于逻辑备份,备份时是执行的sql语句.使用mysqlhotcopy命令前需要要安装相应的软件依赖包.

mysql5.6之my.cnf配置详解

[mysqld]
# GENERAL #
user                            = mysql
port                            = 3306
default_storage_engine          = InnoDB
socket                          = /tmp/mysql.sock
tmpdir                          = /dev/shm  放到共享内存里面,效率更高,  共享内存默认是物理内存的一半
character-set-server            = gbk     
collation-server                = gbk_chinese_ci  (校验级,不建议设置,让系统自己选择)
init-connection="set names gbk";
如果指定非utf8  和laint 1的话 建议添加 init-connection="set names gbk"; 这个
新创建的连接客户端要设计他的字符集
http://imysql.com/tag/字符集   参考
http://imysql.cn/2013/10/29/misunderstand-about-charset-handshake.shtml 参考
| utf8_general_ci          | utf8     |  33 | Yes     | Yes      |       1 | utf8默认的字符集编码

net_buffer_length               = 1024K         
skip-name-resolve
skip-external-locking
ft_min_word_len = 4
event_scheduler = 0

tmpdir                          = /dev/shm   指向共享内存 如果内存比较小需要注意

skip-character-set-client-handshake  忽略客户端连接过来的字符集,使用服务器端指定的字符集

## File
back_log                        = 500   比如我现在有1000个连接过来 数据库现在只能连接100个进程,另外900缓存起来存到back_log中
open_files_limit                = 65535 不超过内核的上限值就可以 ,但是不要设置太小

# MyISAM #
key_buffer_size                 = 64M      只针对Myisam引擎以Innodb表为主 这个 就足够用了 如果以myisam表为主这个需要设置大些

#myisam_recover_options          = FORCE,BACKUP
myisam_sort_buffer_size         = 32M
myisam_repair_threads = 1

# SAFETY #
max_allowed_packet              = 128M    这个参数一般给默认值就可以了,设置导入导出环境这块设置不一样可能会报错。
skip_name_resolve

#buffers & cache
table_open_cache      = 2048    
table_definition_cache = 2048
max_heap_table_size = 96M
tmp_table_size = 96M
如果排序多的话下面2个参数加大一些

sort_buffer_size = 2M
join_buffer_size = 2M
thread_cache_size = 512   有点小可以加大一些 ,要根据我们的情况来顶,如果前端使用连接池512已经够用了,如果使用短链接需要加大 可以设置生1M
query_cache_size = 0     =0 是关闭掉
query_cache_type = 0
query_cache_limit = 256K
query_cache_min_res_unit = 512
thread_stack = 192K
read_buffer_size = 2M
read_rnd_buffer_size = 2M
bulk_insert_buffer_size = 32M

#connecter
max_connections                = 1100    数据库最大连接数
max_user_connections           = 1000   用户最大连接数
max_connect_errors              = 1000000   输入错误多少次 锁定用户

#timeout
wait_timeout                  = 100   连接池一般是长连接,长连接 这个值就不要设置太小,太小的话超过一段时间就会自动踢掉了,可以根据
实际情况设置时间
interactive_timeout           = 100

connect_timeout              = 20   连接超时,设置太大会有问题,如果网络有问题就    
slave-net-timeout            = 20  这个可以设置小一点,太长会导致连接进程等待

transaction_isolation = READ-COMMITTED   事物隔离级别,交易类的用RR,如果代码曾有能力解决幻读用rc
#performance_schema=0
 
# BINARY LOGGING #
log_bin                         = /database/mysql/binlog/mysql-bin   日志存放位置
expire_logs_days                = 6    日志存放天数
sync_binlog                     = 0          sync_binlog减小io开销使用  主从必须设置为1 好保证主从一致性,
设置为1 影响性能 ,设置为0 速度快数据不安全 可设置为0,1, 2, 3,5,,10
binlog_format                   = row
max_binlog_size                 = 1024M

# LOGGING #
log_error                       = /database/mysql/logs/mysql-error.log    错误日志的位置
#log_queries_not_using_indexes  = 1
slow_query_log                 = 1
slow_query_log_file            = /database/mysql/logs/mysql-slow.log    慢日志的位置
long_query_time                = 1  慢查询的时候 可以小一点  ,每个sql 最好不要超过20毫秒
log-output                     = file     控制慢日志输出的   file|table  可以文件,也可表
log_warnings                   = 2     log_warnings= 2,可以避免Aborted connection

#thread pool
thread_handling=pool-of-threads
thread_pool_oversubscribe=3  意思是一个cpu核心同时可以处理多少个并发线程的链接
 thread_pool_oversubscribe = cpu核心数  这个值不建议超过3

# INNODB #
#innodb_adaptive_flushing_method = estimate
innodb_adaptive_flushing        = 1  顺序io 的参数   自适应刷新,开启比较合理
innodb_data_home_dir            = /database/mysql/ibdata
innodb_log_group_home_dir       = /database/mysql/ibdata_log
innodb_data_file_path           = ibdata1:2048M:autoextend    共享表空间的大小
#innodb_adaptive_hash_index_partitions= 4
innodb_additional_mem_pool_size = 16M
innodb_flush_method             = O_DIRECT

innodb_log_files_in_group       = 2
innodb_log_file_size            = 512M
innodb_log_buffer_size          = 16M
innodb_flush_log_at_trx_commit  = 1  innodb_flush_log_at_trx_commit = 0 非交易类,=1 交易类,保持一致性要设置成1 否则设置为0
innodb_file_per_table           = 1
innodb_buffer_pool_size         = 32G
innodb_buffer_pool_instances    = 8    比如场景为32 G 划分为4个相当于每个都有8个G子分区来进行管理,但是前提条件是内存一定要大于8G,也就是说切分完之后每个
都要大于1个G,大内存   高并发场景 设置要好点

innodb_blocking_buffer_pool_restore = ON
innodb_buffer_pool_restore_at_startup = 300
innodb_merge_sort_block_size    = 2M
innodb_kill_idle_transaction    = 300  查询或者dml语句超过一定时间内都会被kill掉 建议不设置
innodb_max_dirty_pages_pct      = 65
innodb_io_capacity              = 300  根据硬盘的iops来设置   ssd可以设置为2000普通的设置300-500

innodb_blocking_buffer_pool_restore = ON
innodb_buffer_pool_restore_at_startup = 300
innodb_merge_sort_block_size    = 2M
https://bugs.launchpad.net/percona-server/+bug/1072538

innodb_thread_concurrency       = 0  nnodb_thread_concurrency       = 0
一般是设置0或者CPU*2  现在已经基本上不用太关心了5.6开始当做透明的就好了
innodb_read_io_threads          = 12
innodb_write_io_threads         = 16
innodb_file_format              = Barracuda
innodb_flush_neighbor_pages     = 0    文件格式
innodb_change_buffering         = all

innodb_stats_on_metadata        = 0
innodb_lock_wait_timeout        = 30    等待锁的时间根据业务来判断
innodb_rollback_on_timeout
innodb_sync_spin_loops           = 100
innodb_spin_wait_delay           = 30
innodb_support_xa               = 0

innodb_concurrency_tickets      = 500   默认值500
log_bin_trust_function_creators = 1  
 log_bin_trust_function_creators=1:触发器和存储过程时启用。
注释:
开启binlog时,是否允许创建存储程序
(除非有SUPER权限,或者指定DETERMINISTIC、READS SQL DATA、NO SQL)
可动态修改,属于一个功能性的东西。
innodb_purge_threads            =1   purge线程  只能设置为1 5.7才可以有多个
innodb_purge_batch_size         = 32
innodb_old_blocks_pct           = 75

#Replication
server-id = 113306
#log-slave-updates
#skip_slave_start   看情况是否开启,如果作为中级节点必须开启否则不用开启,log-slave-updates 建议这个要开启
#read_only         = 1
slave-skip-errors=1032   跳过指定错误
skip_slave_start   = 1     开机自动启动同步,早起版本建议不要开启

innodb_max_dirty_pages_pct      = 35 这个参数看环境 ,建议设置为50以下,毕竟数据库以读为主,

如果设置过多,刷新的时候会造成瓶颈

#relay log
#relay-log = /database/mysql/binlog/slave-relay-bin
#relay-log-index = /database/mysql/binlog/slave-relay-bin.index
max-relay-log-size = 256M    
relay_log_purge = 1
#slave_parallel_workers = 8  并行的复制,多个数据库就要开启并行

my.cnf 里头,各个section什么意思
mysqld_safe
针对mysqld_safe这个进程或者程序一个配置的区间,这个区间只会被mysqld_safe读取
[mysql]
只针对 mysql 这个cli客户端工具

[client]
 针对全部的client,例如mysql\mysqldump\mysqladmin都是
[mysqldump]
针对mysqldump专区
[mysqld]
mysqld这个服务进程的专区

relay_log_recovery = 1

如果是slave  的话一定要加上

[mysql]
prompt="\\u@\\h \\D \\R:\\m:\\s [\\d]&get; "
pager="less -i -n -S"
no-auto-rehash
tee="/home/mysql/query.log"

记录数据库的操作,加上no-auto-rehash  不扫描MySQL日志

innodb_adaptive_flushing_lwm -- 设置redo log flush低水位线,当需要flush的redo log超过这个低水位线时,立即强制启用adaptive flushing,即便没有设置使用adaptive flushing机制

innodb_buffer_pool_size
innodb_additional_mem_pool_size    缓存数据字典的默认是8M  最好给16M或者32M
innodb_log_buffer_size

read_buffer_size             -- 顺序读缓冲,提高顺序读效率

+read_rnd_buffer_size   -- 随机读缓冲,
+sort_buffer_size           -- 排序缓冲,提高排序效率

+join_buffer_size           -- 表连接缓冲,提高表连接效率

+binlog_cache_size       -- 二进制日志缓冲,提高二进制日志写入效率

+tmp_table_size            -- 内存临时表,提高临时表存储效率

+tmp_table_size            -- 内存临时表,提高临时表存取效率(一般用于group by查询)

+thread_cache_size       -- 线程缓存,
+net_buffer_length       -- 线程持连接缓冲以及读取结果缓冲

+net_buffer_length       -- 线程池连接缓冲以及读取结果缓冲

需要关注的是最大连接数 不要设置太大

tmp_table_size  不要设置太大

innodb_buffer_pool_size                      -- InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等

+innodb_additional_mem_pool_size    -- InnoDB数据字典额外内存,缓存所有表数据字典

+innodb_log_buffer_size                      -- InnoDB REDO日志缓冲,提高REDO日志写入效率

+key_buffer_size                                   -- MyISAM表索引高速缓冲,提高MyISAM表索引读写效率

+query_cache_size                                -- 查询高速缓存,缓存查询结果,提高反复查询返回效率

+key_buffer_size                                   -- MyISAM表索引高速缓冲,提高MyISAM表索引读写效率(建议少用MyISAM)
+query_cache_size                                -- 查询高速缓存,缓存查询结果,提高反复查询返回效率(建议关闭QC)

+table_cahce                                         -- 表空间文件描述符缓存,提高数据表打开效率

+table_definition_cache                        -- 表定义文件描述符缓存,提高数据表打开效率

MyISAM和InnoDB buffer区别
InnoDB既缓存索引,又缓存数据
MyISAM只缓存索引,不缓存数据

max_heap_table_size 负责设置MEMORY/HEAP表最大容量,不管其他执行SQL产生的临时表,如果内存不够用,则不允许写入新的数据,MEMORY/HEAP表也不会转成磁盘表,只会告警超限后拒绝写入

tmp_table_size 不负责限制 MEMORY/HEAP表最大容量,如果执行SQL产生临时表超过 tmp_table_size/max_heap_table_size,则会产生基于磁盘的MyISAM表
| default_tmp_storage_engine                             | InnoDB  
tmp_table_size 不负责限制 MEMORY/HEAP表最大容量,如果执行SQL产生临时表超过 tmp_table_size/max_heap_table_size,则会产生基于磁盘的MyISAM表(如果default_tmp_storage_engine选项没有设定为InnoDB的话)

关闭查询缓存:
query_cache_type = 0
query_cache_size = 0

官方MySQL版本:
Total memory allocated 1098907648; in additional pool allocated 0
Dictionary memory allocated 37754
Buffer pool size   65535
Free buffers       65283
Database pages     252
Old database pages 0
Modified db pages  0

Buffer pool size 大小16kb
Buffer pool size   65535 * 16KB = 1G

innodb_old_blocks_pct
旧的数据块的百分比
innodb_old_blocks_time
当buff_pool不够用的时候会根据时间讲旧的清除掉

新数据都是热数据过一段时间就放到存旧数据的里面,过段时间不用就清楚掉。

=======================================================
Percona分支版本:
Total memory allocated 858521600 (818M); in additional pool allocated 0
Total memory allocated by read views 88
Internal hash tables (constant factor + variable factor) -- 内部用途哈希表缓冲
    Adaptive hash index 13302240        (13281656 + 20584) -- 自适应哈希索引,约12.6M
    Page hash           830936 (buffer pool 0 only) -- data page哈希,约0.79MB,只缓存了buffer_pool_0这个instance,如果 innodb_buffer_pool_instances 设置大于0的话
    Dictionary cache    3382197         (3321904 + 60293) -- 数据字典缓冲,约3.2MB
    File system         820024  (812272 + 7752) -- 文件子系统缓冲,约0.78MB
    Lock system         2311256         (2311256 + 0) -- 锁子系统缓冲,约2.2MB
    Recovery system     0       (0 + 0)  -- 恢复子系统缓冲,目前是0
Dictionary memory allocated 60293
Buffer pool size        51199
Buffer pool size, bytes 838844416
Free buffers            50795 -- 空闲buffer,约793MB
Database pages          403   -- 缓冲热点数据的buffer,约6KB
Old database pages      0     -- 缓冲旧数据的buffer
Modified db pages       0     -- 缓冲最近修改数据的buffer
叶金荣(4700963)21:18:01

默认128M(老版本默认8M,坑很多),以InnoDB表为主的话,设为物理内存50~70%
[MySQL FAQ]系列 -- 数据不算大,备份却非常慢,http://imysql.com/2009/09/18/mysql-faq-why-backup-is-so-slow.html

adaptive index hash, 自适应哈希索引,用来管理buffer pool的哈希索引

adaptive index hash, size= innodb_buffer_pool / 64,随着buffer的频繁更新,会随之上升
   Lock system         2311256         (2311256 + 0) -- 锁子系统缓冲,约2.2MB

事件等待  当Innodb_buffer_pool_wait_free      就是事件等待 这个时候很有可能是内存不够 ,查看当系统的内存,如果有
剩余的内存就给buffer_pool多分配一些,如果剩余内存不多的情况下,建议添加内存或者迁移
| Innodb_buffer_pool_wait_free                  | 0            |
| Innodb_log_waits                              | 0            |

innodb_additional_mem_pool_size
数据字典以及内部数据结构缓存,表数量越多,相应的内存需要越大。
默认8M,通常设置为8~32M足够,一般建议设置为16M,如果确实不够用,那么会从系统中请求增加分配内存,并且错误日志中会提醒,目前至少还未发生过。

innodb_log_buffer_size
show global status 查看 Innodb_log_waits 是否大于0,是的话,就需要提高 innodb_log_buffer_size,否则维持原样。
show global stauts 查看30~60秒钟 Innodb_os_log_written 的间隔差异值,即可计算出 innodb_log_buffer_size 设置多大合适。
默认8M,一般设置为16 ~ 64M足够了。

max_heap_table_size 负责设置MEMORY/HEAP表最大容量,不管其他执行SQL产生的临时表,如果内存不够用,则不允许写入新的数据,MEMORY/HEAP表也不会转成磁盘表,只会告警超限后拒绝写入
tmp_table_size 不负责限制 MEMORY/HEAP表最大容量,如果执行SQL产生临时表超过 tmp_table_size/max_heap_table_size,则会产生基于磁盘的MyISAM表(如果default_tmp_storage_engine选项没有设定为InnoDB的话)

tmp_table_size            -- 内存临时表,提高临时表存取效率(一般用于group by查询)    ;max_heap_table_size 负责设置MEMORY/HEAP表最大容量,不管其他执行SQL产生的临时表,如果内存不够用,则不允许写入新的数据,MEMORY/HEAP表也不会转成磁盘表,只会告警超限后拒绝写入
---------------------
作者:sbpgywgi
来源:CSDN
原文:https://blog.csdn.net/sbpgywgi/article/details/78561212
版权声明:本文为博主原创文章,转载请附上博文链接!

my.cnf 配置文件参数解释的相关教程结束。

《my.cnf 配置文件参数解释.doc》

下载本文的Word格式文档,以方便收藏与打印。