服务器为硬件dell-R710,硬盘为双SSD硬盘130G,服务器有两颗CPU,单颗cpu为12核,服务器在安装系统时CPU开启了超线程。逻辑cpu为48核。
此服务器为单纯的mysql服务器,此配置文件的参数主要是供笔者平时优化my.cnf作为参考。广大读者切勿直接套用,出现任何问题与笔者无关。
配置文件详细参数 介绍:
[mysqld]
back_log = 2000
此参数默认是:5.6.6以后的版本此参数需要设置此数值:
MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。
在mysql中back_log的设置取决于操作系统,在Linux下这个参数的值不能大于系统参数tcp_max_syn_backlog的值。通过以下命令可以查看tcp_max_syn_backlog的当前值 cat /proc/sys/net/ipv4/tcp_max_syn_backlog。
官网建议不超过900
basedir = /usr/local/mysql
binlog-format = MIXED
character_set_server = utf8
datadir = /data/mysql/data
event_scheduler = ON
开启mysql计划任务:参考资料https://yq.aliyun.com/ziliao/65065
expire_logs_days = 1
innodb_autoinc_lock_mode = 1
参数参考:http://www.cnblogs.com/JiangLe/p/6362770.html
innodb_buffer_pool_size = 1073741824
当我们使用InnoDB存储引擎的时候,innodb_buffer_pool_size 参数可能是影响我们性能的最为关键的一个参数了,他用来设置用于缓存 InnoDB 索引及数据块的内存区域大小,类似于 MyISAM 存储引擎的 key_buffer_size 参数,当然,可能更像是 Oracle 的 db_cache_size。简单来说,当我们操作一个 InnoDB 表的时候,返回的所有数据或者去数据过程中用到的任何一个索引块,都会在这个内存区域中走一遭。
和key_buffer_size 对于 MyISAM 引擎一样,innodb_buffer_pool_size 设置了 InnoDB 存储引擎需求最大的一块内存区域的大小,直接关系到 InnoDB存储引擎的性能,所以如果我们有足够的内存,尽可将该参数设置到足够打,将尽可能多的 InnoDB 的索引及数据都放入到该缓存区域中,直至全部。
我们可以通过 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。
对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。
这个参数和MyISAM的key_buffer_size有相似之处,但也是有差别的。这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲。为Innodb加速优化首要参数。
该参数分配内存的原则:这个参数默认分配只有8M,可以说是非常小的一个值。如果是一个专用DB服务器,那么他可以占到内存的70%-80%。这个参数不能动态更改,所以分配需多考虑。分配过大,会使Swap占用过多,致使Mysql的查询特慢。如果你的数据比较小,那么可分配是你的数据大小+10%左右做为这个参数的值。例如:数据大小为50M,那么给这个值分配innodb_buffer_pool_size=64M
设置方法:
innodb_buffer_pool_size=4G
这个参数分配值的使用情况可以根据show innodb status\G;中的
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 4668764894;
去确认使用情况。
innodb_additional_mem_pool:16M
作用:用来存放Innodb的内部目录
这个值不用分配太大,系统可以自动调。不用设置太高。通常比较大数据设置16M够用了,如果表比较多,可以适当的增大。如果这个值自动增加,会在error log有中显示的。
innodb_data_file_path = ibdata1:500M:autoextend
innodb_data_home_dir = /data/mysql/data
innodb_file_per_table = 1
线上最好开启独立表空间
参数解释http://www.ttlsa.com/mysql/innodb-innodb_file_per_table/
innodb_flush_log_at_trx_commit = 2
主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。
实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。
根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。
innodb_flush_log_at_timeout:参考地址:http://www.xuchanggang.cn/archives/567.html
innodb_flush_method = O_DIRECT
参数意义参考地址:
http://blog.csdn.net/gua___gua/article/details/44916207
通常来说,linux环境下具有raid控制器和write-back写策略,o_direct是比较好的选择
有数据表明,如果是大量随机写入操作,O_DIRECT会提升效率。但是顺序写入和读取效率都会降低。所以使用O_DIRECT需要谨慎。
参考地址:http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/
innodb_io_capacity = 2000
参考地址:http://wubx.net/innodb-io-optimize-conf/
innodb_log_buffer_size = 8388608
作用:事务在内存中的缓冲。
分配原则:控制在2-8M.这个值不用太多的。他里面的内存一般一秒钟写到磁盘一次。具体写入方式和你的事务提交方式有关。在Oracle等数据库了解这个,一般最大指定为3M比较合适。
参考:Innodb_os_log_written(show global status 可以拿到)
如果这个值增长过快,可以适当的增加innodb_log_buffer_size
另外如果你需要处理大理的TEXT,或是BLOB字段,可以考虑增加这个参数的值。
设置方法:
innodb_log_buffer_size=8M
此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间
参考地址:http://imysql.cn/node/609
innodb_log_files_in_group = 3
innodb_log_files_in_group
作用:指定你有几个日值组。
分配原则: 一般我们可以用2-3个日值组。默认为两个。
innodb_log_group_home_dir = /data/mysql/data
innodb_max_dirty_pages_pct = 50
参考:http://imysql.cn/node/609
作用:控制Innodb的脏页在缓冲中在那个百分比之下,值在范围1-100,默认为90.
这个参数的另一个用处:当Innodb的内存分配过大,致使Swap占用严重时,可以适当的减小调整这个值,使达到Swap空间释放出来。建义:这个值最大在90%,最小在15%。太大,缓存中每次更新需要致换数据页太多,太小,放的数据页太小,更新操作太慢。
设置方法:
innodb_max_dirty_pages_pct=90
动态更改需要有Super权限:
set global innodb_max_dirty_pages_pct=50;
innodb_open_files = 1024
作用:限制Innodb能打开的表的数据。
分配原则:如果库里的表特别多的情况,请增加这个。这个值默认是300。
设置方法:
innodb_open_files=800
请适当的增加table_cache
innodb_file_io_threads=4
innodb_file_io_threads
作用:文件读写IO数,这个参数只在Windows上起作用。在LINUX上只会等于4
设置方法:
假如CPU是2颗8核的,那么可以设置:
innodb_read_io_threads = 8
innodb_write_io_threads = 8
如果数据库的读操作比写操作多,那么可以设置:
innodb_read_io_threads = 10
innodb_write_io_threads = 6
参数意义参考:http://www.cnblogs.com/xinysu/p/6439715.html
http://ourmysql.com/archives/1290
innodb_thread_concurrency = 20
innodb_lock_wait_timeout = 10
innodb_buffer_pool_load_at_startup = 1
默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。
innodb_buffer_pool_dump_at_shutdown = 1
默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
如果一台高负荷的机器重启后,内存中大量的热数据被清空,此时就会重新从磁盘加载到Buffer_Pool缓冲池里,这样当高峰期间,性能就会变得很差,连接数就会很高。
在MySQL5.6里,一个新特性避免的这种问题的出现。
只有在正常关闭MySQL服务,或者pkill mysql时,会把热数据dump到内存。机器宕机或者pkill -9 mysql,是不会dump。
参考地址:httphttp://gfsunny.blog.51cto.com/990565/1553591
key_buffer_size = 3221225472
参数参考:
key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。
key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。
innodb_log_file_size = 1G
# 此参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间
参考地址:http://www.itpub.net/thread-1850609-1-1.html
local_infile = 1
要支持命令load data local infile,应当在/etc/mysql/my.cnf中添加这样的设置
否则,mysql服务会提示错误:
ERROR 1148 (42000): The used command is not allowed with this MySQL version.
log-bin = /data/mysql/binlog/mysql-bin
log_bin_trust_function_creators = 1
参数参考:http://www.cnblogs.com/flying607/p/5576584.html
log_output = FILE
long_query_time = 1
log-error = /data/mysql/log/error.log
max_allowed_packet = 134217728
max_connect_errors = 1000000
max_connections = 2000
max_connections:MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,MySql会为每个连接提供连接缓冲区,就会开销越多的内存,连接数太大,服务器消耗的内存越多,以至于影响服务器性能,所以要根据服务器的配置适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
show variables like 'max_connections' 最大连接数,show status like 'max_used_connections'响应的连接数。
max_used_connections / max_connections * 100%(理想值≈ 85%),如果max_used_connections跟max_connections相同,那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大
myisam_sort_buffer_size = 33554432
myisam_recover = 1
join_buffer_size = 8388608
tmp_table_size = 33554432
net_buffer_length = 8192
每个客户端线程都与一个connection连接缓冲区和结果缓冲区相关联,默认值是16K。两者最初的大小都是net_buffer_length,
但是根据需要会动态的扩大到max_allowed_packet设置的大小,结果缓冲区在每一个sql语句执行后都会缩小到设置的net_buffer_length
performance_schema = 1
performance_schema_max_table_instances = 200
能够有效降低内存占用。
pid-file = /data/mysql/mysqld.pid
port = 3306
query_cache_size = 0
使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。
通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。
与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。
query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。
query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。
query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。
query_cache_type = 0
read_buffer_size = 20971520
# MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
# 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能
read_rnd_buffer_size = 16M
# MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,
# MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大
max_heap_table_size = 33554432
定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变
tmp_table_size = 16M
# MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。
# 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。
# 如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果
bulk_insert_buffer_size = 134217728
和key_buffer_size一样,这个参数同样也仅作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。
#relay-log = /data/mysql/log/mysql-relay.log
secure-file-priv = /data/mysql/tmp
server-id = 1131053306
skip-slave-start
slave复制进程不随mysql启动而启动skip-slave-start参数
参考地址:http://www.2cto.com/database/201307/230420.html
skip_name_resolve
slave-load-tmpdir = /data/mysql/tmp
slow-query-log-file = /data/mysql/log/mysql-slow.log
slow_query_log = 1
socket = /data/mysql/mysqld.sock
sort_buffer_size = 2097152(2M)
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),可改为16777208 (16M)。
table_open_cache = 128
参数介绍参考地址:http://www.cnblogs.com/fjping0606/p/6531292.html
table_open_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。
通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_open_cache的值。
如果你发现open_tables等于table_open_cache,并且opened_tables在不断增长,那么你就需要增加table_open_cache的值了(上述状态值可通过SHOW GLOBAL STATUS LIKE ‘Open%tables’获得)。
注意,不能盲目地把table_open_cache设置成很大的值,设置太大超过了shell的文件描述符(通过ulimit -n查看),造成文件描述符不足,从而造成性能不稳定或者连接失败。
mysql> show variables like '%table_open_cache%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| table_open_cache | 128 |
| table_open_cache_instances | 1 |
+----------------------------+-------+
mysql> SHOW GLOBAL STATUS LIKE 'Open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 79 |
| Opened_tables | 112 |
+---------------+-------+
2 rows in set (0.00 sec)
发现open_tables为79,table_open_cache为128
比较适合的值:
Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95
thread_cache_size = 50
tmpdir = /data/mysql/tmp
user = mysql
wait_timeout = 2880000
transaction_isolation=read-committed
事务隔离级别
long_query_time=1
sync_binlog=0
innodb_flush_log_at_trx_commit=0
分配原则:这个参数只有3个值,0,1,2请确认一下自已能接受的级别。默认为1,主库请不要更改了。
[mysqld_safe]
log-error = /data/mysql/log/error.log
pid-file = /data/mysql/mysqld.pid
参考地址:http://blog.csdn.net/tonyxf121/article/details/7985517
http://blog.csdn.net/qq_22929803/article/details/51237056
参考地址:老叶茶馆http://imysql.com/my_cnf_generator