zoukankan      html  css  js  c++  java
  • Can't open file: (errno: 24)

        新搭建数据库,应用连接上去后,抛如下异常:
    120528 10:07:32 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './ag4_1/raa4_1.frm' (errno: 24)

    刚开始没有仔细查看错误码!还以为是文件损坏,重新导入!仍旧抛上面的错误!

    用perror工具查看具体错误!
    linux:/usr/local/mysql/bin # ./perror 24
    OS error code  24:  Too many open files
    超出最大打开文件数限制!ulimit -n查看系统的最大打开文件数是65535,不可能超出!那必然是数据库的最大打开文件数超出限制!

    在mysql里查看最大打开文件数限制命令:show variables like 'open_files_limit';
    发现该数值过小,改为2048,重启mysql,应用正常!

    在使用MySql时遇到(errcode: 24)"out of resources when opening file  ./XXX.MYD"和(error: 24)"can`t creat file ./XX.frm",通过查找资料得知,原因是打开的文件数超过打开文件数的限制。

       这两天就在查找尝试怎样修改打开文件数的限制,通过baidu,得知修改这个值得方法:修改my.ini文件里的max_connections和 table_open_cache的值,然后重起mysql 服务就ok。可以通过命令行( show variables like '%open_files_limit%'  )查看。

      

       max_connections 和 table_open_cache 与 open_files_limit 的关系:

       max_1 = 10 + max_connections + table_cache * 2;

       max_2 = max_connections * 5;

       max_3 = max_os_open_files;//操作系统单个进程最大允许打开文件句柄(文件描述符)。

      open_files_limit = max( max_1, max_2 ) > max_3 ? max_3 : max ( max_1, max_2);

      公式在MySql5.1版本测试过,(但在win7 mysql5.5中测试需要在加上一个基数2048,不知道是否还有其他配置字段?还没搞明白)

     windows 怎样更改用户句柄设置

        修改注册表 USERProcessHandleQuota

        (默认值为2710(16进制)/10000(10进制),该值的允许范围为 200 ~ 18000 ,将其调整为更多的数值。同样地,对于具有2GB或更多物理内存的系统,不妨将用户句柄数直接设置为上限 18000(10进制);) 没有测试过 :)

    MySQL引擎:MyIASM, 每打开一个文件,需要打开两个文件句柄。

     测试验证方法:

       1)修改 max_connections = 8  ;table_open_cache  = 1; 重起mysql 服务后得出 open_files_limit  = 40

       2)使用命令行执行 select * from table_1, table_2, table_3, table_4, table_5,table_6, table_7, table_8, table_9, table_10,table_11, table_12, table_13, table_14, table_15,table_16, table_17, table_18, table_19, table_20, table_21; #每个table要足够大,使得这条语句可以执行一段时间。

            这时在打开另外的命令行:show status like '%Open_files%';

            就会显示 Open_files = 42

           Open_files(42)  已经超过了open_files_limit(40) ,这时不会出error:24错误。没搞明白 :)

      3)运行一个应用程序(主要是准备表,插入数据操作),就会提示error:24的错误。

      4)重新修改 max_connections = 100  ;table_open_cache  = 512; 重起mysql 服务后得出 open_files_limit  = 1134

      5)重复第3步。不会出现error。

    测试说明了通过修改这两个参数达到增加打开文件数的限制数。

    错误信息如下:
    .....
    070813 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './yejr/access.frm' (errno: 24)
    070813 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './yejr/accesslog.frm' (errno: 24)
    ......
    070813 13:10:17 [ERROR] Error in accept: Too many open files
    ....
    注意到, 系统错误代号是 24, 用 perror 来查看一下具体的错误信息是什么:
    [root@yejr]# /usr/bin/perror 24
    OS error code  24:  Too many open files
    原来是打开文件太多了, 好办.用sysctl来调整一下就好了:
    [root@yejr]# sysctl -w fs.file-max=43621
    [root@yejr]# sysctl -a | grep fs.file-max
    fs.file-max = 43621
    FreeBSD 下也用sysctl来调整:
    [root@yejr]# sysctl -w kern.maxfiles=123280
    [root@yejr]# sysctl -a | grep kern.maxfiles
    kern.maxfiles = 123280
    最后, 还有最重要的一点是, 修改 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 选项无法生效, 因为内核限制了普通用户的最多打开文件数.
  • 相关阅读:
    Linux系统命令与权限
    有关Linux目录相关内容
    Linux的命令以及基本使用
    操作系统的基本知识与Linux系统简介
    IT知识架构与操作系统简介
    windows下nginx支持php的配置
    提权操作函数
    c++内存中字节对齐问题详解 [ 转载 ]
    STL 容器效率的对比
    C++ 四种类型转换的介绍
  • 原文地址:https://www.cnblogs.com/end/p/2890018.html
Copyright © 2011-2022 走看看