MySQL 打开文件失败相关的错误主要有如下 3 种:
shell> perror 23 OS error code 23: File table overflow shell> perror 24 OS error code 24: Too many open files shell> perror 11 OS error code 11: Resource temporarily unavailable
这些错误通常是因为不能为 MySQL 分配足够多的文件描述符造成的。
在 MySQL 数据库里统计已经打开的文件数可以查看状态参数 Open_table_definitions 和 Open_tables ,在 MySQL 8 之后,因为没有 frm 文件,只看 Open_tables 状态参数。具体打开了哪些表可以用 show open tables; 命令进行查看。
在 OS 层查看已经打开的文件数可以用下面的命令:
ls -l /proc/`pidof mysqld`/fd|wc
要解决这些问题通常有两种方法,一种是减少 MySQL 同时打开的文件数量,例如减少参数 table_open_cache 或/和 max_connections 。
另一种方法是增加 MySQL 可以打开的文件数量。增加 MySQL 的参数 open_files_limit ,这个参数比较绕, MySQL 启动时这个参数起作用,在运行的时候系统会自动调整,会根据下面两个公式选择其中一个大的数:
10 + max_connections + (table_open_cache * 2) max_connections * 5
到 MySQL 8.0.19 版本之后就直接用操作系统的限制了,具体的设置方法要根据操作系统定,linux 是由文件 /etc/security/limits.conf 定。
检查方法是:
cat /proc/`pidof mysqld`/limits |grep "Max open files"