MySQL 更新服务器后无法打开文件:errno:24

MySQL 更新服务器后无法打开文件:errno:24

乌本图: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- 带来解决方案:

  1. 检查 /lib/systemd/system/mysql.service 或 /lib/systemd/system/mysqld.service 是否存在
  2. (就我而言)如果没有,请创建 /lib/systemd/system/mysql.service 并将内容复制到此文件https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/comments/11并在文件的某处添加两行

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. 如果一个或两个文件存在,请检查是否包含这两行:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. 执行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

感谢您提供的解决方法。但对我来说,这个问题已经被另外两个事实所掩盖。

  1. 我的数据目录与默认安装不同。出于多种原因,包括历史原因和技术原因。
  2. 我从一个非常旧的安装进行升级,该安装经历了多次反向和向前移植。在首次启动新安装的 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

然后服务器开始显示数据库,但无法访问某些表。您通过增加限制的解决方法解决了其余问题,谢谢!

相关内容