乌本图:12.04 LTS(Linux mysql02 3.2.0-40-generic #64-Ubuntu SMP 2013 年 3 月 25 日星期一 21:22:10 UTC x86_64 x86_64 x86_64 GNU/Linux)
MySQL的:Ubuntu 发行版 5.5.31
装甲:已移除!
服务器已经稳定运行了一年多。然后这个星期一,MySQL 开始出现故障。更新导致了这个问题,我们不知道它是什么。我们甚至尝试回滚到 MySQL 5.5.30,但没有成功。我们回到了 5.5.31。
MySQL 错误日志条目:
130430 7:55:46 [ERROR] Error in accept: Too many open files
130430 7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430 7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430 7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430 7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430 7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430 7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)
看来我们遇到了 ulimit 问题。我们已完全删除 APPARMOR。我们已增加/etc/security/limits.conf但还是没有运气:
# Out of desperation....
* soft nofile 49152
* hard nofile 65536
# No effect!?!!?
#mysql soft nofile 49152
#mysql hard nofile 65536
并展示限制配置文件工作中:
root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files (-n) 49152
root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files (-n) 65536
以下是我的cnf
[mysqld_safe]
open_files_limit = 16384
[mysqld]
open_files_limit = 16384
然而:
root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit | 1024
我们完全不知所措。任何帮助都将不胜感激。
答案1
操作系统:Ubuntu (Debian) 部署
MySQL 服务器选项:打开文件限制
似乎 Debian暴发户不使用中定义的参数/etc/security/limits.conf,因此当您通过服务命令(因此,在 upstart 下),它会覆盖那些定义的限制并使用默认的 1024。
解决方法是修改mysql.conf定义 upstart 服务的文件,它位于/etc/init/mysql.conf并添加以下几行前这开始前堵塞:
# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000
参考:
答案2
在 Ubuntu 15.10 上遇到了同样的问题。
https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758- 带来解决方案:
- 检查 /lib/systemd/system/mysql.service 或 /lib/systemd/system/mysqld.service 是否存在
(就我而言)如果没有,请创建 /lib/systemd/system/mysql.service 并将内容复制到此文件https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/comments/11并在文件的某处添加两行
LimitNOFILE=infinity LimitMEMLOCK=infinity
如果一个或两个文件存在,请检查是否包含这两行:
LimitNOFILE=infinity LimitMEMLOCK=infinity
- 执行
systemctl daemon-reload
...一切都会好起来的。
答案3
由于以上方法都无法解决我的问题(只会导致系统内存耗尽),所以我找到了以下解决方案:
您/etc/mysql/my.conf
需要增加 MySQL 的内部 open_files_limit。因此暂时将其添加到配置中并重新启动 MySQL。
[mysqld]
open_files_limit = 100000
sudo /etc/init.d/mysql restart
运行该操作后,您将打开的文件过多错误,您可以将配置改回默认配置,然后重新启动 MySQL。
答案4
感谢您提供的解决方法。但对我来说,这个问题已经被另外两个事实所掩盖。
- 我的数据目录与默认安装不同。出于多种原因,包括历史原因和技术原因。
- 我从一个非常旧的安装进行升级,该安装经历了多次反向和向前移植。在首次启动新安装的 MySQL 5.5 时,InnoDB 引擎未激活(配置文件中禁用了内部实现,但以前版本中可用的插件在 5.5 中不存在),并且创建了升级标记,但实际上没有升级任何表。
修复 InnoDB 问题后,仍然出现
mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)
我必须在根控制台中启动 mysqld 并手动重新启动
/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force
然后服务器开始显示数据库,但无法访问某些表。您通过增加限制的解决方法解决了其余问题,谢谢!