关于 mysql too many open files 错误, 网上已经有相当多的文章给出了解决方案:
修改 /etc/security/limits.conf
修改 /etc/mysql/my.cnf
还有的是修改 mysql.service (估计是比较旧的mysql版本了,反正我用的5.6版本里没有找到这个文件)
一开始我也是按照网上的方法来做, 但发现不总是奏效, 经过一番折腾, 总结了以下两种解决方案, 服务器为 Ubuntu 14.04 LTS:
方案一:
mysql版本: 5.6.33
执行 ps aux|grep mysql
如果只有一个与 mysql 有关的进程, 如:
mysql 17697 0.6 7.2 1306876 589920 ? Ssl 16:40 0:01 /usr/sbin/mysqld
那么只需要修改
/etc/mysql/my.cnf 文件
在 [mysqld] 组下面增加一项配置: open_files_limit = 102400
然后 sudo service mysql restart
重启mysql服务就可以了.
方案二:
mysql版本: 5.6.28
执行 ps aux|grep mysql
如果有两个与 mysql 有关的进程, 如:
mysql 14890 0.0 0.0 4440 740 ? S 15:42 0:00 /bin/sh /usr/bin/mysqld_safe
mysql 15609 13.3 9.2 17560864 3038636 ? Sl 15:42 8:24 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
这个时候修改
/etc/mysql/my.cnf 文件是不会起作用的,
至于原因,在mysql的文档里也有提示:
大概意思是说只有以root用户来启动 mysqld_safes 时这个配置项才会起作用.
但是通过 sudo service mysql start 启动 mysql 的时候,其实执行的是脚本
/etc/init.d/mysql, 通过翻阅
这个脚本的代码,我们会发现其实是以mysql这个
用户来启动mysql的:
至于方案一为什么会有效,估计是启动的时候对配置项
处理有些不一样吧.
对于这种情况,我们需要修改两个文件:
sudo vi /etc/security/limits.conf 然后加入以下两行配置
mysql soft nofile 102400
mysql hard nofile 102400
这些配置跟 ulimit 这个命令有关,感兴趣的可自行了解.
为了让上面的配置生效, 还需要修改另外一个文件.
sudo vi /etc/pam.d/common-session 添加配置项
session required pam_limits.so
然后重启 mysql 就可以了.