安装完 MySQL 后必须调整的 10 项配置

当咱们被人雇来监测MySQL性能时,人们但愿咱们可以检视一下MySQL配置而后给出一些提升建议。许多人在过后都很是惊讶,由于咱们建议他们仅仅改动几个设置,即便是这里有好几百个配置项。这篇文章的目的在于给你一份很是重要的配置项清单。html

咱们曾在几年前在博客里给出了这样的建议,可是MySQL的世界变化实在太快了!mysql


写在开始前…

即便是经验老道的人也会犯错,会引发不少麻烦。因此在盲目的运用这些推荐以前,请记住下面的内容:redis

  • 一次只改变一个设置!这是测试改变是否有益的惟一方法。sql

  • 大多数配置能在运行时使用SET GLOBAL改变。这是很是便捷的方法它能使你在出问题后快速撤销变动。可是,要永久生效你须要在配置文件里作出改动。数据库

  • 一个变动即便重启了MySQL也没起做用?请肯定你使用了正确的配置文件。请肯定你把配置放在了正确的区域内(全部这篇文章提到的配置都属于 [mysqld])缓存

  • 服务器在改动一个配置后启不来了:请肯定你使用了正确的单位。例如,innodb_buffer_pool_size的单位是MB而max_connection是没有单位的。安全

  • 不要在一个配置文件里出现重复的配置项。若是你想追踪改动,请使用版本控制。服务器

  • 不要用天真的计算方法,例如”如今个人服务器的内存是以前的2倍,因此我得把全部数值都改为以前的2倍“。并发


基本配置

你须要常常察看如下3个配置项。否则,可能很快就会出问题。async

innodb_buffer_pool_size:这是你安装完InnoDB后第一个应该设置的选项。缓冲池是数据和索引缓存的地方:这个值越大越好,这能保证你在大多数的读取操做时使用的是内存而不是硬盘。典型的值是5-6GB(8GB内存),20-25GB(32GB内存),100-120GB(128GB内存)。

innodb_log_file_size这是redo日志的大小。redo日志被用于确保写操做快速而可靠而且在崩溃时恢复。一直到MySQL 5.1,它都难于调整,由于一方面你想让它更大来提升性能,另外一方面你想让它更小来使得崩溃后更快恢复。幸运的是从MySQL 5.5以后,崩溃恢复的性能的到了很大提高,这样你就能够同时拥有较高的写入性能和崩溃恢复性能了。一直到MySQL 5.5,redo日志的总尺寸被限定在4GB(默承认以有2个log文件)。这在MySQL 5.6里被提升。

一开始就把innodb_log_file_size设置成512M(这样有1GB的redo日志)会使你有充裕的写操做空间。若是你知道你的应用程序须要频繁的写入数据而且你使用的时MySQL 5.6,你能够一开始就把它这是成4G。

max_connections:若是你常常看到‘Too many connections’错误,是由于max_connections的值过低了。这很是常见由于应用程序没有正确的关闭数据库链接,你须要比默认的151链接数更大的值。max_connection值被设高了(例如1000或更高)以后一个主要缺陷是当服务器运行1000个或更高的活动事务时会变的没有响应。在应用程序里使用链接池或者在MySQL里使用进程池有助于解决这一问题。

InnoDB配置

从MySQL 5.5版本开始,InnoDB就是默认的存储引擎而且它比任何其余存储引擎的使用都要多得多。那也是为何它须要当心配置的缘由。

innodb_file_per_table:这项设置告知InnoDB是否须要将全部表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON)。每张表一个文件容许你在drop、truncate或者rebuild表时回收磁盘空间。这对于一些高级特性也是有必要的,好比数据压缩。可是它不会带来任何性能收益。你不想让每张表一个文件的主要场景是:有很是多的表(好比10k+)。

MySQL 5.6中,这个属性默认值是ON,所以大部分状况下你什么都不须要作。对于以前的版本你必需在加载数据以前将这个属性设置为ON,由于它只对新建立的表有影响。



innodb_flush_log_at_trx_commit:默认值为1,表示InnoDB彻底支持ACID特性。当你的主要关注点是数据安全的时候这个值是最合适的,好比在一个主节点上。可是对于磁盘(读写)速度较慢的系统,它会带来很巨大的开销,由于每次将改变flush到redo日志都须要额外的fsyncs。将它的值设置为2会致使不太可靠(reliable)由于提交的事务仅仅每秒才flush一次到redo日志,但对于一些场景是能够接受的,好比对于主节点的备份节点这个值是能够接受的。若是值为0速度就更快了,但在系统崩溃时可能丢失一些数据:只适用于备份节点。

innodb_flush_method: 这项配置决定了数据和日志写入硬盘的方式。通常来讲,若是你有硬件RAID控制器,而且其独立缓存采用write-back机制,并有着电池断电保护,那么应该设置配置为O_DIRECT;不然,大多数状况下应将其设为fdatasync(默认值)。sysbench是一个能够帮助你决定这个选项的好工具。

innodb_log_buffer_size: 这项配置决定了为还没有执行的事务分配的缓存。其默认值(1MB)通常来讲已经够用了,可是若是你的事务中包含有二进制大对象或者大文本字段的话,这点缓存很快就会被填满并触发额外的I/O操做。看看Innodb_log_waits状态变量,若是它不是0,增长innodb_log_buffer_size。

其余设置

query_cache_size: query cache(查询缓存)是一个众所周知的瓶颈,甚至在并发并很少的时候也是如此。 最佳选项是将其从一开始就停用,设置query_cache_size = 0(如今MySQL 5.6的默认值)并利用其余方法加速查询:优化索引、增长拷贝分散负载或者启用额外的缓存(好比memcache或redis)。若是你已经为你的应用启用了query cache而且尚未发现任何问题,query cache可能对你有用。这是若是你想停用它,那就得当心了。

log_bin:若是你想让数据库服务器充当主节点的备份节点,那么开启二进制日志是必须的。若是这么作了以后,还别忘了设置server_id为一个惟一的值。就算只有一个服务器,若是你想作基于时间点的数据恢复,这(开启二进制日志)也是颇有用的:从你最近的备份中恢复(全量备份),并应用二进制日志中的修改(增量备份)。二进制日志一旦建立就将永久保存。因此若是你不想让磁盘空间耗尽,你能够用 PURGE BINARY LOGS 来清除旧文件,或者设置 expire_logs_days来指定过多少天日志将被自动清除。

记录二进制日志不是没有开销的,因此若是你在一个非主节点的复制节点上不须要它的话,那么建议关闭这个选项。

skip_name_resolve:当客户端链接数据库服务器时,服务器会进行主机名解析,而且当DNS很慢时,创建链接也会很慢。所以建议在启动服务器时关闭skip_name_resolve选项而不进行DNS查找。惟一的局限是以后GRANT语句中只能使用IP地址了,所以在添加这项设置到一个已有系统中必须格外当心。

总结

固然还有其余的设置能够起做用,取决于你的负载或硬件:在慢内存和快磁盘、高并发和写密集型负载状况下,你将须要特殊的调整。然而这里的目标是使得你能够快速地得到一个稳健的MySQL配置,而不用花费太多时间在调整一些可有可无的MySQL设置或读文档找出哪些设置对你来讲很重要上。

文章转载自:开源中国社区 [http://www.oschina.net] 本文标题:安装完 MySQL 后必须调整的 10 项配置 本文地址:http://www.oschina.net/translate/10-mysql-settings-to-tune-after-installation参与翻译:BoydWang, 美好的2014, DrZ

英文原文:10 MySQL settings to tune after installation

相关文章
相关标签/搜索