Ubuntu 8.04上打开的文件太多错误

时间:2009-02-02 08:30:59

标签: mysql linux mysqldump ubuntu-8.04

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

检查shell上的错误24

>>perror 24

OS error code  24:  Too many open files

我该如何解决这个问题?

7 个答案:

答案 0 :(得分: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中,您还需要通过将以下行添加到/etc/pam.d/common-session来设置pam会话限制:

session required pam_limits.so

答案 1 :(得分:8)

相当古老的问题,但这是我的两分钱。

你可能遇到的问题是mysql引擎没有将其变量“open-files-limit”设置为正确。

您可以看到允许mysql打开的文件数量 MySQL的>显示变量;

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

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

干杯

答案 2 :(得分:3)

将--single_transaction添加到mysqldump命令

答案 3 :(得分:1)

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

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

重新启动mysql会导致此问题消失(尽管可能会再次发生,除非修复了基础问题)。

答案 4 :(得分:1)

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

您还可以安装“lsof”(LiSt Open Files)命令来查看文件< - >流程关系。

答案 5 :(得分:1)

我认为没有必要配置PAM。在我的系统上(Debian 7.2 with 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

答案 6 :(得分:0)

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