my.cnf详解


原文链接: my.cnf详解
[client]
default-character-set = utf8
[mysqld]
datadir = /docker/mysql
# MASTER
[server]
server_id=1
log_bin=master-binlog
binlog_format = ROW
log-bin-trust-function-creators=1
max_binlog_size = 256M
expire_logs_days = 7
# innodb_flush_log_at_trx_comit = 1 
# sync_binlog = 0 
binlog-ignore-db = test
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
# slave
[server]
#read_only=ON
log-slave-updates = ON
slave-skip-errors = ALL
slave-skip-errors = 1007,1008,1053,1062,1213,1158,1159
relay_log_recovery=ON
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
[mysqld]
user = mysql
lower_case_table_names = 1
default_storage_engine = InnoDB
innodb_buffer_pool_size = 6G
innodb_force_recovery=1
performance_schema = OFF
skip-external-locking
general_log = OFF
slow_query_log = ON
long_query_time = 5
wait_timeout =86400
interactive_timeout=86400
character_set_server = utf8
collation_server = utf8_general_ci
init_connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'
back_log = 512
open_files_limit = 8192
max_connections = 2000
max_connect_errors = 100
concurrent_insert = 2
read_buffer_size = 16M
read_rnd_buffer_size = 16M
binlog_cache_size = 1M
key_buffer_size = 256M
join_buffer_size = 64M
sort_buffer_size = 64M
query_cache_type = on
query_cache_size = 2G
query_cache_limit= 2M
tmp_table_size = 1G
max_heap_table_size = 1G
bulk_insert_buffer_size = 256M
max_allowed_packet = 256M
innodb_thread_concurrency = 0
innodb_commit_concurrency = 16
innodb_log_files_in_group = 3
innodb_log_file_size = 512M
innodb_log_buffer_size = 128M
innodb_lock_wait_timeout=600 
[mysqldump]
quick
quote-names
max_allowed_packet = 256M
## mysql 无法启动: 1. 目录没建 2. 权限不对 mkdir -p /var/lib/mysql /var/log/mysql /var/run/mysqld/ 
# $ sudo gpasswd -a ${USER} mysql         # 将用户加入该 mysql 组内
# docker run -it --rm --name mariadb -p 3306:3306 -v /docker/mysql:/var/lib/mysql -v $PWD/my.cnf:/etc/my.cnf mariadb
# sudo groupadd -r -g 999 mysql && sudo useradd -r -u 999 -g mysql -c mysql -d /var/lib/mysql -s /sbin/nologin mysql
# /usr/local/mysql/scripts/mysql_install_db --user=ubuntu --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data --ldata=/var/lib/mysql
# mysql_install_db --user=mysql --basedir=/usr/share/mysql --datadir=/docker/var/lib/mysql
# mysql_upgrade  
# mysql_secure_installation

## 加快数据的导入
# 1. 导入数据之前执行set unique_checks=0 来禁止对唯一索引的检查,数据导入完成之后再运行set unique_checks=1.
# 2. 导入数据之前执行set foreign_key_checks=0 来禁止对外键的检查,数据导入完成之后再执行set foreign_key_checks=1.
# 3. 导入数据之前执行set autocommit=0 禁止自动事务的自动提交,数据导入完成之后,执行set autocommit=1 恢复自动提交操作。
# 4. 禁用 binlog 
# 5. INSERT INTO 改为 INSERT DELAYED INTO
!includedir /etc/mysql/conf.d/

[client]
# no-auto-rehash
#auto-rehash           # 开启自动补全
default-character-set = utf8
# socket = /var/run/mysqld/mysqld.sock
[mysqld]
#basedir = /usr/share/mysql
datadir = /docker/mysql
# socket   = /var/run/mysqld/mysqld.sock
# pid-file = /var/run/mysqld/mysqld.pid
# CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123457';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.%';flush privileges;
# mysqldump -uroot -p --master-data -b test > backup_test.sql
##############MASTER###################
[server]
#server_id=1

log_bin=master-binlog              # master开启binlog
binlog_format = ROW                # default:MIXED
log-bin-trust-function-creators=1  # view don't reqiure super privileged
max_binlog_size = 256M             # max size for binlog before rolling
expire_logs_days = 7               # binlog files older than this will be purged
innodb_flush_log_at_trx_commit = 0 # 0 = perf, 默认: 1 = ACID
sync_binlog = 0                    # 0 性能好,由操作系统控制写入磁盘 ;0~100 多少次事物写入磁盘
#[实时写入 可选] 每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,最大限度保证可靠性和一致性
# innodb_flush_log_at_trx_comit = 1 
# sync_binlog = 1 

#binlog-do-db = lybb,lzkp
binlog-ignore-db = test
# binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema

#auto-increment-offset = 1     #[偏移量]
#auto-increment-increment = 2  #[增长值]
#auto-increment-offset = 2
#auto-increment-increment = 2

#CHANGE MASTER TO MASTER_HOST='10.114.0.5', MASTER_USER='repl', MASTER_PASSWORD='repl123457', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=728, master_delay = 60;
##############SLAVE#################
[server]
#server-id = 2
#read_only=ON                 # slave从库只读
log-slave-updates = ON        # slave从库也写入binlog开启从库级联(A->B->C) 

slave-skip-errors = ALL      #
slave-skip-errors = 1007,1008,1053,1062,1213,1158,1159    # slave解决从库插入数据引起的主键冲突
#skip-slave-start   
#relay_log=relay-log         #relay-log缓冲,这样master不必等待slave执行完成就可以发送下一个事件
relay_log_recovery=ON        #relay-log损坏,重新从master上获取日志

#replicate_do_db =lzkp #不支持 db1,db2 多库,如果多库写多条即可
#replicate_do_table =
# replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
#replicate_ignore_table =  
#replicate_wild_do_table =lzkp.% 
#replicate_wild_ignore_table =

[mysqld]
user = mysql
port = 3306
bind-address= 0.0.0.0
#bind-address= 127.0.0.1
event_scheduler=ON              # 开启计划任务 SET GLOBAL event_scheduler = ON;
lower_case_table_names = 1      # 1.不区分大小写
default_storage_engine = InnoDB # `show engines`

innodb_buffer_pool_size = 6G    #总内存80%
innodb_force_recovery=1

performance_schema = OFF     # 开启性能测试,默认:关
#skip-name-resolve            # 不解析域名,只能通过IP连接
skip-external-locking        # 避免外部锁定
#skip-grant-tables

## Logging
general_log = OFF   #开启查询日志
slow_query_log = ON #开启慢日志查询
long_query_time = 5 #慢查询时间 超过5秒则为慢查询

##  Timeout 默认: 28800 以秒为单位
wait_timeout =86400
interactive_timeout=86400

## Charset and Collation `show variables like 'character%';`
# [deprecated] character-set-server  = utf8mb4               
# [deprecated] collation-server      = utf8mb4_general_ci 
character_set_server = utf8
collation_server     = utf8_general_ci
init_connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'

## Files
back_log = 512          # 设定TCP/IP连接数 每个占256k `sysctl net.ipv4.tcp_max_syn_backlog`
open_files_limit = 8192
# [deprecated] open-files= 1024 
# [deprecated] lc-messages-dir	= /usr/local/mysql
# [deprecated] language = /usr/local/mysql/share/english

## [并发连接数目最大] Connections
max_connections = 2000   # default:151
max_connect_errors = 100 #default: 10
concurrent_insert = 2    #default: 1, 2: enable insert for all instances

##SHOW STATUS LIKE 'key_read%'
read_buffer_size = 16M    
read_rnd_buffer_size = 16M    
binlog_cache_size = 1M      # 事务缓冲区TX queries
key_buffer_size = 256M      # 索引的缓冲区大小
join_buffer_size = 64M    
sort_buffer_size = 64M

query_cache_type = on         #开启Query Cache 功能;缓存所有结果
query_cache_size = 2G
query_cache_limit= 2M         #指定单个查询能够使用的缓冲区大小,默认1M
#query_cache_type         = 0 #关闭Query Cache 功能;OFF:不缓存 ON: DEMAND:
#query_cache_size         = 0 

## [临时表的大小]
tmp_table_size = 1G        #recommend 1G min
max_heap_table_size = 1G
bulk_insert_buffer_size  = 256M # 设置写入缓存大小。提高mysql导入速度。(和磁盘io差不多就行)
max_allowed_packet = 256M 

## InnoDB  
innodb_thread_concurrency = 0     #recommend 2x core quantity
innodb_commit_concurrency = 16    #recommend 4x num disks
innodb_log_files_in_group = 3     #循环方式将日志文件写到多个文件
innodb_log_file_size = 512M       #重做日志的总大小是否够写入1-2小时即可,太大崩溃恢复速度更慢,但性能好
innodb_log_buffer_size = 128M     #内存缓冲区大小,1S写一次磁盘

innodb_lock_wait_timeout=600      # 事务避免过长时间的等待.
## Per-Thread Buffer memory utilization equation:
#(read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size + binlog_cache_size) * max_connections

## Global Buffer memory utilization equation:
# innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size

## Security Features

# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
[mysqldump]
quick
quote-names
max_allowed_packet = 256M 


my.cnf最详细解释
mysql配置文件参数详解

skip-name-resolve

禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,

则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求

#skip-networking

修改back_log参数值:由默认的50修改为500.(每个连接256kb, 占用:125M)
back_log=512
查看mysql 当前系统默认back_log值,命令: show variables like 'back_log';

back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:
unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.

back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog,目前系统为1024。对于Linux系统推荐设置为大于512的整数。
修改系统内核参数,可以编辑/etc/sysctl.conf去调整它。如:net.ipv4.tcp_max_syn_backlog = 2048,改完后执行sysctl -p 让修改立即生效。

MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,

然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。

如果期望在一个短时间内有很多连接,你需要增加它。也就是说,如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中, 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。

你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。

max_connections = 1000

MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。

max_connect_errors = 6000

对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。

open_files_limit = 65535

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

当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个。

table_open_cache = 128

MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64

假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);

当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上

max_allowed_packet = 4M

接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。

该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。

binlog_cache_size = 1M

一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K

max_heap_table_size = 8M

定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变

tmp_table_size = 16M

MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。

大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。

如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果

read_buffer_size = 2M

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

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

read_rnd_buffer_size = 8M

MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,

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

sort_buffer_size = 8M

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

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

join_buffer_size = 8M

联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享

thread_cache_size = 8

这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,

如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,

增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值)

根据物理内存设置规则如下:

1G —> 8

2G —> 16

3G —> 32

大于3G —> 64

query_cache_size = 8M
#MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,

今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

通过检查状态值'Qcache_%',可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,

如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,

这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲

query_cache_limit = 2M
#指定单个查询能够使用的缓冲区大小,默认1M

key_buffer_size = 4M
#指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,

系统将开始换页并且真的变慢了。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过检查状态值Key_read_requests和Key_reads,

可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,

至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE 'key_read%'获得)。注意:该参数值设置的过大反而会是服务器整体效率降低

ft_min_word_len = 4

分词词汇最小长度,默认4

transaction_isolation = REPEATABLE-READ

MySQL支持4种事务隔离级别,他们分别是:

READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED

log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30 #超过30天的binlog删除

log_error = /data/mysql/mysql-error.log #错误日志路径
slow_query_log = 1
long_query_time = 1 #慢查询时间 超过1秒则为慢查询
slow_query_log_file = /data/mysql/mysql-slow.log

performance_schema = 0
explicit_defaults_for_timestamp

#lower_case_table_names = 1 #不区分大小写

skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启

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

innodb_file_per_table = 1

InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间

独立表空间优点:

1.每个表都有自已独立的表空间。

2.每个表的数据和索引都会存在自已的表空间中。

3.可以实现单表在不同的数据库中移动。

4.空间可以回收(除drop table操作处,表空不能自已回收)

缺点:

单表增加过大,如超过100G

结论:

共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files

innodb_open_files = 500

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

innodb_buffer_pool_size = 64M

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_thread_concurrency = 0

默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量

innodb_purge_threads = 1

InnoDB中的清除操作是一类定期回收无用数据的操作。在之前的几个版本中,清除操作是主线程的一部分,这意味着运行时它可能会堵塞其它的数据库操作。

从MySQL5.5.X版本开始,该操作运行于独立的线程中,并支持更多的并发数。用户可通过设置innodb_purge_threads配置参数来选择清除操作是否使用单

独线程,默认情况下参数设置为0(不使用单独线程),设置为 1 时表示使用单独的清除线程。建议为1

innodb_flush_log_at_trx_commit = 2

0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。

主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件(REDO LOG)中。不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1

1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。

2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。

每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘

默认值1是为了保证完整的ACID。当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。

设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。

总结

设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能

innodb_log_buffer_size = 2M

此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间

innodb_log_file_size = 32M

此参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间

innodb_log_files_in_group = 3

为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3

innodb_max_dirty_pages_pct = 90

innodb主线程刷新缓存池中的数据,使脏数据比例小于90%

innodb_lock_wait_timeout = 120

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

bulk_insert_buffer_size = 8M

批量插入缓存大小, 这个参数是针对MyISAM存储引擎来说的。适用于在一次性插入100-1000+条记录时, 提高效率。默认值是8M。可以针对数据量的大小,翻倍增加。

myisam_sort_buffer_size = 8M

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

myisam_max_sort_file_size = 10G

如果临时文件会变得超过索引,不要使用快速排序索引方法来创建一个索引。注释:这个参数以字节的形式给出

myisam_repair_threads = 1

如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内)

interactive_timeout = 28800

服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。默认值:28800秒(8小时)

wait_timeout = 28800

服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,

取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。参数默认值:28800秒(8小时)

MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,

应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,

最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。

在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,

可以进行适当的调整小些。要同时设置interactive_timeout和wait_timeout才会生效。

[mysqldump]
quick
max_allowed_packet = 16M #服务器发送和接受的最大包长度

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

(二)

[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-name-resolve
#禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!注:如果用winform连接mysql,加入此句速度会有很大的提升

skip-locking

避免MySQL的外部锁定,减少出错几率增强稳定性。

back_log = 384
指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。 back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。

key_buffer_size = 32M

key_buffer_size这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 — 记住,MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。尽管如此,需要总是检查是否所有的 key_buffer 都被利用了 — .MYI 文件只有 1GB,而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表,那么也保留低于 16-32MB 的key_buffer_size 以适应给予磁盘的临时表索引所需。

innodb_buffer_pool_size = 2.4G
#这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。– 如果你的数据量不大,并且不会暴增,那么无需把innodb_buffer_pool_size 设置的太大了。

innodb_additional_pool_size = 20M
#这个选项对性能影响并不太多,至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大),因此就需要看一下Innodb其他需要分配的内存有多少。

innodb_log_file_size = 512M
#在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但是要注意到可能会增加恢复时间。我经常设置为64-512MB,根据服务器大小而异。

innodb_log_buffer_size =16M
#默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高了,可能会浪费内存 — 它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间。通常8-16MB就足够了。越小的系统它的值越小。

innodb_flush_logs_at_trx_commit = 2
#是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置为0就快很多了,不过也相对不安全了 — MySQL服务器崩溃时就会丢失一些事务。设置为2指挥丢失刷新到操作系统缓存的那部分事务。

max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。

read_buffer_size = 4M
#读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!

join_buffer_size = 8M
#联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!

myisam_sort_buffer_size = 64M
table_cache = 512
#打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁,所以通常要加大缓存数量,使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。我曾经见过设置为100,000的情况。

thread_cache_size = 64
#线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。

query_cache_size = 64M
#指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察:

> SHOW VARIABLES LIKE ‘%query_cache%’;

> SHOW STATUS LIKE ‘Qcache%’;

如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。

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

max_connect_errors = 10000000
wait_timeout = 10
#指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

thread_concurrency = 8
#该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4 × 2 = 8

skip-networking
#开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

show status 命令
含义如下:
aborted_clients 客户端非法中断连接次数
aborted_connects 连接mysql失败次数
com_xxx xxx命令执行次数,有很多条
connections 连接mysql的数量
Created_tmp_disk_tables 在磁盘上创建的临时表
Created_tmp_tables 在内存里创建的临时表
Created_tmp_files 临时文件数
Key_read_requests The number of requests to read a key block from the cache
Key_reads The number of physical reads of a key block from disk
Max_used_connections 同时使用的连接数
Open_tables 开放的表
Open_files 开放的文件
Opened_tables 打开的表
Questions 提交到server的查询数
Sort_merge_passes 如果这个值很大,应该增加my.cnf中的sort_buffer值
Uptime 服务器已经工作的秒数

提升性能的建议:
1.如果opened_tables太大,应该把my.cnf中的table_cache变大
2.如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率
3.如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥索引的键的作用
4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率
5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的

MySQL性能调优

连接:max_connections, max_packet_allowed, aborted_connects, thread_cache_size
查询缓存(MySQL缓存查询中包括两个解析查询计划,以及返回的数据集,如果基础表数据或结构有变化,将会使查询缓存中的项目无效)
临时表:调整查询让结果集更小(better)以实现内存排序,或将变量设置的更大(tmp_table_size, max_heap_table_size),有BLOB或TEXT字段类型的表将直接卸入磁盘
会话内存:会话内存按需分配,需要关注顶级会话的VIRT列
慢速查询日志:查询记录什么样的SQL语句造成查询时间过慢(微秒级),需要排出阻塞影响
读写优先:MySQL提供语句调节符,允许你修改它的调度策略
引擎和锁:memory, mysiam,innodb,inforbright,monetdb
禁止死锁检测来提高高并发MySQL性能:事务会递归检测死锁,禁止死锁检测后,及时死锁发生,也不会回滚事务,而是全部等待到超时
主从复制,amoeba读写分离,实现业务分库分表(应用一致性强的,不能用主从复制,需要分库分表,一般写后不允许马上读数据,主从复制需要时间)

back_log参数的作用

指定MySQL可能的TCP/IP的连接数量(一个TCP/IP连接占256k),默认是50。
当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听accept队列的大小。
不同的操作系统在这个accept队列大小上有它自己的限制,设定back_log高于你的操作系统的限制将是无效的。

参考值:

back_log=300
# 或
back_log=500

thread_cache_size参数的作用

thread_cache_size线程池,线程缓存。这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能。
每建立一个连接,都需要一个线程来与之匹配,此参数用来缓存空闲的线程,以至不被销毁,如果线程缓存中有空闲线程,这时候如果建立新连接,MYSQL就会很快的响应连接请求。
可根据物理内存设置规则如下:
1G ―> 8
2G ―> 16
3G ―> 32
大于3G ―> 64

参考值:

thread_cache_size = 64

mysql> show variables like 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 10    |
+-------------------+-------+

mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 9     |
| Threads_connected | 2     |
| Threads_created   | 12    |
| Threads_running   | 2     |
+-------------------+-------+

set global thread_cache_size=64

table_open_cache参数的作用

table_open_cache,表高速缓存的大小。

当某一连接访问一个表时,MySQL会检查当前已缓存表的数量。如果该表已经在缓存中打开,则会直接访问缓存中的表已加快查询速度;如果该表未被缓存,则会将当前的表添加进缓存并进行查询。

在执行缓存操作之前,table_cache用于限制缓存表的最大数目:如果当前已经缓存的表未达到table_cache,则会将新表添加进来;若已经达到此值,MySQL将根据缓存表的最后查询时间、查询率等规则释放之前的缓存。

参考值:

table_open_cache=1024

学习笔记

###CPU的优化

# innodb_thread_concurrency设置的值约等CPU数
innodb_thread_concurrency=32

# 连接的优化

内存的优化

# 关闭查询缓存,缓存到应用层(如redis),不建议在MYSQL层面开始,5.6有BUG
query_cache_type=0
query_cache_size=0

IO的优化

# 单实例时物理内存的60-70%
innodb_buffer_pool_size=50G

# 每秒后台进程处理IO数据的上限,一般设置总IO的75%左右。 SSD设置成20000
innodb_io_capacity=20000

# innodb redo日志组数量(iblog)
innodb_log_files_in_group=4

# innodb redo日志组文件大小
innodb_log_file_size=1000M

# RAID使用直接写,提高性能
innodb_flush_method=O_DIRECT

# 脏页达到50%就写磁盘
innodb_max_dirty_pages_pct=50

# 设置一个表对应一个文件,保持默认
innodb_file_per_table=on

# 设置PAGE大小(默认16k)
innodb_page_size=4k

# SSD盘设置为0
innodb_flush_neighbors=0

连接的优化

# 指定MySQL可能的TCP/IP的连接数量,现在一般都是长连接,这个值不建议设置过大
back_log=300

# 最大的连接数
max_connections=3000

# 最大的用户连接数(和上面差20,是留给管理用的)
max_user_connections=2980

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

# 线程池,线程缓存
thread_cache_size=512

# 连接超时断开
wait_timeout=120

# 交互超时断开
interactive_timeout=120

数据库一致性优化

innodb_flush_log_at_trx_commit=1
sync_binlog=1

###3.
默认的配置本人持鄙视态度,所以要自己配置

创建配置: /etc/my.cnf

# The following options will be passed to all MySQL clients
[client]
#password    = your_password
port        = 3306
socket        = /var/lib/mysql/mysql.sock
default-character-set=utf8
#character-set-client = gbk

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port        = 3306
socket        = /var/lib/mysql/mysql.sock
datadir = /usr/mysql/data
skip-external-locking
lower_case_table_names=1
character-set-server = utf8

#skip_name_resolve

#key_buffer_size = 16M
#他人经验值,查询排序时所能使用的缓冲区大小。所以,对于内存在4GB左右的服务器推荐设置为6-8M。
#sort_buffer_size = 1M


max_allowed_packet = 32M


#使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果
query_cache_size = 32M
#query_cache_type 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。
#设置 1 代表缓冲永远有效,如果不需要缓冲,就需要使用如下语句:
#SELECT SQL_NO_CACHE * FROM my_table WHERE ...
#如果设置为 2 ,需要开启缓冲,可以用如下语句:
#SELECT SQL_CACHE * FROM my_table WHERE ...
query_cache_type= 1

#要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
#back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中
back_log=100

#临时表的大小(4G配置)
tmp_table_size = 256M

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

#没找到具体说明,不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的
thread_cache_size = 32

#目的待定,他人经验值,
#指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。
interactive_timeout=28800
wait_timeout =28800


#设置为你的cpu数目x2,例如,只有一个cpu,那么thread_concurrency=2
#有2个cpu,那么thread_concurrency=4
thread_concurrency = 8

#增加table_open_cache,会增加文件描述符,当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效
#如果我们把table_open_cache设置小一点,那么mysql会随着table cache的不足,而关闭不用或者少用的表的cache,这样会释放文件描述符
#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。
#通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,
#并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。
#注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。对于有1G内存的机器,推荐值是128-256。
table_open_cache = 256

#读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
read_buffer_size = 4M

#联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
join_buffer_size = 8M

read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
server-id    = 2

# Uncomment the following if you want to log updates
#log_bin指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。
#此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定记录的数据库;使用binlog-ignore-db可以指定不记录的数据库。
#注意的是:binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。
#关掉这个功能只需要在他前面加上#号
#log-bin=mysql-bin

# binary logging format - mixed recommended
#binlog_format=mixed

# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /opt/database/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /opt/database/mysql/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#这是InnoDB最重要的设置,对InnoDB性能有决定性的影响。默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差。在只有InnoDB存储引擎的数据库服务器上面,可以设置60-80%的内存。
#更精确一点,在内存容量允许的情况下面设置比InnoDB tablespaces大10%的内存大小。
innodb_buffer_pool_size = 1G

#作用:指定日值的大小
#分配原则:几个日值成员大小加起来差不多和你的innodb_buffer_pool_size相等。上限为每个日值上限大小为4G.一般控制在几个LOG文件相加大小在2G以内为佳。具体情况还需要看你的事务大小,数据大小为依据。
#说明:这个值分配的大小和数据库的写入速度,事务大小,异常重启后的恢复有很大的关系。
#该参数决定了recovery speed。太大的话recovery就会比较慢,太小了影响查询性能,一般取256M可以兼顾性能和recovery的速度
innodb_log_file_size = 256M

#磁盘速度是很慢的,直接将log写道磁盘会影响InnoDB的性能,该参数设定了log buffer的大小,一般4M。如果有大的blob操作,可以适当增大。
#作用:事务在内存中的缓冲。
#分配原则:控制在2-8M.这个值不用太多的。他里面的内存一般一秒钟写到磁盘一次。具体写入方式和你的事务提交方式有关。在Oracle等数据库了解这个,一般最大指定为3M比较合适。
innodb_log_buffer_size = 5M

#设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1
# 该参数设定了事务提交时内存中log信息的处理。
#1) =1时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。Truly ACID。速度慢。
#2) =2时,在每个事务提交时,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。只有操作系统崩溃或掉电才会删除最后一秒的事务,不然不会丢失事务。
#3) =0时, 日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新。任何mysqld进程的崩溃会删除崩溃前最后一秒的事务
innodb_flush_log_at_trx_commit = 2

#默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
#因为有的锁等待超过了这个时间,所以抱错.
#你可以把这个时间加长,或者优化存储过程,事务避免过长时间的等待.
innodb_lock_wait_timeout = 600

#你的服务器CPU有几个就设置为几,建议用默认一般为8
innodb_thread_concurrency=8


[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 4M

[mysqlhotcopy]
interactive-timeout

`