1.版本

1)操作系统

 cat /etc/issue
cat /etc/issue
CentOS release 6.6 (Final)

cat /proc/version
Linux version 2.6.32-504.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014

2)mysql数据库版本

mysql --version
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1


2.问题描述

   2.1在mysqldump 导出数据的时候报如下错误

mysqldump -uroot -p -S /var/lib/data/mysql.sock --all-databases --events --routines>database_3307_20151218.sql
Enter password: 
mysqldump: Got error: 23: Out of resources when opening file './helloworld/xxxxx_0479.MYD' (Errcode: 24) when using LOCK TABLES
   2.2查看数据库的errorlog发现如下错误:

151217 19:35:48 [ERROR] /usr/libexec/mysqld: Can't open file: './helloworld/txxxxx_0479.frm' (errno: 24)
   2.3使用perror 查看一下错误代码24是什么意思

perror 24
OS error code  24:  Too many open files
##到这问题就很清楚了,是 同时打开的文件数目超过了open_files_limit的限制。我们看一下我2.1中的mysqldump语句,没有指定--single-transaction,也没有指定--lock-tables,所以 默认使用lock-all-tables参数进行备份(该参数在备份的时候会使用一个全局的read lock锁住当前实例上所有库的所有表),因为该实例上库比较多,而且还有很多分表,所以导出报Too many open files错误。

  2.4查看数据库的open_files_limit限制

show variables like 'open_files%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1024  |
+------------------+-------+
1 row in set (0.00 sec)

  2.5 查看数据库打开表的数量

show global status like '%file%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| Com_show_profile  | 0        |
| Com_show_profiles | 0        |
| Created_tmp_files | 349      |
| Open_files        | 2        |
| Opened_files      | 41578793 |
+-------------------+----------+
5 rows in set (0.00 sec)
##我们看到我查看这一刻 open_files为349(注意这不是报错时候查询的值)

3.问题解决

3.1 可以加大数据库的open_files_limit

   可以调大该参数(该参数不能动态调整),然后再次尝试导出


3.2 mysqldump导出时使用 --single-transaction或者--lock-tables参数

导出正常




Logo

更多推荐