MySQL之my.cnf配置文件优化
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
#[client]port = 3306socket = /tmp/mysql.sockdefault-character-set = utf8[mysql]no-auto-rehash #仅允许使用键值的updates和deletes[mysqld]port = 3306 #msyql服务器端口号basedir = /usr/local/mysql #mysql安装目录datadir = /usr/local/mysql/data #mysql数据存放目录#datadir = /data/mysql/data #同上socket = /usr/local/mysql/data/mysql.sock #sock文件#字符集与校对规则character-set-server = utf8 #默认字符集collation-server = utf8_general_ci #设置校对规则external-locking = FALSE #避免外部锁定(减少出错几率,增加稳定性)skip-name-resolv #禁止外部连接进行DNS解析skip-slave-start # 复制进程就不会随着数据库的启动而启动 http://blog.csdn.net/aeolus_pu/article/details/9419965 #master库binlog参数相关server-id = 1 #主从复制时,ID不能相同#binlog_format = mixed #二进制日志格式(mixed、row、statement)binlog-cache-size = 32M #设置二进制日志缓存大小sync-binlog = 1 #每隔N秒将缓存中的二进制日志记录写回硬盘max_binlog_cache_size = 8M #最大的二进制Cache日志缓冲尺寸max_binlog_size = 1G #单个二进制日志文件的最大值,默认1G,最大1Glog-bin-index = /usr/local/mysql/data/mysql-bin.index #binlog索引文件位置log-bin = /usr/local/mysql/data/mysql-bin #binlog日志存放目录expire_logs_days = 90 #二进制日志文件过期时间#slave数据库binlog参数server-id = 10 #各数据库id不能相同log_slave_updates = 1 #级联也使用relay-log = /usr/lcoal/mysql/data/relay-bin #relady目录relay-log-info-file = /usr/local/mysql/data/relay-log.info #info目录slave-skip-errors = 1007,1008,1032,1062 #跳过主从复制时的错误read-only = 1 #从服务器只读,SQL线程不影响,具有super,root用户不限制master-connect-retry = 60 #主从复制丢失,重连间隔时间,默认60s#replicate-ignore-db = mysql #忽略mysql库不同步replicate-wild-do-table=testdb1.%replicate-wild-do-table=testdb2.%replicate-wild-do-table=testdb3.%#master半同步开启参数rpl_semi_sync_master_enabled = ONrpl_semi_sync_master_timeout = 10000#rpl_semi_sync_master_wait_no_slave = ON#rpl_semi_sync_master_trace_level = 32#slave半同步开启参数rpl_semi_sync_slave_enabled = ON#rpl_semi_sync_slave_trace_level = 32back_log = 1000 #指出在MySQL暂时停止响应新请求之前,短时间内的多少个请求open_files_limit = 1024 #打开文件的最大个数,如果出现too mantopen files之类的就需要调整该值了#连接相关max_connections = 2000 #指定MySQL允许的最大连接进程数,show global variables like '%connections%'; http://elf8848.iteye.com/blog/1847445 max_user_connections = 2000 #单用户最大的连接数,max_user_connections < 实例 max_user_connections < max_connectionsmax_connect_errors = 100000 #默认为10,设置每个主机的连接请求异常中断的最大次数,超过后会blocked,连接成功后初始0,出现错误后需要flush hostsmax_allowed_packet = 8M #服务器一次能处理的最大的查询包的值wait_timeout = 360 #指定一个请求的最大连接时间interactive_timeout = 360 #连接保持活动的时间#访问日志#general_log = on#general_log_file = /usr/local/mysql/data/mysql_access.log#错误日志log_error = /data/mysql/data/mysql_error.log#慢查询相关参数slow_query_log = on #开启慢查询log-queries-not-using-indexes #记录所有没有使用到索引的查询语句long_query_time = 2 #指定多少秒未返回结果的查询属于慢查询min_examined_row_limit = 5 #记录那些由于查找了多余5次而引发的慢查询log-slow-admin-statements #记录那些慢的OPTIMIZE TABLE,ANALYZE TABLE和ALTER TABLE语句log-slow-slave-statements #记录由slave所产生的慢查询slow_query_log_file = /usr/local/mysql/data/slow.log #指定慢查询日志文件路径table_cache = 614 #表分配的内存,物理内存越大,设置就越大table_open_cache = 512 #设置高速缓存表的数目thread_cache_size = 64 #服务器线程缓存数,与内存大小有关(建议大于3G设置为64)thread_concurrency = 32 #CPU核数的两倍query_cache_size = 32M #指定MySQL查询缓冲区的大小query_cache_limit = 2M #只有小于此设置值的结果才会被缓存query_cache_min_res_unit = 2k #设置查询缓存分配内存的最小单位key_buffer_size = 512M #指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能sort_buffer_size = 2M #设置查询排序时所能使用的缓冲区大小,系统默认大小为2MBjoin_buffer_size = 1M #联合查询操作所能使用的缓冲区大小read_buffer_size = 4M #读查询操作所能使用的缓冲区大小read_rnd_buffer_size = 16M #设置进行随机读的时候所使用的缓冲区thread_stack = 192K #设置Mysql每个线程的堆栈大小,默认值足够大,可满足普通操作bulk_insert_buffer_size = 8M #可以适当调整参数至16MB~32MB,建议8MB#myisam参数引擎相关myisam_sort_buffer_size = 128Mmyisam_max_sort_file_size = 10Gmyisam_repair_threads = 1myisam_recover #自动检查和修复没有适当关闭的MyISAM表key_buffer_size = 16M #myisam索引buffer,只有key没有datatransaction_isolation = READ-COMMITTED #事务隔离级别tmp_table_size = 64M #设置内存临时表最大值max_heap_table_size = 64M #独立的内存表所允许的最大容量#innodb引擎参数相关default-storage-engine=InnoDB #默认表的类型为InnoDBinnodb_old_blocks_time =1000 #减小单次的大批量数据查询,默认为0,调整后性能提升80% http://www.cnblogs.com/cenalulu/archive/2012/10/10/2718585.html innodb_flush_method = O_DIRECT #从innode刷新到磁盘,不经过系统write,fdatasync(默认),O_DSYNC,O_DIRECT http://blog.csdn.net/jiao_fuyou/article/details/16113403 innodb_additional_mem_pool_size = 16M #设置InnoDB存储的数据目录信息和其他内部数据结构的内存池大小innodb_buffer_pool_size = 51G #InnoDB使用一个缓冲池来保存索引和原始数据,官方建议物理内存的80%innodb_data_file_path = ibdata1:128M:autoextend #表空间innodb_file_io_threads = 4 #InnoDB中的文件I/O线程,通常设置为4,innodb除master线程外,还有insert buffer, log, read, write这4种线程,默认各有一个innodb_read_io_threads = 8innodb_write_io_threads = 8innodb_thread_concurrency = 8 #服务器有几个CPU就设置为几,建议用默认设置,一般设为8innodb_flush_log_at_trx_commit = 2 #设置为0就等于innodb_log_buffer_size队列满后再统一存储,默认为1innodb_log_buffer_size = 16M #默认为1MB,通常设置为6-8MB就足够innodb_log_file_size = 512M #确定日志文件的大小,更大的设置可以提高性能,但也会增加恢复数据库的时间innodb_log_files_in_group = 3 #为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3innodb_max_dirty_pages_pct = 90 #InnoDB主线程刷新缓存池中的数据innodb_lock_wait_timeout = 120 #InnoDB事务被回滚之前可以等待一个锁定的超时秒数innodb_file_per_table = 1 #InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间,0关闭,1开启innodb_autoextend_increment = 256 #这个参数的作用是控制innodb 共享表空间文件自动扩展的大小[mysqldump]quickmax_allowed_packet = 64M[mysqld_safe]log-error = /usr/local/mysql/data/mysql.errpid-file = /usr/local/mysql/data/mysqld.pid查询innodb分配资源mysql> show engine innodb status;----------------------BUFFER POOL AND MEMORY----------------------Total memory allocated 137363456; in additional pool allocated 0Dictionary memory allocated 59957Buffer pool size 8191Free buffers 8028Database pages 163Old database pages 0Modified db pages 0Pending reads 0Pending writes: LRU 0, flush list 0, single page 0Pages made young 0, not young 00.00 youngs/s, 0.00 non-youngs/sPages read 163, created 0, written 10.00 reads/s, 0.00 creates/s, 0.00 writes/sNo buffer pool page gets since the last printoutPages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/sLRU len: 163, unzip_LRU len: 0I/O sum[0]:cur[0], unzip sum[0]:cur[0]我们使用的是专用于MySQL的(5.5 Percona的)上运行CentOS的(不同口味),主要128GB的服务器。我们innodb_buffer_pool_size设置为104GB这些和他们也有/ tmp目录8GB的内存磁盘。他们被大量使用,但从未使用过任何的交换。当然vm.swappiness设置为1,下面就是我们用较低层的服务器(包括128GB为简洁起见),他们又从来没有使用过任何掉期和运行大型数据库(2-3TB):128GB RAM:innodb_buffer_pool_size = 104GB64GB RAM:innodb_buffer_pool_size = 56G32GB RAM:innodb_buffer_pool_size = 28G在大多数情况下,我们分配(N - 7G)* 0.9。所以对于一个64G的节点,我们最终分配给缓冲池内存〜51G64GB RAM:innodb_buffer_pool_size = 51Ghttps://www.percona.com/blog/2015/06/02/80-ram-tune-innodb_buffer_pool_size/ http://osxr.org:8080/mysql/ident?_i=back_log&_remember=1 王导DBA MySQL优化log_error = localhost3306.errsync_binlog=1innodb_old_blocks_time =1000innodb_flush_method = O_DIRECTback_log=1000max_connections = 2000max_user_connections=2000min_examined_row_limit =5skip-slave-startskip-name-resolvemax_connect_errors = 100000character-set-server=utf8collation-server=utf8_binbinlog_cache_size=32Mquery_cache_limit = 2Mtmp_table_size=256Mmax_heap_table_size=256Minteractive_timeout=360wait_timeout=360log_slave_updates=1expire_logs_days=60binlog_format=mixedtmpdir=/dev/shminnodb_autoextend_increment = 256innodb_buffer_pool_instances=8innodb_additional_mem_pool_size=128Minnodb_max_dirty_pages_pct=80innodb_read_io_threads = 8innodb_write_io_threads = 8innodb_log_file_size = 1Ginnodb_log_files_in_group = 2innodb_flush_log_at_trx_commit = 2innodb_file_per_table=1 |
这个参数最关键
innodb_flush_log_at_trx_commit = 2
一、参数解释
0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
二、参数修改
找到mysql配置文件mysql.ini,修改成合适的值,然后重启mysql。
三、注意事项
当设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。。
当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。

浙公网安备 33010602011771号