最近把MySQL升级到了5.6版本,无意中在任务管理器发现MySQL内存占用达到400+M,这是怎么回事呢?以前的版本可没有遇到过这种情况啊。开始的时候还以为是缓存了某个数据量较大的表的数据。于是重启MySQL服务,但结果出乎意料,MySQL服务一起启动,内存就又飙升到400+M。心想,这肯定不是缓存的那个表数据的问题了。接下来就是寻找解决MySQL 5.6 内存占用过高这个问题的解决方案了。 经过实验测试,修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下:
performance_schema_max_table_instances=400
table_definition_cache=400
table_open_cache=256
你如果在my.ini这个文件没中找到以上配置选项,则追加到该文件中即可。 完成以上配置的修改,重启MySQL服务。这个MySQL的内存占用从修改前的400+M直接降到40+M。 再也不会担心MySQL占用内存过高的问题啦^_^
vps的内存为512M,安装好nginx,php等启动起来,mysql死活启动不起来看了日志只看到对应pid被结束了,后跟踪看发现是内存不足被killed;
调整my.cnf 参数,重新配置(系统默认配置太高直接占用400M内存,小玩家玩不起呢)即可
performance_schema_max_table_instances=200
table_definition_cache=200
table_open_cache=128
下面附一个相关的my.cnf配置文件的说明
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1 #表示是本机的序号为1,一般来讲就是master的意思
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
#skip-networking
back_log = 600
# 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