12
mysqldump: Couldn't execute 'show fields from `tablename`': Out of resources when opening file './databasename/tablename#P#p125.MYD' (Errcode: 24) (23)

在检查外壳上的错误 24 时,它说

>>perror 24

OS error code  24:  Too many open files

我该如何解决?

4

7 回答 7

20

首先,要确定某些用户或组限制,您必须执行以下操作:

root@ubuntu:~# sudo -u mysql bash
mysql@ubuntu:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 71680
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 71680
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
mysql@ubuntu:~$

重要的一行是:

打开文件 (-n) 1024

如您所见,您的操作系统供应商提供此版本时具有基本的 Linux 配置 - 每个进程 1024 个文件。

对于繁忙的 MySQL 安装来说,这显然是不够的。

现在,要解决此问题,您必须修改以下文件:

/etc/security/limits.conf

mysql             soft    nofile           24000
mysql             hard    nofile           32000

某些版本的 Linux 还需要额外的配置才能使其坚持守护进程而不是登录会话。例如,在 Ubuntu 10.04 中,您还需要通过添加以下行来设置 pam 会话限制/etc/pam.d/common-session

session required pam_limits.so
于 2009-08-26T09:28:02.737 回答
8

一个很老的问题,但这是我的两分钱。

您可能遇到的事情是 mysql 引擎没有正确设置其变量“open-files-limit”。

你可以看到你允许mysql打开多少个文件 mysql> SHOW VARIABLES;

即使您已经将限制设置为更高的值,也可能设置为 1024。

您可以在 mysqld 的命令行中使用选项 --open-files-limit=XXXXX。

干杯

于 2011-02-16T10:54:51.687 回答
3

将 --single_transaction 添加到您的 mysqldump 命令

于 2009-08-10T15:52:18.363 回答
1

也有可能通过访问表的某些代码在一段时间内正确关闭这些表,可以达到打开文件的数量。

有关可能的原因,请参阅http://dev.mysql.com/doc/refman/5.0/en/table-cache.html 。

重新启动 mysql 应该会导致此问题消失(尽管除非根本问题得到修复,否则它可能会再次发生)。

于 2009-02-02T09:02:05.447 回答
1

您可以通过编辑 /etc/security/limits.conf 来增加您的操作系统限制。

您还可以安装“ lsof ”(列出打开文件)命令来查看文件 <-> 进程关系。

于 2009-02-02T10:55:53.423 回答
1

我认为不需要配置 PAM。在我的系统上(Debian 7.2 和 Percona 5.5.31-rel30.3-520.squeeze )我有:

在 my.cnf 更改之前:

\#cat /proc/12345/limits |grep "open files"
Max open files            1186                 1186                 files

将“open_files_limit = 4096”添加到 my.cnf 并重新启动 mysqld 后,我得到:

\#cat /proc/23456/limits |grep "open files"
Max open files            4096                 4096                 files

12345和23456当然是mysqld进程PID。

SHOW VARIABLES LIKE 'open_files_limit' 现在显示 4096。

一切看起来都很好,而“ulimit”没有变化:

\# su - mysql -c bash
\# ulimit -n
1024
于 2013-10-20T15:07:30.527 回答
0

不能保证“24”是操作系统级别的错误号,所以不要假设这意味着打开了太多文件句柄。它可能是 mysql 本身使用的某种类型的内部错误代码。我建议在 mysql 邮件列表上询问这个问题。

于 2009-02-02T08:36:04.407 回答