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 

我该如何解决这个问题?

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

 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下行添加到/etc/pam.d/common-session来设置pam会话限制:

 session required pam_limits.so 

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

你可能遇到的事情是,MySQL引擎没有设置其变量“打开文件限制”的权利。

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

即使已将限制设置为较高的值,可能也会将其设置为1024。

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

干杯

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

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

重新启动mysql应该会导致这个问题消失(尽管可能会再次发生,除非底层问题得到解决)。

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

您也可以安装“ lsof ”(LiSt打开文件)命令来查看文件< – >进程关系。

将–single_transaction添加到您的mysqldump命令

我认为没有必要配置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 

在my.cnf和mysqld restart中添加“open_files_limit = 4096”后,我得到:

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

12345和23456当然是mysqld进程的PID。

SHOW VARIABLES LIKE'open_files_limit'show show 4096 now。

所有看起来不错,而“ulimit”显示没有变化:

 \# su - mysql -c bash \# ulimit -n 1024 

不能保证“24”是一个操作系统级的错误号,所以不要以为这意味着太多的文件句柄是打开的。 这可能是一些在mysql本身内部使用的内部错误代码。 我建议询问关于这个的MySQL邮件列表。