English 中文(简体)
Ubuntu 8.04上太多打开文件错误
原标题:
  • 时间:2009-02-02 08:30:58
  •  标签:
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

我该怎么解决这个问题?

问题回答

首先,要识别特定的用户或组限制,你必须做以下事情:

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 /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

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

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

You can see how many files are you allowing mysql to open mysql> SHOW VARIABLES;

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

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

干杯 (gān bēi)

在您的mysqldump命令中添加--single_transaction。

这也可能是由于某些访问表的代码没有正确关闭导致,在一段时间内打开的文件数量达到了上限。

请参考http://dev.mysql.com/doc/refman/5.0/en/table-cache.html,可能也是一个原因。

重新启动MySQL应该可以解决这个问题(尽管除非修复了潜在问题,否则可能会再次发生)。

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

您也可以安装“lsof”(列出打开文件)命令来查看文件与进程之间的关系。

我认为不需要配置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,当然是。

显示变量像open_files_limit现在显示4096。

一切看起来都很正常,但是“ulimit”未显示任何更改:

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

没有保证“24”是操作系统级别的错误数字,因此不要认为这意味着打开了太多文件句柄。它可能是mysql内部使用的某种类型的内部错误代码。我建议在mysql邮件列表上就此问题提问。





相关问题
热门标签