错误信息如下:

.....
150905 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './mytest/t1.frm' (errno: 24)
150905 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './mytest/t2.frm' (errno: 24)
......
150905 13:10:17 [ERROR] Error in accept: Too many open files
....

注意到, 系统错误代号是 24, 用 perror 来查看一下具体的错误信息是什么:

[root@myplace]# /usr/local/mysql/bin/perror 24
OS error code 24: Too many open files

原来是打开文件太多了, 好办.用sysctl来调整一下就好了:

[root@myplace]# sysctl -w fs.file-max=43621
[root@mypalce]# sysctl -a | grep fs.file-max
fs.file-max = 43621

最后, 还有最重要的一点是, 修改 mysqld 的配置文件 my.cnf, 增加如下一行:

open_files_limit = 4096
#根据自己的情况适当调整,系统默认值是
# max_connections*5 或 max_connections + table_cache*2

然后, 以root身份重新启动 mysqld. 在这里, 尽管 my.cnf 中指定的运行用户不是root, 一样可以以root身份来启动mysqld, 否则 open_files_limit 选项无法生效, 因为内核限制了普通用户的最多打开文件数.

目前open file超过limit的问题:

除了socket,binlog, relay log, ibdata, logfile等这些固定需要打开的句柄以外,

剩下的各种存储引擎的数据文件的打开数量,只应该和即时的IO并发请求量有关系,和用户的请求, 压力, 多少张表没有什么关系。

所以,出现的open file太多的问题,属于代码缺陷, 目前集中在Myisam和tukodb引擎:

InnoDB引擎严格按照Innodb_open_files的设置,使用LRU管理open file,不会遇到这个问题。

flush tables,其实没有关闭文件的含义,只是mysiam的handler close接口刚好会尝试关闭MYD,MYI文件, 这个操作对InnoDB表并没有什么卵用。

分区表过多,也是属于myisam表的缺陷,分区多少也应该和open file数量没什么关系。

如何查看mysqld进程打开的文件数?

假设pid = 26206

ls /proc/26206/fd | wc -l

在MySQL中,有几个地方会存在文件描述符限制:

1、在Server层,整个mysqld实例打开文件总数超过用户进程级的文件数限制,需要检查内核 fs.file-max 限制、进程级限制 ulimit -n 及MySQL中的 open-files-limit 选项,是否有某一个超限了。任何一个条件超限了,就会抛出错误。

2、虽然Server层总文件数没有超,但InnoDB层也有限制,所有InnoDB相关文件打开总数不能超过 innodb-open-files 选项限制。否则的话,会先把最早打开的InnoDB文件描述符关闭,才能打开新的文件,但不会抛出错误,只有告警信息。

相应地,如果提示超出限制,则可以使用下面方法提高上限:
1、首先,提高内核级总的限制。执行:sysctl -w fs.file-max=3264018;

2、其次,提高内核对用户进程级的打开文件数限制。执行:ulimit -n 204800;

3、最后,适当提高MySQL层的几个参数:open-files-limit、innodb-open-files、table-open-cache、table-definition-cache。
 

1、open-files-limit
它限制了mysqld进程可持有的最大打开文件数,相当于是一个小区的总电闸,一旦超限,小区里所有住户都得停电。
5.6.7(含)以前,默认值0,最大和OS内核限制有关;
5.6.8(含)以后,默认值会自动计算,最大和OS内核限制有关。

在5.6.8及以后,其自动计算的几个限制规则见下,哪个计算结果最大就以哪个为上限:

1) 10 + max_connections + (table_open_cache * 2)
2) max_connections * 5
3) open_files_limit value specified at startup, 5000 if none

2、innodb-open-files

限制InnoDB引擎中表空间文件最大打开的数量,相当于自己家中电箱里的某个电路保险,该电路短路的话,会自动跳闸,而不会影响其他电路,去掉短路源后重新按上去就可以使用。

其值最低20,默认400,只计算了包含ibdata*、ib_logfile*、*.ibd 等三类文件,redo log不计算在内,5.6以后可独立undo log,我还未进行测试,应该也不会被计算在内,有兴趣的朋友可验证下。

3、table-definition-cache

该cache用于缓存 .frm 文件,该选项也预示着 .frm 文件同时可打开最大数量。
5.6.7 以前默认值400;
5.6.7 之后是自动计算的,且最低为400,自动计算公式:400 + (table-open-cache / 2)。

对InnoDB而言,该选项只是软性限制,如果超过限制了,则会根据LRU原则,把旧的条目删除,加入新的条目。

此外,innodb-open-files 也控制着最大可打开的表数量,和 table-definition-cache 都起到限制作用,以其中较大的为准。如果没配置限制,则通常选择 table-definition-cache 作为上限,因为它的默认值是 200,比较大。

4、table-open-cache

该cache用于缓存各种所有数据表文件描述符。
5.6.7 以前,默认值400,范围:1 – 524288;
5.6.8 – 5.6.11,默认值2000,范围:1 – 524288;
5.6.12以后,默认值2000(且能自动计算),范围:1 – 524288。

补充说明1:关于如何计算表文件描述符的建议:

table-open-cache 通常和 max-connections 有关系,建议设置为 max_connections * N,N的值为平均每个查询中可能总共会用到的表数量,同时也要兼顾可能会产生临时表。

补充说明2:MySQL会在下列几种情况把表从table cache中删掉:

1、table cache已满,并且正要打开一个新表时;
2、table cache中的条目数超过 table_open_cache 设定值,并且有某些表已经长时间未访问了; 3、执行刷新表操作时,例如执行 FLUSH TABLES,或者 mysqladmin flush-tables 或 mysqladmin refresh

补充说明3:MySQL采用下述方法来分配table cache:

1、当前没在用的表会被释放掉,从最近最少使用的表开始;
2、当要打开一个新表,当前的cache也满了且无法释放任何一个表时,table cache会临时加大,临时加大的table cache中的表不用了之后,会被立刻释放掉。
 

mysql open files的更多相关文章

  1. 解决Cannot find MySQL header files under /usr/include/mysql的错误

    按照下面的步骤能成功,亲测.转帖,做笔记 编译php-5.5-6的mysql支持,出现Cannot find MySQL header files under /usr/include/mysql. ...

  2. 编译安装php Cannot find MySQL header files under /usr/include/mysql.

    编译php-5.5-6的mysql支持,出现Cannot find MySQL header files under /usr/include/mysql. Note that the MySQL c ...

  3. 编译安装php时提示Cannot find MySQL header files的解决方法

    php的配置文件中有一行--with-mysql=/usr/local/mysql ,安装的时候提示:configure: error: Cannot find MySQL header files ...

  4. 【linux】安裝 PHP时出现error: Cannot find MySQL header files

    checking for specified location of the MySQL UNIX socket... no checking for MySQL UNIX socket locati ...

  5. linux下安装php报错configure: error: Cannot find MySQL header files under /usr/include/mysql.

    linux下安装php报错configure: error: Cannot find MySQL header files under /usr/include/mysql. 2013-03-04 1 ...

  6. 解决mysql跟php不在同一台机器上,编译安装php服务报错问题:configure: error: Cannot find MySQL header files under /application/mysql.

    在编译安装php服务时报错: configure: error: Cannot find MySQL header files under /application/mysql. Note that ...

  7. Linux / mysql: is it safe to copy mysql db files with cp command from one db to another?

    Copying is very simple for MyISAM and completely 100% risky (near suicidal) with InnoDB. From your q ...

  8. linux下编译安装php5.6出现 configure: error: Cannot find MySQL header files under /usr/local/mysql.

    #yum install gcc gcc-c++ libxml2 libxml2-devel libjpeg-devel libpng-devel freetype-devel openssl-dev ...

  9. 基于MySQL MEB的备份恢复

    MEB(MySQL Enterprise Backup)是MySQL商业版中提供的备份工具,属于物理备份. 同XtraBackup一样,mysqlbackup的使用过程同样包含如下三个步骤: 备份(- ...

随机推荐

  1. 一个IT人士的个人经历,给迷失方向的朋友

    这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能 ...

  2. javascript背景淡入淡出

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. React vs Angular 2: 冰与火之歌

    黄玄 · 3 个月前 本文译自 Angular 2 versus React: There Will Be Blood ,其实之前有人翻译过,但是翻得水平有一点不忍直视,我们不希望浪费这篇好文章. 本 ...

  4. 天灵灵,地灵灵,但愿这个一定灵!!!python调用win32api,启动应用程序窗口

    这个是逼到没办法,C#那一套,一点基本没有. 还好,网上找到例程,可以指定帐户启动进程,但愿可以摆脱WIN SERVICE启动产生的SESSION 0 隔离问题. 因为这个问题,以SERVICE启动的 ...

  5. [SQL Server 系] -- 模糊查询

    SQL Server中的通配符有下面四种 通配符 说明 % 包含零个或多个字符的任意字符串 _(下划线) 任意单个字符 [ ] 任意在指定范围或集合中的单个字符 [^ ] 任意不在指定范围或集合中的单 ...

  6. 使用getJSON()方法异步加载JSON格式数据

    使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...

  7. P1005 采药

    P1005 采药 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2005复赛普及组第三题 描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的 ...

  8. Hibernate逍遥游记-第10章 映射继承关系-003继承关系树中的每个类对应一个表(joined-subclass)

    1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...

  9. 2014--9=17 软工二班 MyEclipse blue==4

    package cn.rwkj.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputS ...

  10. 转:在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程

    本文是一篇在Myeclipse下构建Java Web项目的初级教程.图文并茂,非常详细.所用的Myeclipse版本是7.5. 第一步:新建Web Project,如下图. 第二步,在弹出的窗口填写下 ...