如果您收到 ERROR '
、file_name
' not found (errno: 23)Can't open file:
或任何其他带有 file_name
(errno: 24)errno 23
或 errno 24
的 MySQL 错误,这意味着您没有为 MySQL 服务器分配足够的 文件描述符。您可以使用 perror 实用程序来获取错误编号的描述
$> perror 23
OS error code 23: File table overflow
$> perror 24
OS error code 24: Too many open files
$> perror 11
OS error code 11: Resource temporarily unavailable
这里的问题是 mysqld 试图同时保持过多的文件打开。您可以告诉 mysqld 不要一次打开那么多文件,或者增加可用于 mysqld 的文件描述符数量。
为了告诉 mysqld 一次保持更少的打开文件,您可以通过减小 table_open_cache
系统变量的值(默认值为 64)来缩小表缓存。这可能并不能完全防止出现文件描述符不足的情况,因为在某些情况下,服务器可能会尝试暂时扩展缓存大小,如 第 10.4.3.1 节,“MySQL 如何打开和关闭表” 中所述。减小 max_connections
的值也会减少打开的文件数量(默认值为 100)。
要更改可用于 mysqld 的文件描述符数量,您可以使用 --open-files-limit
选项启动 mysqld_safe 或设置 open_files_limit
系统变量。请参阅 第 7.1.8 节,“服务器系统变量”。设置这些值的简便方法是在选项文件中添加一个选项。请参阅 第 6.2.2.2 节,“使用选项文件”。如果您使用的是不支持设置打开文件限制的旧版 mysqld,则可以编辑 mysqld_safe 脚本。在脚本中,有一行注释掉的代码 ulimit -n 256。您可以删除 #
字符以取消注释此行,并将数字 256
更改为要为 mysqld 提供的文件描述符数量。
--open-files-limit
和 ulimit 可以增加文件描述符的数量,但只能增加到操作系统施加的限制。还有一个 “硬” 限制,只有在您以 root
身份启动 mysqld_safe 或 mysqld 时才能覆盖(请记住,您还需要使用 --user
选项启动服务器,以防服务器在启动后继续以 root
身份运行)。如果您需要提高操作系统对每个进程可用的文件描述符数量的限制,请参阅您的系统文档。
如果您运行 tcsh shell,ulimit 无法正常工作!tcsh 在您查询当前限制时还会报告不正确的值。在这种情况下,您应该使用 sh 启动 mysqld_safe。