mysqldump | mysql会产生“太多打开的文件”的错误。为什么?

问题描述:

我有一个RHEL 5系统,有一个新的硬盘驱动器,我只是专用于MySQL服务器。为了让事情开始,我使用了“mysqldump --host otherhost -A | mysql”,尽管我注意到manpage从未明确推荐尝试这种方式(mysqldump到文件中是一个禁止行为,我们正在谈论500G的数据库)。mysqldump | mysql会产生“太多打开的文件”的错误。为什么?

这个过程会随机失败,抱怨打开了太多文件(在这一点mysqld获取相关信号,并死亡和重新生成)。

我试着把它放在sysctl和ulimit上,但问题依然存在。我该怎么做呢?

默认情况下,mysqldump对所有涉及的表执行每表锁定。如果有许多表可能超过mysql服务器进程的文件描述符数量。 尝试使用--skip-lock-tables或者如果锁定是强制性的 - lock-all-tables。
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

mysqldump的已报道yeld该误差较大的数据库(123)。说明和解决方法从MySQL Bugs

[2007年2月3日22:00]谢尔盖Golubchik 这是不是一个真正的错误。

默认情况下,mysqldump已启用--lock-tables,这意味着它会尝试在启动转储之前将所有表锁定为 。并且做LOCK TABLES t1,t2,...真的很大 表的数量将不可避免地耗尽所有可用的文件描述符,因为LOCK需要打开所有的 表。

解决方法:--skip-lock-tables将完全禁用这种锁定。或者, --lock-all-tables将使mysqldump使用FLUSH TABLES WITH READ LOCK,它锁定所有数据库中的所有 表(不打开它们)。在这种情况下,mysqldump将自动禁用--lock-tables,因为使用--lock-all-tables时没有意义。

编辑:请检查Dave的InnoDB的解决方法在下面的评论。

+0

或者,如果您使用的是innodb表,请尝试--single-transaction,它避免了文件句柄的运行问题以及锁定所有表 – 2008-09-17 13:52:08

如果你的数据库很大,你有几个问题。

  1. 您必须锁定表才能转储数据。

  2. mysqldump将需要非常长的时间,并且在此期间您的表格需要锁定。

  3. 导入新服务器上的数据也需要很长时间。

因为你的数据库将是基本无法使用,而#1和#2正在发生我真的建议停止数据库,并使用rsync将文件复制到其他服务器。它比使用mysqldump更快,而且比导入要快得多,因为你没有添加生成索引的IO和CPU。

在Linux上的生产环境中,许多人将Mysql数据放在LVM分区上。然后,他们停止数据库,执行LVM快照,启动数据库,并在闲暇时拷贝停止的数据库的状态。