目前,有这么一个库,数据量虽然不大,但是表有1000多张,
show tables;
1567 rows in set (0.28 sec)
说明是1567张表;
可以用一下命令查看mysql打开的文件描述符:
lsof -u mysql|wc -l 打开了多少文件描述符
/mysql5/bin/mysqldump --default-character-set=gbk --opt dbname
> /opt/dbname.sql
的时候报错:
mysqldump: Got error: 23: Out of resources when opening file
'./dbname/tablename.MYD' (Errcode: 24) when using LOCK TABLES
Errcode: 24 意思是:
/opt/app/mysql5/bin/perror 24
OS error code 24: Too many open
files
很显然,文件系统限制了打开的文件数
下面,我们就此问题剖析下,mysql 打开文件数限制的问题
这里先介绍一个产生这一问题的非常重要的参数 “open_files_limit =
”,这个参数默认值的问题,很多地方介绍是1024,其实是这样是不准确的,那么它怎么计算出来呢:
它与 max_connections和table_open_cache的值及操作系统的 ulimit -n
的值有关即:max_os_open_files 的值。
其关系如下有:
设:
max1 = 10 +
max_connections + table_open_cache * 2
max2 =
max_connections * 5
max3 =
max_os_open_files
那么,以root用户启动mysql可配置的最小值的关系如下,如果以非root用户启动,则永远为系统能够打开的文件描述符数量(ulimit
-n)
open_files_limit =
max(max1,max2) > max3 ? max3 :
max(max1,max_2)
ps:以上公式使用mysql5.1
说了半天,还得回到开始的问题,怎么样解决?
有三个方法可以解决
1,只需要在命令行里添加一个参数 " --single-transaction " 这一选项保证同时只打开一张表
2,当然就是重新新配置 my.cnf 相应的参数,后重启服务 如上所述,根据情况修改
3,只需要在命令行里添加一个参数 --skip-lock-tables
QQ: 45899077
讨论群: 65576300